Jump to content
  • Advertisement
Sign in to follow this  
scheisskopf

memcmp & bitmaps

This topic is 4828 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

i am trying to find an instance of a small bitmap in a screen grab of a window. so far i have managed to load both bitmaps into two BYTE arrays. I found some code which searches through the bitmaps and uses memcmp to see if the smaller one is present in the larger. the trouble is, i am having trouble with the memcmp function:
memcmp(ScreenBmp[tmpY],CardBmp[x],  card_line_length )
What should ScreenBmp and CardBmp represent. I have the two bitmaps in BYTE buffer arrays, so how can i get them into the format above. The code i used to get them into these arrays is below:
   HANDLE hBitMap = LoadImage(0, "img.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    
    BITMAP bitmap;
    GetObject(hBitMap,sizeof(BITMAP),&bitmap);
    int size = bitmap.bmHeight*bitmap.bmWidth*bitmap.bmBitsPixel/8;
   /// cout << bitmap.bmHeight << endl;
    BYTE *lpBits = new BYTE[ size ];
    
    GetBitmapBits((HBITMAP)hBitMap,size,lpBits );
    
    //delete []lpBits;
    
   HANDLE hBitMap2 = LoadImage(0, "img2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    
    BITMAP bitmap2;
    GetObject(hBitMap2,sizeof(BITMAP),&bitmap2);
    int size2 = bitmap2.bmHeight*bitmap2.bmWidth*bitmap2.bmBitsPixel/8;
   /// cout << bitmap.bmHeight << endl;
    BYTE *lpBits2 = new BYTE[ size2 ];
    
    GetBitmapBits((HBITMAP)hBitMap2,size2,lpBits2 );
cheers!

Share this post


Link to post
Share on other sites
Advertisement
Quote:
Original post by scheisskopf
i am trying to find an instance of a small bitmap in a screen grab of a window.

so far i have managed to load both bitmaps into two BYTE arrays. I found some code which searches through the bitmaps and uses memcmp to see if the smaller one is present in the larger. the trouble is, i am having trouble with the memcmp function:

memcmp(ScreenBmp[tmpY],CardBmp[x],  card_line_length )


What should ScreenBmp and CardBmp represent. I have the two bitmaps in BYTE buffer arrays, so how can i get them into the format above.


Well, the memcmp line you present is obviously taken from someone elses code and the question of how to map your arrays to the ones presented in the memcmp line cannot be answered without a more complete listing.
Anyway, you can probably find this answer yourself by reading the MSDN entry on memcmp.

Tom

Share this post


Link to post
Share on other sites
well i didn't want to post my complete code, but heregoes anyway (you can find the memcmp function at the bottom):

int main() {

HANDLE hBitMap = LoadImage(0, "img.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

BITMAP bitmap;
GetObject(hBitMap,sizeof(BITMAP),&bitmap);
int size = bitmap.bmHeight*bitmap.bmWidth*bitmap.bmBitsPixel/8;

BYTE *lpBits = new BYTE[ size ];

GetBitmapBits((HBITMAP)hBitMap,size,lpBits );

HANDLE hBitMap2 = LoadImage(0, "img2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

BITMAP bitmap2;
GetObject(hBitMap2,sizeof(BITMAP),&bitmap2);
int size2 = bitmap2.bmHeight*bitmap2.bmWidth*bitmap2.bmBitsPixel/8;

BYTE *lpBits2 = new BYTE[ size2 ];

GetBitmapBits((HBITMAP)hBitMap2,size2,lpBits2 );

int ScreenWidth = bitmap2.bmWidth;
int ScreenHeight = bitmap2.bmHeight;
int numOfCard = 1;
int cardHeight = bitmap.bmHeight;
int card_line_length = bitmap.bmWidth;


for( int i = 0 ; i < ScreenWidth; i++ ) {
for( int j = 0 ; j < ScreenHeight; j++ ) {
for ( int k= 0; k < numOfCard; k++ ) {
int tmpY = j;
for ( int x = 0; x < cardHeight; x++ ) {
if ( memcmp(lpBits2[tmpY],lpBits[x], card_line_length ) != 0 )
break; // we didnt find macth of a line
tmpY++; // move to next line
}
if ( x == cardHeight) {
cout << "found";
}
}
}
}

system("PAUSE");
return 0;
}


As you can see, i have changed it a little to
memcmp(lpBits2[tmpY],lpBits[x],  card_line_length )


i know how memcmp works, i am having trouble with getting the bitmaps bits

Share this post


Link to post
Share on other sites
Quote:
Original post by scheisskopf
well i didn't want to post my complete code, but heregoes anyway (you can find the memcmp function at the bottom):

*** code ***

As you can see, i have changed it a little to
memcmp(lpBits2[tmpY],lpBits[x],  card_line_length )


i know how memcmp works, i am having trouble with getting the bitmaps bits


I don't know anything about BITMAP functions, so if your problem is related to the bitmap part I can't help. I may have misunderstood your initial post that your problem was with memcpy.

Anyway, I do notice two problems in your code:
- If the bmBitsPixel is different for bitmap1 and bitmap2, a comparison is impossible and your function should immediately conclude that bitmap2 is not present in bitmap1.
- The value of card_line_length in itself is correct, but when used in the memcmp (which requires the length in bytes not pixels) it should be multiplied with the bmBitsPixel/8 value, which is guaranteed to be the same value for bitmap1 and bitmap2 if you followed my first advice.

Tom

[Edited by - dimebolt on August 24, 2005 7:26:48 AM]

Share this post


Link to post
Share on other sites
To get more info, you can visit my post at code guru: http://www.codeguru.com/forum/showthread.php?t=353760&page=2

i am shore both for loop part and the part which loads the images is fine, but i do not know what to put in memcpy.

the for loops loop over each pixel in the gui image, and for each, loops over the smaller images lines to see if there is a match. if there is a match for all lines in the smaller picture, then it's present in the larger gui image.

i don't know what to put into memcpy. at present i have a buffer byte array, as i was instructed. but i do not know how to use this to see if the pixels are similar.

cheers

Share this post


Link to post
Share on other sites
Quote:
Original post by scheisskopf
i don't know what to put into memcpy. at present i have a buffer byte array, as i was instructed. but i do not know how to use this to see if the pixels are similar.

That's what memcmp does for you. It will do a byte-by-byte comparison of the two buffers. If memcmp returns 0 the contents of the two lines are identical. If you follow the advice in my previous post, the parameters you provide to memcmp are probably correct and your program may just work...

Tom

Note that I wrote 'memcpy' in my previous post, but I edited it to the correct 'memcmp'...

EDIT: and I made the same mistake in this post too :)

Share this post


Link to post
Share on other sites
i followed your advice, however i am still getting the same error:


invalid types `unsigned char[int]' for array subscript


this corresponds to my memcmp line!

i didn't even know that lpBits was multidimensional

Share this post


Link to post
Share on other sites
Quote:
Original post by scheisskopf
i followed your advice, however i am still getting the same error:


invalid types `unsigned char[int]' for array subscript


this corresponds to my memcmp line!

i didn't even know that lpBits was multidimensional


Ah, yes I overlooked that.

Change the memcmp to this:
memcmp((void *)(lpBits2 + i + tmpY * ScreenWidth), (void *)(lpBits + x), card_line_length * bitmap2.bmBitsPixel / 8)

That should essentially do the same as the [][] without requiring lpBits2 to be 2 dimensional.

Tom

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!