程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Delphi 在另一个图像上绘制 png 文件的一部分大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Delphi 在另一个图像上绘制 png 文件的一部分?

开发过程中遇到Delphi 在另一个图像上绘制 png 文件的一部分的问题如何解决?下面主要结合日常开发的经验,给出你关于Delphi 在另一个图像上绘制 png 文件的一部分的解决方法建议,希望对你解决Delphi 在另一个图像上绘制 png 文件的一部分有所启发或帮助;

我正在使用此函数在特定位置的 @R_419_5411@ 上绘制 png:

procedure TForm1.PlacePNG(nam: String; px,py: Integer);
var
  vPic: TPicture;
  vSrc: TGraphic;
begin
  vPic := TPicture.Create;
  try
    vPic.LoadFromfile(Nam);
    vSrc := vPic.Graphic;
    Image1.Canvas.Draw(px,py,vSrc);
  finally
    vPic.Free;
  end;
end;

我的问题:使用 png 文件的部分做到这一点的最佳方法是什么,同时又不失去其透明度?

解决方法

这是一个有趣的问题!

当然,绘制整个 PNG 是微不足道的:

procedure TForm1.FormCreate(Sender: TObject);
var
  bg,fg: TPngImage;
begin

  bg := TPngImage.Create;
  try
    bg.LoadFromFile('K:\bg.png');
    fg := TPngImage.Create;
    try
      fg.LoadFromFile('K:\fg.png');
      Image1.Picture.Graphic := bg;
      Image2.Picture.Graphic := fg;
      fg.Draw(bg.Canvas,Rect(0,fg.Width,fg.Height));
      Image3.Picture.Graphic := bg;
    finally
      fg.Free;
    end;
  finally
    bg.Free;
  end;

end;

Delphi 在另一个图像上绘制 png 文件的一部分

要仅绘制一部分,一种可能的解决方案是获取 32-bpp RGBA 位图形式的图像,然后使用 Windows API,特别是 AlphaBlend 函数:

procedure TForm1.FormCreate(Sender: TObject);
var
  bg,fg: TPngImage;
  bgbm,fgbm: TBitmap;
  BlendFunction: TBlendFunction;
begin

  // Load BACkground PNG
  bg := TPngImage.Create;
  try

    bg.LoadFromFile('K:\bg.png');

    // Load foreground PNG
    fg := TPngImage.Create;
    try

      fg.LoadFromFile('K:\fg.png');

      // Preview BACkground and foreground
      Image1.Picture.Graphic := bg;
      Image2.Picture.Graphic := fg;

      // Create BACkground BMP
      bgbm := TBitmap.Create;
      try

        bgbm.Assign(bg);

        // Create foreground BMP
        fgbm := TBitmap.Create;
        try

          fgbm.Assign(fg);

          // Blend PART OF foreground BMP onto BACkground BMP
          BlendFunction.blendop := AC_SRC_OVER;
          BlendFunction.blendFlags := 0;
          BlendFunction.sourceConstantAlpha := 255;
          BlendFunction.AlphaFormat := AC_SRC_ALPHA;
          if not Winapi.Windows.AlphaBlend(
            bgbm.Canvas.Handle,100,200,fgbm.Canvas.Handle,BlendFunction
          ) then
            RaiseLastOSError;

          // Preview result
          Image3.Picture.Graphic := bgbm;

        finally
          fgbm.Free;
        end;

      finally
        bgbm.Free;
      end;

    finally
      fg.Free;
    end;

  finally
    bg.Free;
  end;

end;

Delphi 在另一个图像上绘制 png 文件的一部分

大佬总结

以上是大佬教程为你收集整理的Delphi 在另一个图像上绘制 png 文件的一部分全部内容,希望文章能够帮你解决Delphi 在另一个图像上绘制 png 文件的一部分所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:png