Direct2D (9) : 显示图像


uses Direct2D;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  wic: TWICImage;
  R: TRect;
begin
  wic := TWICImage.Create;
  wic.LoadFromFile('C:\Temp\Test.png');

  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  cvs.BeginDraw;

  cvs.Draw(10, 10, wic);

  R := Bounds(wic.Width div 2 + 10, wic.Height div 2 + 10, wic.Width div 2, wic.Height div 2);
  cvs.StretchDraw(R, wic, 192);

  cvs.EndDraw;
  cvs.Free;
  wic.Free;
end;


效果图:

26153800_526L.png

用较原始的办法重做上面的例子(通过 wic):

uses Direct2D, D2D1, Wincodec, ActiveX;

{从指定文件建立 ID2D1Bitmap 对象的函数}
function GetD2D1Bitmap(RenderTarget: ID2D1RenderTarget; imgPath: string): ID2D1Bitmap;
var
  iWicFactory: IWICImagingFactory;
  iWICDecoder: IWICBitmapDecoder;
  iWICFrameDecode: IWICBitmapFrameDecode;
  iFormatConverter: IWICFormatConverter;
begin
  {获取建立 WIC 的工厂}
  CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, iWicFactory);
  {打开并获取解码后的对象}
  iWicFactory.CreateDecoderFromFilename(PWideChar(imgPath), GUID_NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, iWICDecoder);
  {获取第一帧}
  iWicDecoder.GetFrame(0, iWICFrameDecode);
  {获取格式转换器}
  iWicFactory.CreateFormatConverter(iFormatConverter);
  {转换到与 D2D 兼容的格式}
  iFormatConverter.Initialize(iWICFrameDecode, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nil, 0, WICBitmapPaletteTypeMedianCut);
  {获取 ID2D1Bitmap}
  RenderTarget.CreateBitmapFromWicBitmap(iFormatConverter, nil, Result);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  iBitmap: ID2D1Bitmap;
  fRect: TD2DRectF;
  fSize: TD2DSizeF;
begin
  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  iBitmap := GetD2D1Bitmap(cvs.RenderTarget, 'C:\Temp\Test.png');

  iBitmap.GetSize(fSize);
  fRect := D2D1RectF(0, 0, fSize.width, fSize.height);
  cvs.BeginDraw;
  cvs.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation(10, 10));
  cvs.RenderTarget.DrawBitmap(iBitmap, @fRect);

  fRect := D2D1RectF(0, 0, fSize.width/2, fSize.height/2);
  cvs.RenderTarget.SetTransform(TD2DMatrix3x2F.Translation(fRect.right+10, fRect.bottom+10));
  cvs.RenderTarget.DrawBitmap(iBitmap, @fRect, 0.75);

  cvs.EndDraw;
  cvs.Free;
end;


转载于:https://my.oschina.net/hermer/blog/320556

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值