Speichrezugriff auf Bilddaten



  • Hallo, und zwar versuch ich gerade ein Bild auszulesen: Ich erhalte erfolgreich die einen Pointer auf einen 24 Bit speicher:

    Bilddaten:
    Type: BMP
    Größe: 2x5
    Farbe: alle Pixel sind rot (255,0,0)

    Vielleicht findet jemand von euch einen Fehler?

    for( int y=0; y < (int)dwCompareHeight; y++ )
    {
    	for( int x=0; x < (int)dwCompareWidth; x++ )
    	{
    		if( _srcBitsPerPixel == 24 )
    		{
    			BYTE *bytePixelSrc = &((BYTE*)lpSrcBits)[y*_srcWidthBytes+x*(_srcBitsPerPixel/8)];
    
    			BYTE b = bytePixelSrc[0];
    			BYTE g = bytePixelSrc[1];
    			BYTE r = bytePixelSrc[2];
    			printf( "\n %i, %i, %i", r, g, b);
    		}
    
    	}//for
    }//for
    

    Resultat:

    255, 0, 0
     255, 0, 0
     0, 0, 255
     0, 0, 255
     0, 255, 0
     0, 255, 0
     255, 0, 0
     255, 0, 0
     205, 205, 205
     205, 205, 205
    


  • Hab den Fehler:

    BYTE *bytePixelCmp = &((BYTE*)lpCmpBits)[(y*_cmpWidth+x)*(_cmpBitsPerPixel/8)];
    BYTE *bytePixelSrc = &((BYTE*)lpSrcBits)[(y*_srcWidth+x)*(_srcBitsPerPixel/8)];
    


  • Hi, leider fehlt hier eine kleinigkeit, die ich nicht gebacken bekomme:

    Ich muss schauen dass ich die Zeile an die "richtige" Zeilenbreite anpasse. Oft ist es so, dass die Breite des Daten größer ist, als die Breite des eig. BIldes.

    Das ist hier sicher der Fall - ich kann leide rnoch nicht sagen wie ich das bewerkstelligen kann:

    BYTE *bytePixelSrc = &((BYTE*)lpSrcBits)[y*_srcWidthBytes+(x*(_srcBitsPerPixel/8))];
    BYTE *bytePixelCmp = &((BYTE*)lpCmpBits)[y*_cmpBitsPerPixel+(x*(_cmpBitsPerPixel/8))];
    

    Eigentlich sollte das hier funktionieren: Oder sieht jemand hier ein Problem?



  • MEine natürlich (ist mir gerade ein kleiner Unterlaufen). Daber es klappt immer noch nicht.

    BYTE *bytePixelSrc = &((BYTE*)lpSrcBits)[y*_srcWidthBytes+(x*(_srcBitsPerPixel/8))];
    BYTE *bytePixelCmp = &((BYTE*)lpCmpBits)[y*_cmpWidthBytes+(x*(_cmpBitsPerPixel/8))];
    


  • Das BMP-Format von Windows richtet die Daten einer Bildzeile immer auf ein vielfaches von 4 Byte aus, egal welche Bittiefe.

    Du musst bloss _srcWidthBytes in deiner Formel anpassen.

    So ungefähr sieht das dann aus:

    _srcWidthBytes = ((bitmapwidth*(bitperpixel/8))+3)&~3;
    

    Feyd


Anmelden zum Antworten