Habe eine Funktion gefunden. Das Ergebnis sieht zwar besser aus, aber nicht gut genug. Es werden die weiten Pixel geschwärzt. Könnte man anstelle von Schwarz nicht einfach die Hintergrundfarbe nehmen und es wäre alles flüssig ?
Delphi-Quellcode:
function IconToBitmap(const IconHandle : HIcon) : TBitmap;
var IcoInfo : TIconInfo;
Mask : TBitmap;
X, Y : Word;
begin
Mask := nil;
Result := nil;
if not GetIconInfo(IconHandle, IcoInfo) then
Exit;
try
try
Result := TBitmap.Create;
Result.Handle := IcoInfo.hbmColor;
Result.PixelFormat := pf32bit;
Mask := TBitmap.Create;
Mask.Handle := IcoInfo.hbmMask;
Mask.PixelFormat := pf32bit;
for X := 0 to Result.Width-1 do
for Y := 0 to Result.Height-1 do
pRGBALine(Result.Scanline[Y])^[X].rgbReserved := not pRGBALine(Mask.Scanline[Y])^[X].rgbRed;
except
FreeAndNil(Result);
end;
finally
if Assigned(Mask) then
Mask.Free;
end;
end;
function GetIcon(filename : String; IconIndex: Integer) : TBitmap;
var NumberOfIcons : Integer;
Ico : TIcon;
begin
NumberOfIcons := ExtractIcon(hInstance, PChar(Filename), UINT(-1));
Ico := TIcon.Create;
if (Ico <> nil) and (NumberOfIcons > -1) then
Ico.Handle := ExtractIcon(hInstance, PChar(Filename), IconIndex);
Result := IconToBitmap(Ico.Handle);
Result.Canvas.Draw(0, 0, Ico);
Ico.Free;
end;