CBitmap vergleichen



  • hallo,

    ich habe 2 CBitmap-Objekte und möchte deren pixel vergleichen...

    ich moment mache ich es so, dass ich jedes bild in einen device-context
    lade und die pixel mit

    GetPixel(x,y);
    

    abfrage und vergeiche!

    gibt es eine schnellere methode? weil das ist ziemlich systemlastig!

    danke euch 🙂



  • Ich würde es so machen: Zuerst holst du dir per CGdiObject::GetObject() die Größenangaben beider Bitmaps (wenn die nicht übereinstimmen, kannst du schon aufhören). Danach holst du dir über CBitmap::GetBitmapBits() den Bild-Inhalt als Byte-Array und vergleichst ihn per memcpy().



  • // ####### Bild laden ####### 
    CBitmap tmp_bitmap1;
    tmp_bitmap1.LoadBitmap(IDB_BITMAP1);
    
    BITMAP bmp1;
    
    tmp_bitmap1.GetBitmap(&bmp1);
    
    BYTE* bmpBuffer=new BYTE[bmp1.bmWidth*bmp1.bmHeight*bmp1.bmBitsPixel];
    
    DWORD test1=tmp_bitmap1.GetBitmapBits(bmp1.bmWidth*bmp1.bmHeight*bmp1.bmBitsPixel,bmpBuffer);
    
    // ####### probiere auf die bits des bildes zuzugreifen <-- test!! ####### 
    int red,green,blue;
    
    red = *bmpBuffer & 0x1f;
    green = (*bmpBuffer>>5) & 0x1f;
    blue = (*bmpBuffer>>10) & 0x1;
    
    CString tmp_string;
    tmp_string.Format("%i %i %i",(red << 3) + (red >> 2),(green << 3) + (green >> 2),(blue << 3) + (blue >> 2));
    MessageBox(tmp_string);
    

    hey ja danke schonmal 🙂

    ich habe hier ein wenig rumprobiert denn ich möchte auch an die RGB-Werte
    kommen...

    kann ich so auf die Bits des bildes zugreifen? also im moment klappt es noch nicht!

    also wie kann ich (hier) auf bmpBuffer zugreiffen und auslesen?

    danke



  • Erstmal eine Korrektur meiner Aussage: GetBitmapBits() brauchst du eignetlich nicht - du kannst aus der BITMAP-Struktur direkt auf die Daten des Bitmaps zugreifen (über den Member bmBits ).

    Dann zu deiner Frage: In dem Datenbereich liegen die Bildpunkte hintereinander angeordnet - bmHeight Zeilen à bmWidth Punkte à bmBitsPixel/8 Bytes. (wie diese Bytes in RGB aufgeteilt sind, hängt von der Datendarstellung ab)

    PS: Schau dir mal die Beschreibung der BITMAP Struktur in der MSDN an 😉



  • hallo,
    ich versuche gerade etwas ähnliches und hätte da mal ein paar fragen

    wieso &0x1f ?
    und warum dann nich auch bei blau?

    und das mit der addition versteh ich auch nich so recht.

    hoffe ihr könnt mir helfen



  • metaljack schrieb:

    wieso &0x1f ?
    und warum dann nich auch bei blau?

    und das mit der addition versteh ich auch nich so recht.

    Ich vermute mal, das ist ein (allerdings verunglückter) Versuch, 16-Bit-Farben in ihre Bestandteile zu zerlegen. Kurz: So kommt man ziemlich sicher NICHT ans Ziel.



  • also.
    erstma zum bmpBuffer:

    so funzt es:(für jedes i-te Pixel bei 0 beginnend)

    blau=*(bmpBuffer+4*i);
    gruen=*(bmpBuffer+4*i+1);
    rot=*(bmpBuffer+4*i+2);
    

    das 4te Byte is bei mir immer leer.

    dann hätt ich mal noch ne frage:

    ist es möglich ein angezeigtes bild(Bitmap) in ein CBitmap zu bekommen? quasi um "life" die Bilddaten auszulesen.



  • metaljack schrieb:

    also.
    erstma zum bmpBuffer:

    so funzt es:(für jedes i-te Pixel bei 0 beginnend)

    blau=*(bmpBuffer+4*i);
    gruen=*(bmpBuffer+4*i+1);
    rot=*(bmpBuffer+4*i+2);
    

    das 4te Byte is bei mir immer leer.

    Es gibt verschiedene Möglichkeiten, die Farben RGB auf Bytes zu verteilen (je nach Farbauflösung) - u.a. auch Schwarz/Weiß (1 Bit pro Pixel), 16 Bit (da müsstest du 2 Bytes zusammenfassen und mit Bit-Operatoren zerlegen) oder 24 Bit (das Format liest du mit deinem Code)). Da wäre es noch vorteilhaft, die übrigen Member des BITMAP auszuwerten, um das verwendete Format herauszufinden.

    dann hätt ich mal noch ne frage:

    ist es möglich ein angezeigtes bild(Bitmap) in ein CBitmap zu bekommen? quasi um "life" die Bilddaten auszulesen.

    Ja, indem du dir einen CDC des Bildschirms holst und dann per GetCurrentBitmap() an die Bitmap-Daten gelangst.
    (ohne Garantie)


Log in to reply