问题:
    想打开一份TIF图片文件,然后直接在往这份文件里插入新的页。
目前代码如下:procedure TForm1.Button1Click(Sender: TObject);
// 将单个图像合并为多帧图像,GDI+不支持GIF合成,只能合并为tiff格式
var
  Parameters: TEncoderParameters;
  Value: TEncoderValue;
  Img, tmp: TGpImage;
  I: Integer;
  Clsid: TClsid;
begin
  // 下面设置自定义的编码参数,这里为1个参数
  Parameters.Count := 1;
  // 设置参数唯一标志的GUID,这里为保存标记
  Parameters.Parameter[0].Guid := EncoderSaveFlag;
  Parameters.Parameter[0].NumberOfValues := 1;
  Parameters.Parameter[0].ValueType := EncoderParameterValueTypeLong;
  // 设置参数的值。这里只把Value地址赋给了参数值,Value在后面具体赋值
  Parameters.Parameter[0].Value := @Value;  // 打开第一个图像,这里的图像是前面代码分解后保存的jpg文件
  Img := TGpImage.Create('Hb0.jpg');
  try
    // 获取图像格式tiff编码器的ClsID
    GetEncoderClsid('image/tiff', Clsid);
    // 在保存第一帧图像时,编码参数值设置为多帧
    Value := EncoderValueMultiFrame;
    // 保存第一帧图像
    Img.Save('Hb.tif', Clsid, @Parameters);
    // 保存随后的各帧图像时,编码参数值设置为维度页
    Value := EncoderValueFrameDimensionPage;    // 依次打开后面的图像,保存到Hb.tif文件,本例图片为24帧
    for I := 1 to 23 do
    begin
      tmp := TGpImage.Create('Hb' + IntToStr(I) + '.jpg');
      try
        Img.SaveAdd(tmp, @Parameters);
      finally
        tmp.Free;
      end;
    end;
  finally
    Img.Free;
  end;  
end;以上代码的本质是每次保存TIF文件时都是把所有的帧全保存一次,这样会带来一个很严重的问题,就是当这个TIFF内有数十帧图片时,这个TGpImage对象的内存占疯狂增长,然后报out of memory 错误 。非常郁闷。如果每一帧的图片都比较大时,程序报错的机率非常的高。希望所有大、中、小虾们都给点意见,顶者有分!,

解决方案 »

  1.   

    本来以为自己对GDI+比较熟悉,看到楼主的问题后,我才发现自己的无知。再等等吧,期待高手。顶!
      

  2.   

    img能否每保存一帧时才创建,保存完后再释放,如此循环
      

  3.   

    你用的那段代码恰好是俺写的,几天前看到你这个贴,我也反复试过,结论是使用GDI+不能在一个已经存在的TIF文件中插入新的页,只能一次性完成。不过,如果能搞清楚TIF文件的结构,可以自己写代码往里插的,只是没有这方面的资料。