但是,如果您所说的“位图”真的是指位图(即,只有未压缩的像素数据的原始图像文件),那就很简单了:
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 当然是可行的(它几乎已经是原始像素数据),但大多数其他类型需要大量工作/研究。他们经常使用复杂的压缩算法。我建议您为此使用一个库,仅用于将其转换为原始像素数据。
Corona 是一个好(小)的(http://corona.sourceforge.net/),或 DevIL(http://openil.sourceforge.net/)或其他数千个 :)