gpt4 book ai didi

delphi - 绘制透明缩放PNG

转载 作者:行者123 更新时间:2023-12-03 15:56:16 24 4
gpt4 key购买 nike

我有一个大的 (300x300px) PNG 图像,需要重新缩放。在另一个SO question为了更好地缩放,我阅读了有关 StretchBltHALFTONE 的内容。

我的问题是如何将 PNG 图像绘制为透明,或者至少将黑色角涂成白色?

enter image description here

正如您在附图中看到的那样,我得到了黑色的角。

这是原始图像: enter image description here这是我到目前为止所尝试过的。

unit MainU;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TFormMain = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormMain: TFormMain;

implementation

{$R *.dfm}
uses
Pngimage;

type
TIRButton = class(TImage)
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
end;

TGraphicControlAcess = class(TGraphicControl);
TGraphicAcess = class(TGraphic);

THalfTonePngImage = class(TPngImage)
protected
procedure Draw(ACanvas: TCanvas; const Rect: TRect); override;
end;

{ TIRButton }

constructor TIRButton.Create(AOwner: TComponent);
begin
inherited;
Center := True;
Proportional := True;
end;

procedure TIRButton.Paint;
var
ParentCanvas: TCanvas;
begin
ParentCanvas := TGraphicControlAcess(Self).Canvas;
TGraphicAcess(Picture.Graphic).Draw(ParentCanvas, DestRect);
end;

{ THalfTonePngImage }

procedure THalfTonePngImage.Draw(ACanvas: TCanvas; const Rect: TRect);
var
p: TPoint;
dc: HDC;
begin
dc := ACanvas.Handle;
GetBrushOrgEx(dc, p);
SetStretchBltMode(dc, HALFTONE);
SetBrushOrgEx(dc, p.X, p.Y, @p);

ACanvas.Brush.Color := clWhite;
ACanvas.FillRect(Classes.Rect(0, 0, Width, Height));

StretchBlt(
dc, 0, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top,
Canvas.Handle, 0, 0, Width, Height, ACanvas.CopyMode
);
end;

procedure TFormMain.FormCreate(Sender: TObject);
var
Image: THalfTonePngImage;
begin
Image := THalfTonePngImage.Create;
Image.LoadFromFile('X200IR_11_EmgBrake.png');

with TIRButton.Create(Self) do
begin
Width := 100;
Height := 100;
Picture.Assign(Image);
Parent := Self;
Anchors := [akLeft, akTop, akRight, akBottom];
end;

Image.Free;
end;

end.

最佳答案

源图像的角是透明的。由于白色背景,它在正确的图像中不可见。 StretchBlt 不支持透明度。由于没有,透明像素与黑色无法区分。 (如果 ARGB 颜色为 FF 00 00 00 并且我们删除了 Alpha channel ,则剩下 00 00 00)

您需要使用TransparentBlt .

作为引用,这是放置在绿色背景上的图像。它使您更容易看到透明度。

enter image description here

关于delphi - 绘制透明缩放PNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32881719/

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