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ß
FranzPS. 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; }