PNG Dateien mit transparenz speichern



  • Hallo!

    Ich programmiere in Visual C++ 2003 mit der MFC.

    Ich habe einen handle auf ein Bitmap. Nun möchte ich den Hintergrund des Bitmaps Transparent gestalten und das Bitmap dann als PNG speichern. Kann ich das mit der MFC überhaupt bewerkstelligen ohne extra Bibliotheken einzubinden? Auf jeden Fall soll eine 32 bit PNG-Datei herauskommen, dessen Hintergrund transparent ist.

    Wäre super, wenn mir jemand einen Ansatz geben könnte.



  • Hallo,

    am besten Du verwendest die CxImage Libary von Codeproject. Mit der kann man die verrücktesten Sachen machen.

    http://www.codeproject.com/bitmap/cximage.asp

    Ist aber etwas kompliziert in die Struktur reinzudenken. Falls Du Sie trotzdem verwenden willst, empfehle ich Dir dringlichst das "CxImageLib" Projekt als erstes zu laden und dort das "Demo" zuerst zu komplieren. Hierdurch werden alle Libaries angelegt.

    Für Deine Zwecke genügt meiner Ansicht nach aber auch die CImage Klasse. Ist zwar nur ATL, aber erfüllt den Zweck.

    http://msdn2.microsoft.com/en-us/library/bwea7by5(VS.80).aspx

    Hoffe konnte Dir einwenig weiterhelfen

    Gruss Paulchen



  • Danke für den Hinweis. Bin ich auch schon drauf gekommen aber weiß trotzdem nicht genau, wie ich die Klasse einsetzen soll um meinen Hintergrund transparent zu bekommen. Was muß ich dafür tun? 😕 Leider habe ich bisher noch nicht viel mit Bitmaps zu tun gehabt... 🙄



  • Ich meinte natürlich wie ich die CImage Klasse benutzen kann um einen einfarbigen Hintergrund transparent zu bekommen.
    Der Anfang:

    CImage Bild;
    	Bild.Attach(hBitmap);
    

    Und nun? Wie gesagt ist das Bild 32 Bittig. Ich kann also die speziellen Funktionen wie: SetTransparentColor() nicht benutzen. Sondern muss wohl auf AlphaBlend zurückgreifen. Allerdings weiß ich nun auch nicht weiter...



  • Hallo,

    vielleicht hilft Dir der Artikel hier weiter:

    http://www.codeproject.com/bitmap/trans_cimage.asp

    Gruß und schönes Wochenende!

    Paulchen



  • Den Artikel kannte ich schon, hilft mir aber nicht weiter, da es sich hierbei um eine eigens erstellt CImage Klasse handelt. Ich bräuchte aber Hilfe bei der MS CImage-Klasse...



  • Mit GDI+ sollte das Ganze so funktionieren. hBitmap ist Deine Bitmap. Durch SetRemapTable() kann eine Farbe inklusive Alphawert in eine andere umgewandelt werden. In dem Beispiel wird nur der Alphawert der Farbe weiß geändert.

    CImage Pic;
    	Pic.Create( breite, hoehe, 32, CImage::createAlphaChannel );
    	Gdiplus::Graphics graphics( Pic.GetDC() );
    
    	Gdiplus::Bitmap           bitmap( hBitmap, NULL );
    	Gdiplus::ImageAttributes  imageAttributes;
    	Gdiplus::ColorMap         colorMap[1];
    
    	colorMap[0].oldColor = Gdiplus::Color( 255, 255, 255, 255 );
    	colorMap[0].newColor = Gdiplus::Color( 0, 255, 255, 255 );
    
    	imageAttributes.SetRemapTable(1, colorMap, Gdiplus::ColorAdjustTypeBitmap);
    
    	graphics.DrawImage(
    		&bitmap, 
    		Gdiplus::Rect( 0, 0, breite, hoehe ),  // destination rectangle 
    		0, 0,        // upper-left corner of source rectangle 
    		breite,       // width of source rectangle
    		hoehe,      // height of source rectangle
    		Gdiplus::UnitPixel,
    		&imageAttributes);
    
    	HRESULT hRes = Pic.Save( strDatei, Gdiplus::ImageFormatPNG );
    
    	Pic.ReleaseDC();
    

Anmelden zum Antworten