Wie ich schon sagte..
TBitmap zu TGPBitmap := Graphics Image.
Es spielt keine rolle welches Format du verwendest am ende ist es immer ein Graphics Image Object.
PNG, JPG, BMP und Konsorte.
Zitat:
aus einer ImageList, ich lade es also nicht direkt mit
GDI+
Und das Bitmap wenn du es schon hast hat kein
Handle?
Dann reicht ein GdipCreateBitmapFromHBITMAP..
Zitat:
hat die TGPBitmap Tmp nachher aber das Pixelformat 32bppRGB
Nicht schon vorher, also in der ImageList?
Prüfe das doch mal vorher mit GdipGetImagePixelFormat.
Du musst also sicherstellen das dein Bitmap in der ImgageList auch schon im 32Bit ARGB Format vorliegt.
Teste das hier.
Du must die Bitmaps vorher in ein
GDI+ fähigen Bitmap Format (Graphics Image Object) konvertieren sonst wird das nichts!
Delphi-Quellcode:
function ImageListToGPBitmap(SourceImageList: TImageList): TGPBitmap;
var
bmp: TGPBitmap;
g: TGPGraphics;
dc: HDC;
i: Integer;
x: Integer;
procedure GdipCheck(Status:
Winapi.GDIPAPI.TStatus);
begin
if Status <> Ok
then
raise Exception.CreateFmt('
%s', [GetStatus(Status)]);
end;
begin
//Note: Code is public domain. No attribution required.
bmp := TGPBitmap.Create(SourceImageList.Width*SourceImageList.Count, SourceImageList.Height);
GdipCheck(bmp.GetLastStatus);
g := TGPGraphics.Create(bmp);
GdipCheck(g.GetLastStatus);
g.Clear($00000000);
GdipCheck(g.GetLastStatus);
dc := g.GetHDC;
for i := 0
to dmGlobal.imgImages.Count-1
do
begin
x := i * dmGlobal.imgImages.Width;
ImageList_DrawEx(dmGlobal.imgImages.Handle, i,
dc,
x, 0, dmGlobal.imgImages.Width, dmGlobal.imgImages.Height,
CLR_NONE, CLR_DEFAULT,
ILD_TRANSPARENT);
end;
g.ReleaseHDC(
dc);
g.Free;
Result := bmp;
end;
gruss