加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何从32 bpp的TBitmap实例创建alpha混合图标/光标(间

发布时间:2020-12-15 09:20:22 所属栏目:大数据 来源:网络整理
导读:根据 MS KB entry,CreateIconIndirect中存在一个怪癖,它识别HBITMAP是通过传递给CreateDIBSection(和BGRA通道布局)的BITMAPV5HEADER创建的. 但是,当其句柄引用时,具有(PixelFormat = pf32bit)和(AlphaFormat = afDefined)(表现为其他目的的alpha混合)的TBitm
根据 MS KB entry,CreateIconIndirect中存在一个怪癖,它识别HBITMAP是通过传递给CreateDIBSection(和BGRA通道布局)的BITMAPV5HEADER创建的.

但是,当其句柄引用时,具有(PixelFormat = pf32bit)和(AlphaFormat = afDefined)(表现为其他目的的alpha混合)的TBitmap实例不会被识别为用于创建图标或光标的有效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,Bmp);        // test draw
  Bmp.Free;

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

end;

?(顶部’alpha’是测试绘图,另一个是光标)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读