Eine Farb- oder Graustufenbitmap nach Monocrom (Schwarz/Weiß) konvertieren



  • Hallo Leute

    Ich versuche schon seit einigen Tagen immer wieder, nach verschiedensten Tips aus Foren und dergleichen, eine Bitmap in eine monochrome Bitmap zu konvertieren.

    Also mein Input wäre irgendeine Bitmap (aus BMP, PNG, JPG - egal - liegt bereits als CBitmap oder auch als System.Drawing.Bitmap vor.
    Egal ob MFC oder .Net - Hauptsache C++.

    Nochmal - Input ist irgendeine Bitmap - Output muss eine monochrome Bitmap sein - also mit 1 bit pro Pixel.
    Ich brauche die monochrome Bitmap um sie auf einem Gerät auszudrucken, welches eben nur 1 Bit Pixels verarbeiten kann.

    Ach ja, und die nächste Schicht nimmt wieder ein CBitmap, aber das ist kein Problem eine System.Drawing.Bitmap in eine CBitmap zu bekommen 🙂

    Kann mir da jemand auf die Sprünge helfen?
    Je einfacher und performanter, desto besser - eh klar.

    Gruß
    Franz

    PS. gehn muss es - IrfanView kann's ja auch 🙂



  • Bin kein Experte, aber was Du machen willst nennt sich im Bildverarbeitungs-Jargon Dithering.
    https://en.wikipedia.org/wiki/Dither
    Danach solltest du weitersuchen.



  • Danke allen fürs mitdenken 🙂

    Ich hab eine brauchbare Lösung gefunden - und das sogar teilweise in meinem eigenen Code.

    Ich mache es über ein zwischenspeichern - das flutscht hervorragend.
    Hier die beiden kleinen Funktionen:

    void SaveBitmap( CBitmap *pBitmap, CString name )
    {
    	CImage image;
    	image.Attach( *pBitmap );
    
    	if(name.Right(4).MakeLower() == L".png")
    		image.Save( name, Gdiplus::ImageFormatPNG );
    	else
    		image.Save( name, Gdiplus::ImageFormatBMP );
    
    	image.Detach();
    	image.Destroy();
    }
    
    CBitmap *LoadMonochromeBitmap( CString name )
    {
    	// use GDI LoadImage to load bitmap from the temp file;
    	// the trick is the API function automatically creates 1bpp bitmap
    	HBITMAP hBitmap = (HBITMAP)LoadImage( NULL, (LPCTSTR)name, 0, 0, 0, (LR_LOADFROMFILE | LR_MONOCHROME) );
    	CBitmap *pBitmap = new CBitmap();
    	pBitmap->Attach( hBitmap );
    
    	return pBitmap;
    }
    

Log in to reply