delphi - 从内存流读取多个位图

标签 delphi

我需要一些有关 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/

相关文章:

windows - Delphi SaveDialog 不显示

Delphi增量变化?从 D7 到 D2009

delphi - 为什么 CMD/Cygwin shell 在 WinExec 之后不返回?

Delphi XE2 64 位客户端连接到 Firebird 2.5

delphi - 如何在设计表单时保持控件可见

Delphi Graphics32 在图层上绘制透明椭圆

Delphi:实际参数和形式参数的类型必须相同

delphi - 处理包含 "Ctrl"的热键后 SendInput 失败

delphi - 类名后面的尖括号在变量声明中意味着什么?

c# - 如何在 Delphi 中检测通用 Windows 平台 (UWP)