Speicherzugriff???



  • Hallo,

    ich möchte auf die Pixel eines 8-Bit tiefen Bitmaps zugreifen.
    Genauer, ich möchte über die Pixel iterieren.
    Zum speichern der Bitmap nutze ich die Klasse CImage.
    Die bietet mir die möglichkeit über GetPixelAdress() die Speicher-adresse eines Pixels zu bekommen.
    Wenn ich das nun für das erste Pixel in einer Zeile tue müsste ich doch mit folgendem Code auf die folgenden Pixel der Zeile zugreifen können.:

    int color; //Farbe des Pixels
    char* curAdress = (char*)image.GetPixelAdress(row,1); //adresse des Pixels
    for(int i = 1, i<= image.GetWidht(); i++)
    {
       color = *(int*)curAdress;
       curAdress++;
    }
    

    natürlich mache ich dann noch was mit color, aber das ist ja irrelevant.
    Meine ergebnisse zeigen mir, das nicht richtig über die Zeile iteriert wird.

    Kann mir jemand vielleicht mal einen kleinen schnellkurs über Speicherzugriffe geben. Offenbar hab ich da einiges noch nicht verstanden.

    Danke.



  • Hallo!

    Du verwendest hier einen Textstring als Speicherung einer Adresse! Mir ist bis dato noch nicht bekannt, dass man diesen dann mit
    curAdress++;

    iterieren könnte?

    Aber vielleicht probierst du mal direkt im HexFormat darauf zuzugreifen?

    oder Du errechnest Dir mit sizeof(); die benötigte Größe eines Pixels und addierst sie manuell zu der curAdress?

    Aber mit '++' geht das meiner Meinung nach nicht.

    Hoffe ich liege nicht falsch.



  • Hallo Janet,

    Prinzipell sollte das mit dem Speicherzugriff so gehn.
    Bis auf eine Kleinigkeit. Du machst aus dem Zeiger auf char (8 Bit) zuerst einen Zeiger auf int (32 Bit) und tust diesen dann dereferenzieren. Ich denke Du bekommst damit dann gleich 4 Pixel in Deine color-Variable.
    Versuch mal:

    color=(int)(*curAdress)
    // oder einfach
    color=*curAdress
    

    Aber warum ist color überhaupt vom Type int. Du hast ja nur 8 Bit-Werte als Farbe.
    Die 8 Bit-Farben kannst Du nicht einfach durch einen Cast in 32-Bit-Farbwerte umwandeln und andersrum. Dazu gibt es glaub ich im Bitmap extra eine Farbtabelle.

    Ich hoffe, dass CImage Bitmaps so speichert. Sonst versuch doch erstmal GetPixelAdress in der Schleife zu verwenden, auch wenn es langsamer ist. Du kannst Dir die zurückgegebenen Adressen ja mal im Debugger anzeigen lassen und mit den Adressen von Deiner Methode vergleichen.

    Viel Glück


Anmelden zum Antworten