ein mit 'auxDIBImageLoad' geladenes Bitmap auf der Y-Achse spiegeln



  • Hi Leute,
    ich machs ganz kurz:

    Wie kann ich ein mit 'auxDIBImageLoad' geladenes Bitmap auf der Y-Achse spiegeln?
    Ich will die Spiegelung aber nicht erzeugen in dem ich bei 'glVertex2f' die Koordinaten vertausche, sonst währen die Bitmap Bilder zwar richtig herum aber die JPG Bilder währen dann auch gespiegelt und somit falsch herum.



  • du tauscht den inhalt der obersten scanlines mit dem der untersten, die zweite mit der vorletzten usw.
    AUX_RGBImageRec::data zeigt auf die erste scanline mit (fuer gewoehnlich) 3 byte pro pixel.



  • Also in etwa so:

    AUX_RGBImageRec* Image, tmpImage;
    for (unsigned int i = 0; i < Image->sizeY; ++i)
    {
      tmpImage->data[i] = Image->data[Image->sizeY-i];
    }
    


  • du kopierst nur die erste farbkomponente eines pixels, eine ganze scanline waere Image->sizeX * 3 bytes gross, daraus ergibt sich dann auch die korrekte startadresse einer scanline.
    beachte auch, dass du tmpImage->data vorher allozieren musst.



  • Ich komme da im Moment etwas durcheinander, könntest du kurz einen kleinen Code schreiben bitte? 🙂



  • ich bin mir sicher, dass du das auch alleine hinkriegst.



  • Nagut, ich hab das jetzt so geschrieben:

    AUX_RGBImageRec* loadBMP(const char* Filename) {
        AUX_RGBImageRec* tImage = auxDIBImageLoad(Filename), * Image = tImage;
    
        for (unsigned int y = 0; y < tImage->sizeY; ++y) {
            for (unsigned int x = 0; x < tImage->sizeX; ++x) {
                Image->data[ y*x+x ] = tImage->data[ (tImage->sizeY-y-1)*x+x ];
            }
        }
    
        return Image;
    }
    

    Das Bild ist mit dieser Funktion immer noch gespiegelt und die Pixel sind nach oben hin zunehmend dstark 'verkrisselt' 🙄



  • ich fasse nochmal zusammen:
    1. du hast ein bild der groesse sizeX * sizeY pixel
    2. jeder pixel besteht aus drei bytes (rot,gruen,blau)
    3. eine bildzeile ist also sizeX * 3 bytes gross (siehe oben)
    4. das gesamte bild ist also sizeX*sizeY*3 bytes gross (so viel speicher brauchst du)
    5. eine bildzeile y beginnt an position y*sizeX*3



  • Wunderbar, ich komm der Sache schon näher. Danke schon mal 🙂
    Allerdings spiegelt meine Funktion jetzt nur die Hälfte

    for (unsigned int y = 0; y < tImage->sizeY; ++y) {
            for (unsigned int x = 0; x < tImage->sizeX*3; ++x) {
                Image->data[y*tImage->sizeX*3+x] = tImage->data[(tImage->sizeY-y-1)*tImage->sizeX*3+x];
            }
        }
    


  • Fehler gefunden! Ich hatte zwei mal den selben Pointer, ich lad das Bild einfach zwei mal, oder wie könnte ich das besser machen?



  • tausche die bytes anstatt zu ueberschreiben, dann brauchste auch kein zweites image. beachte dann die abbruchbedingung der aeusseren schleife.



  • Stimmt, gute Idee.
    Danke für deine Hilfe 😃



  • schoen dass ich dich dazu ermutigen konnte, dich "selbststaendig" mit der loesung des problems zu beschaeftigen.
    beim naechsten mal koenntest du ja vielleicht schon versuchen, kleinere fehler selber zu beheben bevor du ins forum schreibst 😉


Anmelden zum Antworten