Но если под «растровым изображением» вы на самом деле подразумевали растровое изображение (то есть необработанный файл изображения, содержащий только несжатые данные пикселей), это довольно просто:
char *filename = "filename";
FILE *input = fopen(filename, "rb+");
if (!input)
{
printf("Could not open input file '%s'\n", filename);
system("PAUSE");
return 1;
}
fseek(input, 0, SEEK_END);
size_t size = ftell(input);
rewind(input);
char *buffer = (char *) malloc(size);
if (!buffer)
{
printf("Out of memory, could not allocate %u bytes\n", size);
system("PAUSE");
return 1;
}
if (fread(buffer, 1, size, input) != size)
{
printf("Could not read from input file '%s'\n", filename);
free(buffer);
fclose(input);
system("PAUSE");
return 1;
}
fclose(input);
// we loaded the file from disk into memory now
for (size_t i = 0; (i + 3) < size; i += 4)
{
if (buffer[i + 0] == 0xFF && buffer[i + 1] == 0x00 && buffer[i + 2] == 0x00 && buffer[i + 3] == 0x00)
{
printf("Pixel %i is red\n", (i / 4));
}
}
free(buffer);
Извините, это стиль C, но вы можете легко изменить распределение на стиль C ++. Лично мне нравится способ чтения файлов на C, хотя.
Обычно вы хотите, чтобы оператор if проверял, является ли пиксель красного цвета макросом / функцией. Это сделает оператор if наподобие «if (compare_4bytes (buffer, 0xFF000000))» ».
Также предполагается, что загруженный файл полностью состоит из необработанных данных пикселей. Если это не так, т.е. Вы читаете .bmp / .png / .jpg или что-то еще, вы должны сначала загрузить, а затем преобразовать файл в памяти в необработанные данные пикселей. Это будет сделано в комментарии, говорящем
«мы загрузили файл с диска в память».
BMP, безусловно, выполнимо (это уже почти необработанные пиксельные данные), но большинству других типов требуется МНОГО работы / исследований. Они часто используют сложные алгоритмы сжатия. Я предлагаю вам использовать библиотеку для этого, просто для преобразования ее в необработанные пиксельные данные.
Корона хорошая (маленькая) (http://corona.sourceforge.net/), или DevIL (http://openil.sourceforge.net/) или тысячи других:)