![]() |
Flip verändert die Farbe
Ich erstelle ein Bitmap und drehe es zur Laufzeit.
Das Problem was ich nun habe ist das beim jeden erneuten drehen das Bitmap immer dunkler wird mit der übergebenen Farbe .. hier schwarz. Habe keine Idee wie ich das verhindern kann.
Delphi-Quellcode:
ja ich weis das
if Flip then
begin Flip := False; if ObjItem.Flipmode = GD_Reverse then begin Item := gItemFromID(ObjItem.ID); SelectObject(hDCsrce, ObjItem.Bitmap); Img := gBitmapToImage(hDCsrce); GdipImageRotateFlip(Img, 4); DeleteObject(ObjItem.Bitmap); GdipCheck(GdipCreateHBITMAPFromBitmap(Pointer(Img), hbmpReturn, $000000)); g_Obj[Item].Bitmap := hbmpReturn; if Img <> 0 then GdipCheck(GdipDisposeImage(Img)); end; end;
Delphi-Quellcode:
GdipCheck(GdipCreateHBITMAPFromBitmap(Pointer(Img), hbmpReturn, $000000));
der Hintergrund hier schwarz ist. Aber mir fällt nichts ein wie ich den Transparent erstellen kann also vom GDI+ Img zu HBitmap. gruss |
AW: Flip verändert die Farbe
Zitat:
|
AW: Flip verändert die Farbe
Mein Ausgangs Bild ist ein HBitmap. 32BIT
Daraus erstelle ich ein GDI+ Image über GdipCreateBitmapFromScan0. Das Bild ist dann 32 Bit inklusive Transparenz. Anschließend muss ich über GdipCreateHBITMAPFromBitmap ein neues HBitmap erstellen. Das Problem dabei ist das der Hintergrund dann schwarz wird und die Transparenz verloren geht. Ich habe versucht über ein Kompatibles DC das SourceDC zu entfernen da ich dachte vielleicht liegt es daran, da ich mein DC ja nicht verändere sich die Hintergrundfarbe summiert. Hat aber leider keinen Effekt. Habe mal zwei Pics angehängt wo man das sehen kann. Das kleine pic ist ein paar Drehungen weiter. Ich verstehe nicht wie oder wo sich die Farbe summiert, ja an den Flossen wie man sieht. Obwohl das Bild Ansicht Transparent ist wie man sehen kann. gruss |
AW: Flip verändert die Farbe
Zitat:
|
AW: Flip verändert die Farbe
Zitat:
Das Bild soll doch anschließend transparent sein. Na ok werde es mal versuchen auch wenn ich den sinn dahinter jetzt nicht verstehe. Danke. Zitat:
gruss |
AW: Flip verändert die Farbe
Zitat:
|
AW: Flip verändert die Farbe
Wenn es nicht Transparent ist dann hätte der Fisch einen schwarzen rechteckigen Hintergrund.
Der muss transparent sein .. was sich seltsamer weise verändert sind die flossen. Zitat:
Habe es mal kommentiert.
Delphi-Quellcode:
Alpha Kanal habe ich hier keinen $000000.
if Flip then
begin Flip := False; if ObjItem.Flipmode = GD_Reverse then begin Item := gItemFromID(ObjItem.ID); SelectObject(hDCsrce, ObjItem.Bitmap); // vorhandenes HBitmap vom DC selectieren. Img := gBitmapToImage(hDCsrce); // Transparentes Image erstellen über GdipCreateBitmapFromScan0. GdipImageRotateFlip(Img, 4); // Image drehen DeleteObject(ObjItem.Bitmap); // alte HBitmap löschen GdipCheck(GdipCreateHBITMAPFromBitmap(Pointer(Img), hbmpReturn, $000000)); // neues HBitmap erstellen. g_Obj[Item].Bitmap := hbmpReturn; // Neue HBitmap zuweisen if Img <> 0 then GdipCheck(GdipDisposeImage(Img)); // Image löschen end; end; Aber selbst mit $FF000000 \ $00000000 ändert sich da nix. Das neue Bitmap vom hDCsrce kann ich nicht löschen bevor ich es gedreht habe! Aber es wird nicht überlagert da ich das alte lösche. gruss |
AW: Flip verändert die Farbe
@Zacherl Thanks! :)
Es ist so wie du sagst. Zitat:
Das war aber nicht das einzige, zusätzlich bricht mir 'GdipCreateHBITMAPFromBitmap' den Hals..LOL Habe es jetzt so verändert und es läuft zu meiner Zufriedenheit. Ist kommentiert. (Wenn auch ein bisschen viel) ;) So macht man aus 16 Zeilen code mal eben 70!
Delphi-Quellcode:
Hat sich erledigt..
if (ObjItem.Flipmode <> 0) then
begin if Flip then begin Flip := False; if ObjItem.Flipmode = GD_Reverse then begin Item := gItemFromID(ObjItem.ID); SelectObject(hDCsrce, ObjItem.Bitmap); // Create Image from DC using GdipCreateBitmapFromScan0 Img := gBitmapToImage(hDCsrce); // Flip Image RotateNoneFlipX GdipImageRotateFlip(Img, 4); // Delete Old HBitmap DeleteObject(g_Obj[Item].Bitmap); // Get ImageSize GDIP_GetImageSize(Img, ImgW, ImgH); // CreateCompatibleDC from Source ImgHDC := CreateCompatibleDC(hDCsrce); // Create Memory Bitmap with 32 Bit support hbmpReturn := gCreateDIBSection(hDCsrce, ImgW, ImgH); // Select Memory Bitmap from DC SelectObject(ImgHDC, hbmpReturn); // Delete Old Source DC DeleteDC(hDCsrce); if (GdipCreateFromHDC(ImgHDC, Graphics) = OK) then begin // Draw image GdipDrawImageRect(Graphics, Img, 0, 0, ImgW, ImgH); // Set the new HBitmap g_Obj[Item].Bitmap := hbmpReturn; // Get Bitmap Object GetObject(hbmpReturn, sizeof(bm), @bm); pBits := bm.bmBits; // Remove Transparent Color Black $00000000 for p := 0 to (bm.bmWidth * bm.bmHeight) do begin ColorIs := RGB(pBits[2], pBits[1], pBits[0]); if (ColorIs = $00000000) then begin pBits[3] := 0; pBits[2] := 255; pBits[1] := 0; pBits[0] := 255; end else if (ColorIs = 0) then begin if (pBits[3] > 0) then pBits[0] := 1; end else // Alpha channel for PNG image begin AlphaCoef := (255 shl 8) div pBits[3]; pBits[2] := ((pBits[2] * AlphaCoef) shr 8); pBits[1] := ((pBits[1] * AlphaCoef) shr 8); pBits[0] := ((pBits[0] * AlphaCoef) shr 8); end; pBits := pBits + 4; end; end; // Cleanup GdipDeleteGraphics(Graphics); // Set new Source DC hDCsrce := ImgHDC; // Delete old DeleteDC(ImgHDC); // Dispose Image if Img <> 0 then GdipCheck(GdipDisposeImage(Img)); end; end; end; gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz