无法从数组中获取值 (c)

标签 c arrays

我正在从 ppm 文件中读取代码,并将每个像素的值存储在 p1(像素数组)中,它是 .red .green .blue (int) 的结构。然而,我设法创建了图片的“负过滤器”。我试图通过取红色、绿色和蓝色像素的平均值来获得黑色和白色。 我有像素 p1、像素 p2(负滤光片)和 int p3(黑白)。然而,每个具有 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 黑白扩展。然后计算RGB的平均值并将其分配给int p3,然后写入.pgm。

我在使用 int p3 时得到的结果是,当我运行 .exe 时它崩溃了,停止工作而没有给出任何错误。

当我使用 char p3 时,它运行完美,但它给出了所有像素平均值的所有负值。 (感谢@egoteclair,通过将 unsigned 放在字符前面已经得到了帮助)

我的新问题是为什么我不能使用 int 而不是 unsigned char?

最佳答案

正常字符大小为 8 位。第一位将用于符号扩展。在 24 位 png 文件中,每个颜色字段包含 8 位。

24 / 3 = 8

所以尝试使用unsigned char而不是char。这允许您使用该字符的完整 8 位。

关于无法从数组中获取值 (c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43734053/

相关文章:

c - 为什么我的整个数组有 '\0' ?

c - 如何修复 Expected Identifiers 错误 C 语言

java - 增强的 for 语句如何用于数组,以及如何获取数组的迭代器?

java - 对应的排列数

c - 解释 proc/<pid>/maps 输出的不同行

c - 为什么在C中打印分数结果时得到0?

C++ 将数组及其长度传递给函数(使用宏/内联函数?)

arrays - Postgresql 数组总和

c - glibc 源中的系统调用在哪里

ios - Swift 2 中数组的扩展