我正在读取ppm文件中的代码,并将每个像素的值存储在p1,像素数组中,这是.red .green .blue(int)的结构。我设法创建了一个"负过滤器"但是,这张照片。我试图通过采用红色,绿色和蓝色像素的平均值来获得黑白。 我有像素p1,像素p2(负滤波器)和int p3(b& w)。但是,每个有p3 = ....的动作都会停止响应。比如
for (i = 0; i < WIDTH; i++) {
for (j = 0; j < HEIGHT; j++) {
p3[i][j] = ((p1[i][j].red + p1[i][j].green + p1[i][j].blue)/3);
}
}
或
for (i = 0; i < WIDTH; i++) {
for (j = 0; j < HEIGHT; j++) {
fprintf(pf3, "%d", p3[i][j]);
}
}
然而,当我将int p3 [WIDTH] [HEIGHT]更改为char p3 [WIDTH] [HEIGHT]时,程序运行但输出错误。 int和char都编译成功。有人能帮我吗?感谢。
编辑: 我希望通过将.ppm值输入到.red,.green和.blue中的像素p1 [WIDTH] [HEIGHT],我可以创建.ppm的.pgm黑白图片扩展名.ppm。然后计算RGB的平均值,并在写入.pgm之前将其分配到int p3中。
使用int p3时得到的内容,当我运行.exe停止工作而没有出现任何错误时崩溃。
当我使用char p3时,它运行得很好,但它给出了所有像素均值的所有负值。 (感谢@egoteclair,将这个字母放在未签名的前面已经得到了帮助)
我的新问题是为什么我不能使用int而不是unsigned char?
答案 0 :(得分:1)
正常字符大小为8位。第一位将用于符号扩展。在24位png文件中,每个颜色字段包含8位。
24 / 3 = 8
因此尝试使用unsigned char而不是char。这允许您使用char的完整8位。