Firsly sorry to those in charge if you think I am reposting. My last thread changed topics basically, so maybe should get a more descriptive name.
Secondly, I have written the following method to look for one bitmap inside another larger bitmap. The bitmaps are both 24 bit so I am converting the pixel data into 4 bytes and comparing the first three for each pixel.
I think I am pretty close, but it always returns false even if the smaller image does exist inside the other. Can anyone spot the error of my ways?
Code:
bool comparePixelData(fstream &dFileLarge, Image &dInfoLarge, fstream &dFileSmall, Image &dInfoSmall)
{
unsigned int pixelLarge[dInfoLarge.imageWidth][dInfoLarge.imageHeight];
unsigned int pixelSmall[dInfoSmall.imageWidth][dInfoSmall.imageHeight];
unsigned char bytesLargeImage[4], bytesSmallImage[4];
bool badPixel;
// Iterate through every row
for (int fullRow = 0; fullRow < dInfoLarge.imageWidth; fullRow++)
{
// Iterate through every pixel in the row
for (int fullColumn = 0; fullColumn < dInfoLarge.imageHeight; fullColumn++)
{
bytesLargeImage[0] = (pixelLarge[fullRow][fullColumn] >> 24) & 0xFF;
bytesLargeImage[1] = (pixelLarge[fullRow][fullColumn] >> 16) & 0xFF;
bytesLargeImage[2] = (pixelLarge[fullRow][fullColumn] >> 8) & 0xFF;
bytesLargeImage[3] = pixelLarge[fullRow][fullColumn] & 0xFF;
bytesSmallImage[0] = (pixelSmall[0][0] >> 24) & 0xFF;
bytesSmallImage[1] = (pixelSmall[0][0] >> 16) & 0xFF;
bytesSmallImage[2] = (pixelSmall[0][0] >> 8) & 0xFF;
bytesSmallImage[3] = pixelSmall[0][0] & 0xFF;
// If the current pixel on the full image is the
// same as the top left pixel on the small image...
if ((bytesLargeImage[0] == bytesSmallImage[0]) && (bytesLargeImage[1] == bytesSmallImage[1]) && (bytesLargeImage[2] == bytesSmallImage[2]))
{
// So far, we haven't found a mismatched pixel
badPixel = false;
// Iterate through every row in the small image
for (int smallRow = 0; smallRow < dInfoSmall.imageWidth; smallRow++)
{
// Iterate through every pixel in the row
for (int smallColumn = 0; smallColumn < dInfoSmall.imageHeight; smallColumn++)
{
bytesLargeImage[0] = (pixelLarge[fullRow + smallRow][fullColumn + smallColumn] >> 24) & 0xFF;
bytesLargeImage[1] = (pixelLarge[fullRow + smallRow][fullColumn + smallColumn] >> 16) & 0xFF;
bytesLargeImage[2] = (pixelLarge[fullRow + smallRow][fullColumn + smallColumn] >> 8) & 0xFF;
bytesLargeImage[3] = pixelLarge[fullRow + smallRow][fullColumn + smallColumn] & 0xFF;
bytesSmallImage[0] = (pixelSmall[smallRow][smallColumn] >> 24) & 0xFF;
bytesSmallImage[1] = (pixelSmall[smallRow][smallColumn] >> 16) & 0xFF;
bytesSmallImage[2] = (pixelSmall[smallRow][smallColumn] >> 8) & 0xFF;
bytesSmallImage[3] = pixelSmall[smallRow][smallColumn] & 0xFF;
// If the pixel on the full image isn't the same as on the small image...
if ((bytesLargeImage[0] != bytesSmallImage[0]) | (bytesLargeImage[1] != bytesSmallImage[1]) | (bytesLargeImage[2] != bytesSmallImage[2]))
{
// There is a mismatched pixel so set bad pixel to true
badPixel = true;
// Break out of inner loop
break;
}
}
// If we found a bad pixel, break out of outer loop
if (badPixel == true)
{
break;
}
}
// If we passed through all pixels in small image, return location
if (badPixel == false)
{
return true;
}
}
}
}
// If we looped until here, not match was found
return false;
}
Thanks