CImage::GetTransparentColor() gibt -1 zurück
-
Hallo!
Bei den Versuch eine Bitmap als GIF zu speichern mit einer transparenten Farbe darin, bin ich auf folgendes Problem gestossen:
Ich habe ein GIF mit einer transparenten Farbe welches ich über die CImage Klasse lade. Die Funktion GetTransparentColor() meint aber, dort wäre keine transparente Farbe (-1).
CImage Pic_gif; Pic_gif.Load( "c:\\Temp\\officialpenguin.gif" ); long lTest = Pic_gif.GetTransparentColor();Wenn ich mein Bitmap als GIF speichere und vorher SetTransparentColor() anwende, ist die Farbe, die Transparent sein soll einfach nur schwarz.
Was verstehe ich denn dabei nicht?
-
SetTransparentColor dient dazu bei einer Bitmap, die gerendert werden soll festzulegen welche Farbe als durchsichtig genutzt werden soll.
Aus dieser Farbe wird eine entsprechende Maske erzeugt.Eine GIF hat diese Maske bereits eingebaut. Hier wird keine Farbe ersetzt. Folgerichtig gibt es auch keine Farbe aus der Palette die GetTransparentColor returnieren könnte.
Warum brauchst und willst Du das?
Ich bin mir nicht sicher ob CImage es fertig bringt eine GIF mit durchsichtigen Bereichen zu erzeugen, wenn müsstest Du in Deine mit SetTransparentColor die Farbe in Deinem CImage definieren und dann die Datei speichern als GIF. Ob das CImage kann bin ich überfragt.
-
Vielen Dank für die Antwort, Martin. Ich möchte Kartendaten übereinanderlegen. Dazu muss der Hintergrund transparent sein. Das habe ich mit PNG schon gemacht. Das gleiche Vorgehen gelingt mir allerdings mit GIF nicht. Siehe: http://www.c-plusplus.net/forum/viewtopic-var-t-is-189181-and-highlight-is-png+transparent.html Daher suche ich gerade andere Lösungen.
-
Hallo Hydron!
Bei einem Versuch ist es mir nicht gelungen über CImage ein GIF mit einer transparenten Farbe zu speichern. Merkwürdig nur, daß in der gespeicherten Datei der Steuerblock für die Transparenz vorhanden ist, der Index der trasparent darzustellenden Farbe aber auf irgendeinen Wert steht. Man kann aber das CImage als Stream speichern und dann den entsprechenden Indexwert selbst setzen. Siehe dazu auch: http://www.w3.org/Graphics/GIF/spec-gif89a.txt - unter "23. Graphic Control Extension."
long lDataPointer = 0; LPSTREAM pStream = NULL; HRESULT hr; HGLOBAL hGlobal = NULL; PVOID pData; STATSTG streamStat; hr = CreateStreamOnHGlobal( hGlobal, TRUE, &pStream ); PBYTE byteData; if( hr == S_OK ) { hr = Pic.Save( pStream, Gdiplus::ImageFormatGIF ); //Pic = CImage if( hr == S_OK ) { GetHGlobalFromStream( pStream, &hGlobal ); pStream->Stat( &streamStat, STATFLAG_NONAME ); pData = GlobalLock(hGlobal); byteData = ((PBYTE)pData); while( lDataPointer < streamStat.cbSize.LowPart ) { if( byteData[lDataPointer++] == 0x21 ) // 21 { if( byteData[lDataPointer++] == 0xf9 ) // F9 { if( byteData[lDataPointer++] == 0x04 ) byteData[lDataPointer+3] = 0xff; // Weiß ist transparent ...