gpt4 book ai didi

c - 如何将 PPM (P3) 图像中的像素数据读取到 C 中的矩阵中?

转载 作者:行者123 更新时间:2023-11-30 14:59:55 25 4
gpt4 key购买 nike

我想要一个矩阵,每行对应一个像素,每列对应 PPM P3 图像的 R G B 值。

我尝试创建一个以 [imageWidth * imageHeight] [3] 作为大小的矩阵,然后填充它,但它似乎需要很长时间。我想我错过了一些东西,任何人都可以解释我哪里出错了,或者建议更好的方法来做到这一点?

  int  pixels [imageSize] [3];

while(fgets(line,70,fd) != NULL){
for ( column = 0; column < (imageSize); column++){
for ( row = 0; row < 1; row++){
sscanf(line, "%d %d %d", &r, &g, &b );
pixels [column] [row] = r;
pixels [column] [row + 1] = g;
pixels [column] [row + 2] = b;
}
}
}

Line指的是fgets函数读入的行。

最佳答案

修改后的代码中的问题很明显:您尝试从每个栅格线读取图像的所有像素。这不会永远运行,除非fgets()无限期地阻塞,但如果光栅尺寸很大并且文件由许多行像素组织,那么可能需要很长时间。无论如何,它都是错误,因为在最外层循环的每次迭代中(即,对于读取的每一行),它都会覆盖所有先前分配的像素值。

此外,您最内层的循环虽然实际上没有错误,但非常令人困惑。它总是只执行一次迭代;它的迭代变量row实际上索引了像素分量(而不是栅格的行),并且row在每次迭代中都具有值0。最好直接删除它。

总的来说,你让这件事变得比实际需要的更加困难。 PPM P3 格式的设计方式使其易于通过更简单的代码进行输入。有效的 PPM P3 文件中的每个样本都保证前后有空格。另一方面,字段的位置和宽度以及每行的数量不是固定的。总之,这些特征使得这是相对罕见的情况之一,其中 fscanf() 实际上是比 fgets() + sscanf() 更好的选择>。行长度限制使得后者也相当不错,但您不需要带来额外的复杂性。

假设您想要从 fd 指定的 FILE 读取 imageSize 像素,最初使用该 FILE位于光栅第一行的第一个字符,这将达到目的:

for (pixel = 0; pixel < imageSize; pixel++) {
int numScanned = fscanf(fd, "%d %d %d",
&pixels[pixel][0],
&pixels[pixel][1],
&pixels[pixel][2]);
if (numScanned < 3) {
// ... handle file format or I/O error ...
break;
}
}

关于c - 如何将 PPM (P3) 图像中的像素数据读取到 C 中的矩阵中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42401067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com