我正在尝试创建一个读取图像的程序(从位图开始,因为它们是最简单的),在图像中搜索特定参数(即(255,0,0)的一个像素,然后其中一个(0,0,255))并以某种方式更改像素(仅在程序中,而不是保存到原始文件。)然后显示它。
我正在使用Windows,简单的GDI作为首选项,我想避免使用自定义库,因为我想真正了解我正在为此测试程序做些什么。
有人可以帮忙吗?以任何方式?一个网站?建议吗?示例代码?
由于
答案 0 :(得分:4)
但是如果通过“位图”你真的是一个位图(也就是原始图像文件,只有未压缩的像素数据),那就相当容易了:
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/)或其他千人:)
答案 1 :(得分:2)
如果“位图”是指BMP,则维基百科的位数和字节数为pretty comprehensive description