Skip to content

Commit a10fadd

Browse files
Improved icon loading from image list: Extracting an image into a TIcon and using TWICImage to convert to BMP yields better results with transparent icons
1 parent 84f9f92 commit a10fadd

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

Lib/UIRibbonCommands.pas

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4375,26 +4375,46 @@ procedure TUIImage.LoadPng(const Filename: String; const HighContrast: Boolean);
43754375

43764376
constructor TUIImage.Create(pImageList: TCustomImageList; pImageIndex: TImageIndex);
43774377
var
4378+
lWICImage: TWICImage;
4379+
lIcon: TIcon;
4380+
lStream: TStream;
43784381
lBitmap: TBitmap;
4382+
lWICStream: TMemoryStream;
43794383
begin
43804384
inherited Create;
4381-
if Assigned(FImageFactory) and Assigned(pImageList) then
4385+
if Assigned(FImageFactory) and Assigned(pImageList) and (pImageList.Count > 0) and (pImageIndex >= 0) then
43824386
begin
4387+
lIcon := TIcon.Create;
4388+
lStream := TMemoryStream.Create;
4389+
lWICImage := TWICImage.Create;
4390+
lWICStream := TMemoryStream.Create;
43834391
lBitmap := TBitmap.Create;
43844392
try
4385-
lBitmap.Width := pImageList.Width;
4386-
lBitmap.Height := pImageList.Height;
4387-
lBitmap.PixelFormat := pf32bit;
4388-
lBitmap.Transparent := True;
4389-
// Draw empty background (for transparency)
4390-
lBitmap.Canvas.Brush.Color := clNone;
4391-
lBitmap.Canvas.FillRect(lBitmap.Canvas.ClipRect);
4392-
if not ImageList_DrawEx(pImageList.Handle, pImageIndex, lBitmap.Canvas.Handle, (lBitmap.Width - pImageList.Width) div 2, (lBitmap.Height - pImageList.Height) div 2, 0, 0, CLR_NONE, CLR_NONE, ILD_TRANSPARENT) then
4393-
exit;
4393+
// Load icon from image list to TIcon and save to a TMemoryStream
4394+
pImageList.GetIcon(pImageindex, lIcon);
4395+
try
4396+
lIcon.SaveToStream(lStream);
4397+
except on E: EInvalidGraphic do
4398+
Exit;
4399+
end;
4400+
4401+
// Load stream into a TWICImage, convert to BMP, save to TMemoryStream
4402+
lWICImage.LoadFromStream(lStream);
4403+
lWICImage.ImageFormat := TWICImageFormat.wifBmp;
4404+
lWICImage.SaveToStream(lWICStream);
4405+
lWICSTream.Seek(0, TSeekOrigin.soBeginning);
4406+
4407+
// Load bitmap from WIC stream
4408+
lBitmap.LoadFromStream(lWICStream);
4409+
ConvertToAlphaBitmap(lBitmap);
43944410
FHandle := FImageFactory.CreateImage(lBitmap.Handle, UIOwnershipCopy);
43954411
FBitmap := FHandle.GetBitmap;
43964412
finally
43974413
lBitmap.Free;
4414+
lWICStream.Free;
4415+
lWICImage.Free;
4416+
lStream.Free;
4417+
lIcon.Free;
43984418
end;
43994419
end;
44004420
end;

0 commit comments

Comments
 (0)