Problem mit dem Kopieren eines monochromen Bildes in ein Feld



  • Ich hätte mal eine Frage: Wenn ich die Bildinformationen eines monochromen Bildes in ein Feld schreiben will, dann geht das ja mit der Funktion GetBitmapBits. Nun habe ich in einem Algorithmus allerdings ein Problem. Es funktioniert etwas nicht, wie es soll (die Details sind hier unerheblich) und ich glaube, daß es an diesem Kopiervorgang liegen könnte. Deshalb meine Frage: Ist das folgende Codebeispiel richtig? Vor allem geht es mir hier um die richtige Zuordnung der Konstante GROESSE.

    CBitmap bitmap;
    
    /*Die Bitmap-Variable wird irgendwie erstellt etc.
      und befindet sich nun im monochromen Zustand.*/
    ...
    
    BITMAP bm;
    
    bitmap.GetBitmap (&bm);
    
    const UINT GROESSE=bm.bmWidthBytes*bm.bmHeight;
    
    BYTE *feld=new BYTE [GROESSE];
    
    bitmap.GetBitmapBits (GROESSE, feld);
    
    ...
    
    delete [] feld;
    

    Wie gesagt, da etwas in meinem Gesamtprogramm nicht richtig funktioniert und ich den Fehler soweit eingekreist habe, daß er eigentlich hier liegen muß, wollte ich fragen, ob der Typ des Feldes richtig ist und ob ich die Größenkonstante korrekt zusammengesetzt habe.



  • DWORD GetBitmapBits( DWORD dwCount, LPVOID lpBits ) const;

    The dwCount parameter specifies the number of bytes to be copied to the buffer. Use CGdiObject::GetObject to determine the correct dwCount value for the given bitmap.

    siehe auch: http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel4.htm



  • Danke, aber das kenn ich schon. Sowohl den MSDN-Eintrag als auch das MFC-Tutorial. Das hilft mir aber nicht weiter. Ich wollte einfach bloß wissen: Ist der Felddtyp sowie die Berechnung für die Größenvariable richtig (oder muß das Feld zum Beispiel vom Typ UINT sein, während sich die Feldgröße aus bmWidth*bmHeight/8 oder so errechnet)?

    P.S.: Worauf ich Dich schon immer aufmerksam machen wollte: Auf Deiner Seite im Kapitel 9 stehen so Sachen, wie

    Jetzt sollte sich unsere Spielfigur von links nach rechts bewegen. Geschafft! Hierbei flimmert es deutlich. Das liegt daran, dass wir durch InvalidateRect(&rect, TRUE) zunächst alles löschen, bevor wir neuzeichnen.

    Im Spiel stört das Flackern und kostet Zeit. Daher wechseln wir diesbezüglich auf InvalidateRect(&rect, FALSE);

    Aber den besten Spruch fand ich noch immer:

    Wenn der Pausenwert i und die Schrittweite step zu klein werden, kommt für das Auge ein Flackereffekt zustande. Man muß das neugezeichnete Bild der Figur jeweils eine gewisse Zeit stehen lassen, bevor man es erneut neuzeichnet.

    Wieso benutzt Du nicht einfach einen Back-Buffer? Erstelle eine leere Bitmap-Variable, die so groß ist wie der Hintergrund, und einen passenden DC und mach folgendes:

    dcBuffer.StretchBlt (..., &dcHintergrund, ...);
    dcBuffer.BitBlt (..., &dcHomerSimpson, ...); //oder StretchBlt, wie auch immer
    
    //Und ganz am Ende der Zeichenfunktion:
    pDC->BitBlt (..., &dcBuffer, ...);
    //pDC ist der CPaintDC bzw. CClientDC.
    

    Dann kannst Du Dir sämtliche InvalidateRects und Pausen zur Vermeidung des Flackereffekts sparen, denn da bloß noch ein Bild, das immer an derselben Stelle steht, direkt auf das Fenster geblittet wird, gibt es automatisch kein Flackern mehr.



  • Ich konnte das Problem, das ich in meinem Programm habe, relativ eng eingrenzen. Doch um es jetzt auch zu beseitigen, müßte ich folgendes wissen:
    In welcher Weise wird ein monochromes Bild in ein Feld gespeichert, wenn man GetBitmapBits verwendet? Bei der Funktion CreateBitmap ist das ja eigentlich klar: Ein Feldeintrag speichert acht Pixel. Fertig. Die Größenangabe (Breite und Höhe) erfolgt dann ja explizit beim Aufruf der Funktion. Aber bei GetBitmapBits ist das ein bißchen anders. Da es hier keine Angabe gibt, wie breit das Bild sein soll, können demnach nicht alle Bits im Feld Farbinformationen enthalten, sondern einige müssen sozusagen als Steuerzeichen dienen.
    Ich habe bereits gemerkt, daß ein aus einem monochromen Bild erstelltes Feld
    a) bei jeder Farbauflösung (16, 24, 32) anders ist
    b) auch bei derselben Farbeinstellung nicht immer gleich ist (woraus ich schließe, daß überschüssige Bits enthalten sind, die willkürlich belegt werden)
    Ich wäre sehr dankbar, wenn mir jemand sagen könnte, wo ich eine Erläuterung über die interne Struktur von Feldern, die aus monochromen Bildern mit GetBitmapBits erstellt wurden, finden kann.


Anmelden zum Antworten