打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何让 TGPImage 直接从流中加载图片?

问题来源: http://www.cnblogs.com/del/archive/2009/01/23/1232856.html#post

方法一:

Delphi 的 TBitmap 类可以方便地操作流, 如果能让 TGPImage 和 TBitmap 沟通起来就好了;
TGPImage 有一个子类 TGPBitmap 可以和 TBitmap 沟通... ok 了!

代码如下:
uses GDIPOBJ, GDIPAPI;procedure TForm1.FormPaint(Sender: TObject);const  ImgPath = 'c:\temp\test.bmp';var  img: TGPImage;  bit: TBitmap;  g: TGPGraphics;begin  bit := TBitmap.Create;  bit.LoadFromFile(ImgPath); {因为 TBitmap 操作流特别方便, 这里就没有演示}  img := TGPBitmap.Create(bit.Handle, bit.Palette);  g := TGPGraphics.Create(Canvas.Handle);  g.DrawImage(img, 0, 0);  g.Free;  bit.Free;  img.Free;end;

方法二:

TGPImage 需要的是 IStream 而非 TStream, 直接给它一个 IStream 参数不就完了?
那怎么实现 IStream 接口呢? Classes 单元下有一个 TStreamAdapter 类就是专门实现 IStream 接口的.
uses GDIPOBJ, GDIPAPI;procedure TForm1.FormPaint(Sender: TObject);const  ImgPath = 'c:\temp\test.bmp';var  img: TGPImage;  MemStream: TMemoryStream;  MyIStream: TStreamAdapter;  g: TGPGraphics;begin  MemStream := TMemoryStream.Create;  MemStream.LoadFromFile(ImgPath);  MyIStream := TStreamAdapter.Create(MemStream);  img := TGPImage.Create(MyIStream);  g := TGPGraphics.Create(Canvas.Handle);  g.DrawImage(img, 0, 0);  g.Free;  img.Free;  MemStream.Free;  MyIStream := nil; {注意这里}end;

注意 TStreamAdapter 的本质还是个接口, 只能 MyIStream := nil; 而不能 MyIStream.free;
如果这样写可能会容易理解一些, 不过要多 uses 一个 ActiveX 单元:
uses GDIPOBJ, GDIPAPI, ActiveX;procedure TForm1.FormPaint(Sender: TObject);const  ImgPath = 'c:\temp\test.bmp';var  img: TGPImage;  MemStream: TMemoryStream;  MyIStream: IStream; {这里和上面不同}  g: TGPGraphics;begin  MemStream := TMemoryStream.Create;  MemStream.LoadFromFile(ImgPath);  MyIStream := TStreamAdapter.Create(MemStream);  img := TGPImage.Create(MyIStream);  g := TGPGraphics.Create(Canvas.Handle);  g.DrawImage(img, 0, 0);  g.Free;  img.Free;  MemStream.Free;  MyIStream := nil;end;

TStreamAdapter.Create 方法还有一个 TStreamOwnership 类型的默认参数, 默认值是 soReference;
如果改为 soOwned, 那连 MyIStream := nil; 也不需要了; 因为和 MyIStream 关联的对象会一同释放它.
uses GDIPOBJ, GDIPAPI;procedure TForm1.FormPaint(Sender: TObject);const  ImgPath = 'c:\temp\test.bmp';var  img: TGPImage;  MemStream: TMemoryStream;  MyIStream: TStreamAdapter;  g: TGPGraphics;begin  MemStream := TMemoryStream.Create;  MemStream.LoadFromFile(ImgPath);  MyIStream := TStreamAdapter.Create(MemStream, soOwned);  img := TGPImage.Create(MyIStream);  g := TGPGraphics.Create(Canvas.Handle);  g.DrawImage(img, 0, 0);  g.Free;  img.Free;  MemStream.Free;//  MyIStream := nil; {此时如果有这句会出错}end;

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Delphi中保存图像列表
用 Puppeteer 把繁琐工作给自动化了,太爽啦!
delphi locate 定位记录
Delphi GDI 文本输出
免费网摘代码
asp.net动态添加换行
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服