Delphi/C++Builder - Bitmapから透過Iconを生成

Bitmap から透過する色を指定して、Iconを作成

同じサイズのマスク用Bitmap(下ではMaskBmp)を作成して、透過する場所は白、元のBitmapを表示する場所は黒で塗りつぶしておく
IconInfo を通じて、CreateIconIndirect へ元のBitmapとマスク用Bitmapを渡し、Iconへコピーさせる
※元Bitmapの TransparentColorプロパティを利用しようとしたが、設定した値が得られなかったので別引数とした

procedure CopyIconFromTransBitmap(ABitmap: TBitmap; ATransparentColor: TColor; ADstIcon: TIcon);
var
    MaskBmp: TBitmap;
    IconInfo: TICONINFO;
    X, Y: Integer;
begin
    MaskBmp := TBitmap.Create;
    try
        MaskBmp.Assign(ABitmap);
        for X := MaskBmp.Width -1 downto 0 do begin
            for Y := MaskBmp.Height -1 downto 0 do begin
                if (MaskBmp.Canvas.Pixels[X, Y] = ATransparentColor) then begin
                    MaskBmp.Canvas.Pixels[X, Y] := clWhite;
                end else begin
                    MaskBmp.Canvas.Pixels[X, Y] := clBlack;
                end;
            end;
        end;

        with IconInfo do begin
            fIcon := True;
            xHotspot := 0;
            yHotspot := 0;
            hbmMask := MaskBmp.Handle;
            hbmColor := ABitmap.Handle;
        end;

        ADstIcon.Handle := CreateIconIndirect(IconINFO);
    finally
        MaskBmp.Free;
    end;
end;

コメント