RGBA - Bild dynamisch skalieren



  • Hallo,

    ich möchte versuchen, bei einem RGBA-Bild dessen Größe dynamisch zu skalieren.
    Allerdings weiß ich leider nicht genau wie ich das anstellen kann. Ich greife ja auf die Indizies des Array zu und nicht direkt auf den Grauwert für eine Mittelwertbildung.

    Die Value

    unsigned char* frame
    

    beinhaltet die Bilddaten.

    Die grobe Struktur eines gelesenen Bildes mit angedachter Skalierung:

    ...
    
    // Größe 320x240
    if( skal_variable < 1) || skal_variable > 1) ) {
       frame_width  = 320*skal_variable;
       frame_width = 240*skal_variable;
    }
    else {
       frame_width  = 320;
       frame_width = 240;
    }
    
    ...
    
    for ( int y=0; y<frame_height; y++ ) {
     for ( int x=0; x<frame_width; x++ ) {
    
         index_red   = x*frame_deep + y*frame_width*frame_deep + RED;
         index_green = x*frame_deep + y*frame_width*frame_deep + GREEN;
         index_blue  = x*frame_deep + y*frame_width*frame_deep + BLUE;
         index_alpha = x*frame_deep + y*frame_width*frame_deep + ALPHA;
    
         color[RED]   = frame[index_red];
         color[GREEN] = frame[index_green];
         color[BLUE]  = frame[index_blue];
         color[ALPHA] = frame[index_alpha]; 
     }
    }
    ...
    

    Bei Kleinere liest er ja noch Werte, sieht aber nicht besonders gut aus, bei Größer hat er ja logischer Weise keine Werte mehr.

    Hätte jemand eine Idee oder kennt eine gute Seite zum Nachlesen.
    Beim googlen kam unter "Bild dynamisch skalieren" nicht sehr viel informatives.

    Gruß und Dank



  • dad_an_der_fh schrieb:

    Ich greife ja auf die Indizies des Array zu und nicht direkt auf den Grauwert für eine Mittelwertbildung.
    [...]
    Bei Kleinere liest er ja noch Werte, sieht aber nicht besonders gut aus, bei Größer hat er ja logischer Weise keine Werte mehr.

    Dieses Problem wurde IMHO nicht ausreichend genau geschildert, um eine hilfreiche Antwort zu geben.
    Fragen clever stellen

    Dieses Posting wurde nicht automatisch generiert sondern per Hand eingefügt. Beschwerden werden trotzdem ignoriert.

    Disclaimer: dies ist kein direkter persönlicher Angriff.

    Bye, TGGC (Reden wie die Großen)



  • Such doch mal nach Texturemapping-Tutorials, die das ganze noch per Software angehen (ohne HW-Beschleunigung).



  • dad_an_der_fh schrieb:

    if( skal_variable < 1) || skal_variable > 1) ) {
       frame_width  = 320*skal_variable;
       frame_width = 240*skal_variable;
    }
    

    😕 😕

    [quote="dad_an_der_fh"]

    else {
       frame_width  = 320;   //  <-- Hast Du noch einen anderen Thread, der genau während dieser Millisekunden die Variable auslesen soll??
       frame_width = 240;
    }
    

    [quote]

    😕 😕 😕



  • Als erstes, ich bin kein guter C/C++ Programmierer.
    Mein Stil ist nicht sehr gut, aber ich bemühe mich.

    Zum Problem:

    Das Bild ist ein BMP welches mit

    auxDIBImageLoadA(Filename);
    

    eingelesen wird.
    So erhalte ich die reinen Daten und die Größe.

    Die reinen Daten liegen danach als unsigned char vor.
    Sie werden in folgender Schleife verarbeitet.

    // Größe 320x240 des ausgangsbildes
    unsigned char* Chromakey::applyChromaKey( unsigned char* frame, int xsize, int ysize, double skal_variable )
    
    if ( frame == 0 )
       return 0;
    
    frame_width = xsize;
    frame_height = ysize;
    
    //skal_variable ist dynamisch, also von 0-unendl.
    if( skal_variable < 1) || skal_variable > 1) ) {
       //Größenwerte erhöhen und vermindern
       frame_width  = 320*skal_variable;
       frame_width = 240*skal_variable;
    }
    else {
       //originale Größe
       frame_width  = 320;
       frame_width = 240;
    }
    
    ...
    //jede zeile und spalte wird eingelesen
    
    for ( int y=0; y<frame_height; y++ ) {
     for ( int x=0; x<frame_width; x++ ) {
    
         //index auf den farbwert für die gegebene position wird übergeben
         index_red   = x*frame_deep + y*frame_width*frame_deep + RED;
         index_green = x*frame_deep + y*frame_width*frame_deep + GREEN;
         index_blue  = x*frame_deep + y*frame_width*frame_deep + BLUE;
         index_alpha = x*frame_deep + y*frame_width*frame_deep + ALPHA;
    
         //farbwert wird übergeben
         color[RED]   = frame[index_red];
         color[GREEN] = frame[index_green];
         color[BLUE]  = frame[index_blue];
         color[ALPHA] = frame[index_alpha];
    
         if(Pixel ...)
         {...
           //ein Pixel (Rot 20, Blau 234, Gruen 115), wird durch einen anderen Pixel ersetzt. (Chromakey)
          ...}
          else {
            //alles bleibt so
          }
    
     }
    }
    
    ...
    
    return frame;
    
    ...
    
    //frame wird dann am Monitor ausgegeben
    

    Die Schleife läuft jede 40ms für das komplette Bild ab.
    Ist nun aber die Größe des Bildes auf das Doppelte (640x480) verändert, fehlt dem Frame-Array ja dafür ein verfügbarer Index-Wert für die Farbe an der letzen Position zu Beispiel. Er hat ja nur Werte bis 320x240.

    Ich müßte demnach Indexwerte für die Positionen danach selber schreiben.
    Jedoch welche Werte nehm ich dafür?

    Wie errechne ich diese Werte?

    Wie lasse ich das dynamisch?

    Gruß und Dank



  • Du willst also einfach das Bild kopieren und es dabei Strecken? Dann brauchst doch einfach nur das Inverse durchführen, um zu wissen, wo die Pixel gelesen werden.

    dad_an_der_fh schrieb:

    Jedoch welche Werte nehm ich dafür?

    Die gestauchten Koordinaten.

    dad_an_der_fh schrieb:

    Wie errechne ich diese Werte?

    Durch Stauchung.

    dad_an_der_fh schrieb:

    Wie lasse ich das dynamisch?

    Ich denke mal, indem du es einfach nicht statisch machst.

    Bye, TGGC \-/



  • dad_an_der_fh schrieb:

    Ist nun aber die Größe des Bildes auf das Doppelte (640x480) verändert, fehlt dem Frame-Array ja dafür ein verfügbarer Index-Wert für die Farbe an der letzen Position zu Beispiel. Er hat ja nur Werte bis 320x240.

    Ich müßte demnach Indexwerte für die Positionen danach selber schreiben.
    Jedoch welche Werte nehm ich dafür?

    Du könntest ganz billig anfangen und jeden Pixel 2x nehmen...


Anmelden zum Antworten