2010-05-01 119 views
3

我试图创建一个程序,该程序读取图像(以位图开始,因为它们是最简单的),通过图像搜索特定参数(即一个像素(255,0,0),然后是(0,0,255)之一),并以某种方式更改像素(仅在程序中,不保存到原始文件中),然后显示它。C++读取和编辑位图图像的像素

我使用Windows,简单的GDI为首选项,我想避免自定义库仅仅是因为我想真正理解我为这个测试程序做了什么。

任何人都可以帮忙吗?以任何方式?一个网站?建议吗?示例代码?

感谢

+0

读取其中的图像?从磁盘还是以某种形式存在于内存中? – 2010-05-01 18:12:05

+0

从磁盘读入内存,然后对内存版本进行检查 – BettyD 2010-05-01 18:13:52

回答

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肯定是可行的(它几乎是原始像素数据),但大多数其他类型需要大量的工作/研究。他们经常使用复杂的压缩算法。我建议你为此将使用一个库,只是为了将其转换为原始像素数据。

科罗纳是一个很好的(小)一个(http://corona.sourceforge.net/),还是魔鬼(http://openil.sourceforge.net/)或几千人:)