gpt4 book ai didi

delphi - 如何从 32 bpp 的 TBitmap 实例创建 alpha 混合图标/光标(间接),而不创建临时 DIB 部分?

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

根据MS KB entryCreateIconIndirect 有一个怪癖它识别 HBITMAP s 是用 BITMAPV5HEADER 创建的传递至CreateDIBSection (以及 BGRA channel 布局)。

但是,TBitmap具有 (PixelFormat = pf32bit) and (AlphaFormat = afDefined) 的实例(作为用于其他目的的 alpha 混合)当由其 Handle 引用时s 未被识别为用于创建图标或光标的有效 alpha 混合位图。

目前,我必须使用描述的 API 调用 ( see ) 创建 TBitmap 的完整副本,以创建 CreateIconIndirect接受 alpha 混合的位图句柄。我该如何克服这种笨拙?

最佳答案

这是一个例子:

procedure TForm1.Button1Click(Sender: TObject);
const
crAlpha = TCursor(-25);
var
Bmp: TBitmap;
Px: PRGBQuad;
X, Y: Integer;

BmpMask: TBitmap;
II: TIconInfo;
AlphaCursor: HCURSOR;
begin
Bmp := TBitmap.Create;
Bmp.PixelFormat := pf32bit;
Bmp.Canvas.Brush.Color := clWhite;
Bmp.SetSize(32, 32);
Bmp.Canvas.Font.Style := [fsBold];
Bmp.Canvas.Font.Color := clRed;
Bmp.Canvas.TextOut(1, 10, 'alpha');

for Y := 0 to (Bmp.Height - 1) do
begin
Px := Bmp.ScanLine[Y];
for X := 0 to (Bmp.Width - 1) do begin
if DWORD(Px^) = DWORD(clWhite) then
Px.rgbReserved := $00
else
Px.rgbReserved := $FF;
Inc(Px);
end;
end;

BmpMask := TBitmap.Create;
BmpMask.SetSize(Bmp.Width, Bmp.Height);

II.fIcon := False;
II.xHotspot := 32;
II.yHotspot := 32;
II.hbmMask := BmpMask.Handle;
II.hbmColor := Bmp.Handle;

AlphaCursor := CreateIconIndirect(II);
Win32Check(AlphaCursor <> 0);
BmpMask.Free;
Bmp.AlphaFormat := afDefined; // AlphaBlend below, premultiply channels
Canvas.Draw(0, 0, Bmp); // test draw
Bmp.Free;

Screen.Cursors[crAlpha] := AlphaCursor;
Cursor := crAlpha;

end;


sample image (顶部的“alpha”是测试绘制,另一个是光标)

关于delphi - 如何从 32 bpp 的 TBitmap 实例创建 alpha 混合图标/光标(间接),而不创建临时 DIB 部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13109267/

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