Schwarz-Weiß Bildverarbeitung mit Bitmaps



  • Hallo,

    ich habe mit dem C++ Builder XE4 ein Programm geschrieben, dass Farbbilder verarbeitet und negative Effekte rausrechnet. Das Programm funktioniert gut. Jetzt möchte ich das Programm auf Schwarz-Weiß Bilder anwenden, aber nur noch mit einem Farbkanal bzw. dem Helligkeitskanal des Grauwertbildes arbeiten.
    Mein Problem ist, dass ich mit Bitmaps bisher nur informationen zu Farbbildern gefunden habe.

    Programm mit Farbbildern sieht so aus (gekürzt):

    std::auto_ptr<Graphics::TBitmap> Bitmap(new Graphics::TBitmap);
    std::auto_ptr<Graphics::TBitmap> newBitmap(new Graphics::TBitmap);
    TRGBTriple *bitmapPtr, *newptr;
    TPixelFormat pixForm;
    newBitmap->PixelFormat = pf24bit;
    newBitmap->Height=Bitmap->Height;
    newBitmap->Width = Bitmap->Width;
    int höhe=Bitmap->Height;
    int breite= Bitmap->Width;
    Bitmap->LoadFromFile(FormFFC->FileOpenDialogFlats->Files->operator [](0));
    for(int i=0; i<höhe;i++)
    {
    	newptr = reinterpret_cast<TRGBTriple *>(newBitmap->ScanLine[i]);
    	bitmapPtr= reinterpret_cast<TRGBTriple *>(Bitmap->ScanLine[i]);
    	for(int j=0;j<breite;j++)
    	{
    
    		newptr[j].rgbtRed=bitmapPtr[j].rgbtRed;
    		newptr[j].rgbtGreen=bitmapPtr[j].rgbtGreen;
    		newptr[j].rgbtBlue=bitmapPtr[j].rgbtBlue;
    	}
    }
    newBitmap->SaveToFile(FormFFC->FileSaveDialogFlat->FileName);
    

    Wie ihr seht, kopiere ich ein Farbbild auf ein anderes. Ich möchte allerdings, dass Bitmap auf newBitmap kopiert wird, dabei soll newBitmap keinen RGB-Kanal sondern nur noch einen Helligkeitskanal besitzen (also zu einem wirklichen schwarz-Weiß Bild werden).
    Geht das mit Bitmaps?
    Wenn ja wie?
    Welche Methoden bietet der C++ Builder dazu an?
    Geht es mit anderen Objekten als Bitmaps?

    Mein Lösungsansatz war:

    ...
    unsigned char* newptr;
    newBitmap->PixelFormat = pf8bit;
    for(int i=0; i<höhe;i++)
    {
    	newptr = reinterpret_cast<char *>(newBitmap->ScanLine[i]);
    	bitmapPtr= reinterpret_cast<TRGBTriple *>(Bitmap->ScanLine[i]);
    	for(int j=0;j<breite;j++)
    	{for(int j=0;j<breite;j++)
    	{
    
    		newptr[j]=(int)((bitmapPtr[j].rgbtRed+bitmapPtr[j].rgbtGreen+bitmapPtr[j].rgbtBlue)/3);
    	}
    }
    newBitmap->SaveToFile(FormFFC->FileSaveDialogFlat->FileName);
    

    Ich dachte wenn ich das Pixelformat auf pf8Bit anpasse hätte das Bild nur noch einen Helligkeitskanal, aber das funktioniert nicht.
    Ich weiß das es nicht die optimale Umrechnung von Farb zu Grauwert ist, es ist eher beispielhaft für mich.

    Hoffe habe mich nicht zu kompliziert ausgedrückt und ihr nehmt ein bisschen rücksicht, da ich noch am üben bin und man es wahrscheinlich sauberer codieren kann.

    Danke für die Hilfe und viele Grüße 🙂



  • Hallo,

    schau dir mal Windows Bitmap an.

    Bei 8Bit benötigst du eine Farbtabelle (d.h. für Grauwerte von 0 bis 255).



  • Hallo,

    danke für die schnelle Antwort.
    Ich weiß nicht, ob das mit den Farbtabellen nicht noch etwas zu kompliziert ist, aber werde es mal versuchen.
    Gibt es alternativ zu TBitmap noch andere Objekte denen man unter XE4 Bilder zuweisen und bearbeiten kann?


Anmelden zum Antworten