delphi -- GDi+ Delphi如何让 TGPImage 直接从流中加载图片


本文整理自网络,侵删。

 方法一: 


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; 

 

来源:https://www.ablanxue.com/prone_6918_1.html

相关阅读 >>

Delphi trect的宽和高

Delphi 操作前,删除前,覆盖前,询问对话框

Delphi xe 版本 示例原码下载

Delphi xe3里判断网络是否连接成功

Delphi 如何在twebbrowsers之间传递数据

Delphi cardpanel1 简单的切换

Delphi shellexecute openurl 的跨平台实现

Delphi indy 10.5.7的数据发送接收的用法

Delphi 检查声卡是否安装

Delphi fmx 同时使用longtap和tap

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...