我需要一些有关 Delphi 位图和内存流的帮助。 我只是摆弄 Debenu PDF 库,应该将 pdf 页面渲染为 BMP,然后将它们读回图像组件:
var
Image1: TImage;
Image2: TImage;
PDF: TDebenuPDFLibrary;
MS: TMemoryStream;
procedure TForm1.Button1Click(Sender: TObject);
begin
PDF.LoadFromFile('D:/something.pdf','');
MS:=TMemoryStream.Create;
PDF.RenderPageToStream(72,1,0,MS);
MS.Position:= 0;
Image1.Picture.Bitmap.LoadFromStream(MS);
Image1.Repaint;
MS.Free;
end;
它有效,到目前为止一切顺利! 但是当我尝试加载多个图像时,我会收到运行时消息:
"Stream read error"
我正在尝试的代码:
var
Image1: TImage;
Image2: TImage;
PDF: TDebenuPDFLibrary; //To render PDF to bitmaps
MS: TMemoryStream;
procedure TForm1.Button1Click(Sender: TObject);
begin
PDF.LoadFromFile('D:/something.pdf','');
MS:=TMemoryStream.Create;
PDF.RenderPageToStream(72,1,0,MS); //First page
PDF.RenderPageToStream(72,2,0,MS); //Second page
MS.Position:= 0;
Image1.Picture.Bitmap.LoadFromStream(MS);
Image1.Repaint;
Image2.Picture.Bitmap.LoadFromStream(MS);
Image2.Repaint;
MS.Free;
end;
有什么帮助吗?
最佳答案
如果要从单个源流加载多个图像,最好在流中分隔图像,然后为每个加载使用单独的流。这使得流数据中一个图像结束和下一个图像开始的位置非常清楚。例如:
procedure RenderPDFToStream(PDF: TDebenuPDFLibrary; Page: Integer; Stream: TStream);
var
MS: TMemoryStream;
Size: Integer;
begin
MS := TMemoryStream.Create;
try
PDF.RenderPageToStream(72, Page, 0, MS);
Size := MS.Size;
Stream.WriteBuffer(Size, SizeOf(Size));
if Size > 0 then
Stream.CopyFrom(MS, Size);
finally
MS.Free;
end;
end;
procedure LoadBitmapFromStream(Stream: TStream; Bitmap: TBitmap);
var
MS: TMemoryStream;
Size: Integer;
begin
MS := TMemoryStream.Create;
try
Stream.ReadBuffer(Size, SizeOf(Size));
if Size > 0 then
MS.CopyFrom(Stream, Size);
MS.Position := 0;
Bitmap.LoadFromStream(MS);
finally
MS.Free;
end;
end;
var
Image1: TImage;
Image2: TImage;
PDF: TDebenuPDFLibrary; //To render PDF to bitmaps
procedure TForm1.Button1Click(Sender: TObject);
var
MS: TMemoryStream;
begin
PDF.LoadFromFile('D:/something.pdf','');
MS := TMemoryStream.Create;
try
RenderPDFToStream(PDF, 1, MS);
RenderPDFToStream(PDF, 2, MS);
MS.Position := 0;
LoadBitmapFromStream(MS, Image1.Picture.Bitmap);
LoadBitmapFromStream(MS, Image2.Picture.Bitmap);
finally
MS.Free;
end;
end;
关于delphi - 从内存流读取多个位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25240813/