Bitmap an 2 dimensionales char Array übergeben



  • Hallo zusammen,

    ich versuche mit folgenden Code eine geladene, schwarzweiß Bitmap mit 128x64 Pixeln in das Array "display" zu schreiben. Hierbei sollen acht übereinanderliegende Bildpunkte zu einen char zusammengefasst werden. Jeder schwaze Punkte des Bildes wird also zu 1 und alles andere zu 0.
    Wenn ich nun anschließend, das so erstellte Array, wieder auslesen möchte befindet sich in jeder "Zeile" des Array die gleichen Charakter. D.h. display[x][0]=display[x][1]=display[x][2]... gilt egal für welches x.

    Falls mir hier jemand sagen könnte wodran das liegt wäre ich ihm sehr dankbar :-). Vielleicht hat auch jemand ne idee wie man die ganze sache effiziente löst... . Ich bin neu C++ler und kenne mich daher nicht so gut aus....

    mfg Georg

    for (int z=0; z<=7; z++)
    {
    for (int x=0; x<=127; x++)
    {
    unsigned char bitposition = 1; //Werthöchste Bit bitposition 128d=1000 0000b
    for (int y=0; y<=7; y++)
    {
    COLORREF color = dcMem.GetPixel(x,y);
    if (color == RGB( 0, 0, 0)) // Wenn Schwarz dann Eins
    {
    display[x][z]= bitposition | display[x][z]; // unsigned char display[127][7];
    }
    bitposition = bitposition*2; // Schiebe die Eins eins nach rechts
    }
    }
    }



  • Drei verschachtelte Schleifen sieht intuitiv schon Sch......lecht aus! Versuch es mal mit:

    for (int x=0; x<128; ++x)
    {
        for (int y=0; y<64; ++y)
        {
            COLORREF color = dcMem.GetPixel(x,y);
            if (color == RGB( 0, 0, 0)) // Wenn Schwarz dann Eins
            {
                int z = y / 8;
                int b = 7 - (y % 8); // ggfs. auch nur b = y % 8
                display[x][z] |= 1 << b;
            }
        }
    }
    


  • Hi !
    Was hast du vor, Bitmaps komprimieren ? Ich würde das mit einem eindimensionalen Array machen.

    Kuck dir doch mal den Datentypen COLORREF an:
    typedef DWORD COLORREF;
    Und DWORD wiederum ist:
    typedef unsigned long DWORD;

    Bedeutet also, das COLORREF vom Typ unsigned long ist
    Die Farbwerte(RGB) für die einzelnen Byte sehen dann hexadezimal so aus:
    0x00bbggrr

    Wenn ein Pixel schwarz ist, hast du den Wert 0x00000000

    Du kannst die Abfrage auf Schwarz also so machen:

    if ( color == 0 )
    {
    // Bit setzen
    }
    

    Du musst deine Bitmaske immer wieder auf 1 zurücksetzen, wenn die höchste Bitposition deines Speicher-Datentypen erreicht ist und gleichzeitig den Arrayindex um eins erhöhen.

    Gruß,
    p.


Anmelden zum Antworten