GDI+保存图片时使用原路径为何不行?

fisher_older 2010-09-17 10:08:28
procedure TFormBrowse.Button1Click(Sender: TObject);
var
encoderClsid: TGUID;
stat: TStatus;
Image: TGPImage;
begin
Image := TGPImage.Create('GrapeBunch.bmp');

// Get the CLSID of the PNG encoder.
GetEncoderClsid('image/bmp', encoderClsid);
stat := image.Save('GrapeBunch.bmp', encoderClsid, nil);

if(stat = Ok) then
memo1.Lines.Add('GrapeBunch.bmp was saved successfully')
else
memo1.Lines.Add(format('Failure: stat = %s', [GetStatus(stat)]));

image.Free;
end;


结果:Failure: stat = Win32Error

哪位大侠能否告诉怎么回事啊?为什么不能覆盖原文件?
...全文
135 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dinoalex 2010-09-18
  • 打赏
  • 举报
回复
A用于导入,STREAM传给B后后,FREE掉. B再写. 这样子试试

mdejtod 2010-09-18
  • 打赏
  • 举报
回复
因为在使用中
fisher_older 2010-09-18
  • 打赏
  • 举报
回复
那么如果想覆盖原文件,该怎么办?
fisher_older 2010-09-18
  • 打赏
  • 举报
回复
不过我不用ActiveX也行啊?为什么必须用ActiveX?
fisher_older 2010-09-18
  • 打赏
  • 举报
回复
搞定!非常感谢!给分了。
dinoalex 2010-09-18
  • 打赏
  • 举报
回复
TIFF 测过,可行, 记得USES上ActiveX单元
dinoalex 2010-09-18
  • 打赏
  • 举报
回复
忘记把那个多余IMAGE1的删除了


procedure TForm1.Button1Click(Sender: TObject);
var
encoderClsid: TGUID;
stat: TStatus;
Image: TGPImage;
s: IStream;
ms: tmemorystream;
begin
GetEncoderClsid('image/png', encoderClsid);
ms:= TMemoryStream.Create;
ms.LoadFromFile('GrapeBunch.bmp');
s := TStreamAdapter.Create(ms);
image:= TGPImage.Create(s);
stat := image.Save('GrapeBunch.bmp', encoderClsid, nil);
ms.Free;
image.Free;
s:= nil;
if(stat = Ok) then
memo1.Lines.Add('GrapeBunch.bmp was saved successfully')
else
memo1.Lines.Add(format('Failure: stat = %s', [GetStatus(stat)]));
end;
dinoalex 2010-09-18
  • 打赏
  • 举报
回复

procedure TForm1.Button1Click(Sender: TObject);
var
encoderClsid: TGUID;
stat: TStatus;
Image1,Image2: TGPImage;
s: IStream;
ms: tmemorystream;
begin
Image1 := TGPImage.Create('B.bmp');
GetEncoderClsid('image/png', encoderClsid);
image1.Free;
ms:= TMemoryStream.Create;
ms.LoadFromFile('B.bmp');
s := TStreamAdapter.Create(ms);
image2:= TGPImage.Create(s);
stat := image2.Save('B.bmp', encoderClsid, nil);
ms.Free;
image2.Free;
s:= nil;
if(stat = Ok) then
memo1.Lines.Add('GrapeBunch.bmp was saved successfully')
else
memo1.Lines.Add(format('Failure: stat = %s', [GetStatus(stat)]));
end;
fisher_older 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dinoalex 的回复:]
A用于导入,STREAM传给B后后,FREE掉. B再写. 这样子试试
[/Quote]

请教dinoalex,具体该怎么做?
fisher_older 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mdejtod 的回复:]
改为 GetEncoderClsid('image/tiff', encoderClsid);
[/Quote]

改过了,不行的。
mdejtod 2010-09-18
  • 打赏
  • 举报
回复
没看到多页的。多页的没研究过
mdejtod 2010-09-18
  • 打赏
  • 举报
回复
改为 GetEncoderClsid('image/tiff', encoderClsid);
fisher_older 2010-09-18
  • 打赏
  • 举报
回复
尝试用另一个TGPImage进行克隆(Img2.Clone)也不行啊,怎么办呢?
fisher_older 2010-09-18
  • 打赏
  • 举报
回复
感谢!但是还有一个问题,麻烦大虾们再帮忙思考一下。
以上方法对bmp等格式当然是适用的,但是对于多页的tif文件,却不适用。
如果我现在需要覆盖原tif图片,应该怎么做?
mdejtod 2010-09-18
  • 打赏
  • 举报
回复

procedure TFormBrowse.Button1Click(Sender: TObject);
var
encoderClsid: TGUID;
stat: TStatus;
Image: TGPBitmap;
BmpSave : TGPBitmap;
Gd : TGpGraphcis;
begin
Image := TGPImage.Create('GrapeBunch.bmp');
BmpSave := TGpBitmap.Create(Image.GetWidth,Image.GetHeight,Image.GetPixelFormat);
Gd := TGpGraphics.Create(BmpSave);
Gd.DrawImage(Image,0,0);
freeandnil(Gd);
Freeandnil(Image);

// Get the CLSID of the PNG encoder.
GetEncoderClsid('image/bmp', encoderClsid);
stat := BmpSave.Save('GrapeBunch.bmp', encoderClsid, nil);
Freeandnil(BmpSave);
if(stat = Ok) then
memo1.Lines.Add('GrapeBunch.bmp was saved successfully')
else
memo1.Lines.Add(format('Failure: stat = %s', [GetStatus(stat)]));
end;
fisher_older 2010-09-18
  • 打赏
  • 举报
回复
感谢楼上兄弟,能否详细一点?能写一点简单的代码最好了。

1,185

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧