gpt4 book ai didi

image - 如何在 Delphi 中将图像的一部分复制到另一个图像中而不丢失透明度

转载 作者:行者123 更新时间:2023-12-03 18:31:21 25 4
gpt4 key购买 nike

这是我的代码,我有一个背景图片宽度:245 和高度:150 和一个 128x128 的 png 图片,所以我将部分 png 图片复制到背景图片中。

我也有这个信息:

dstX = 目标点的 x 坐标。

dstY = 目标点的 y 坐标。

srcX = 源点的 x 坐标。

srcY = 源点的 y 坐标。

srcW = 源宽度。

srcH = 源高度。

我尝试像这样使用 copyRect

procedure TMyClass.FillImage;
var
bg,png: TPngImage;
dstX,dstY,srcW,srcH,srcX,srcY: Integer;
begin
bg := TPngImage.CreateBlank(COLOR_RGB,8,245,150);
png := TPngImage.Create;
png.LoadFromFile('C:\temp\example.png');
dstX := 10;dstY:=0;srcW:=0;srcH:=118;srcX:=128;srcY:=10;
bg.Canvas.CopyRect(Rect(dstX,dstY,srcW,srcH),png.Canvas,Rect(srcX,srcY,png.Width,png.Height));

//With this values not working, I have the same result as before, should start copy in position 138 of bg.
dstX := 138;dstY:=0;srcW:=0;srcH:=118;srcX:=10;srcY:=10;
bg.Canvas.CopyRect(Rect(dstX,dstY,srcW,srcH),png.Canvas,Rect(srcX,srcY,png.Width,png.Height));
end;

使用 CopyRect,我有两个问题。
  • 当 destX 大于 png 图片时,它不会在背景图片 bg 内的正确位置开始复制。这是主要问题。
  • 我丢失了透明胶片。

  • 背景图片一开始不必是png格式,因为它是在开始时创建的,只有宽度和高度,但最后必须保存为png。

    我搜索了这个问题,首先将图像png复制到bg中我尝试了这个,但没有成功:

    http://www.delphitricks.com/source-code/graphic/copy_part_of_one_image_to_another.html

    然后对于我阅读的透明度问题

    Alphablend and TransparentBltWhy am I losing transparency when calling BitBlt or CopyRect?

    但在我的情况下是不同的,因为我没有使用你可以看到的画框,而是使用 png 图像,我将这个图像的一部分复制到另一个图像中,其中包含我上面提供的信息。但也许这篇文章可以激励某人帮助我。

    最佳答案

    由于从 Delphi XE2 Delphi 开始就支持 GDI+,没有外部单元,最简单的方法可能是由于 alpha channel 的限制而忽略 GDI,直接使用 GDI+ 的可能性。
    只需为您的目标 PNG 创建所需大小的 TGPBitmap。
    创建提供您要绘制的 (PNG) 文件的 TGPImages。
    使用以 TGPBitmap 作为目标创建的 TGPGraphics 绘制这些图像,并根据需要在所需位置绘制图像,宽度/高度随心所欲,GDIPOBJ 中有许多用于具有描述性参数命名的 DrawImage 的重载。
    按 mime 类型(例如 image/bmp、image/jpeg、image/gif、image/tiff、image/png)选择您的编码器并使用此编码器保存文件。

    一个简短的例子:

    uses PNGImage, GDIPOBJ, GDIPAPI, GDIPUTIL;

    const
    C_FileName1 = 'C:\temp\red.png';
    C_FileName2 = 'C:\temp\Yellow.png';

    procedure TDemo.Button1Click(Sender: TObject);
    var
    gp: TGPGraphics;
    bg: TGpImage;
    gi1: TGpImage;
    gi2: TGpImage;
    encoderClsid: TGuid;
    begin
    bg := TGPBitmap.Create(256, 150);
    try
    gi1 := TGpImage.Create(C_FileName1);
    try
    gi2 := TGpImage.Create(C_FileName2);
    try
    gp := TGPGraphics.Create(bg);
    try
    gp.DrawImage(gi1, 0, 0, 140, 140);
    gp.DrawImage(gi2, 20, 20, 30, 30);
    gp.DrawImage(gi2, 70, 70, 50, 50);
    // Take one of many overloads to crop the image as desired
    //function DrawImage(image: TGPImage; x, y, srcx, srcy, srcwidth, srcheight: Single; srcUnit: TUnit): TStatus; overload;
    gp.DrawImage(gi2, 150, 30, 60, 40, 60, 80, UnitPixel);
    //function TGPGraphics.DrawImage(image: TGPImage; const destRect: TGPRectF; srcx, srcy, srcwidth, srcheight: Single; srcUnit: TUnit; imageAttributes: TGPImageAttributes = nil; callback: DrawImageAbort = nil; callbackData: Pointer = nil): TStatus;
    gp.DrawImage(gi2, DestRect , 60, 40, 60, 80, UnitPixel);
    finally
    gp.Free
    end;
    GetEncoderClsid('image/png', encoderClsid);
    bg.Save('C:\temp\test.png', encoderClsid, nil);
    Image1.Picture.LoadFromFile('C:\temp\test.png');
    finally
    gi2.Free
    end;
    finally
    gi1.Free
    end;
    finally
    bg.Free;
    end;
    end;

    enter image description here

    由于 TGPGraphics 可以在每个 Canvas 上使用 (TGPGraphics.Create(aCanvas.Handle)),因此了解 GDIPOBJ、GDIPAPI、GDIPUTIL 可能会很有趣。

    关于image - 如何在 Delphi 中将图像的一部分复制到另一个图像中而不丢失透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27818545/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com