gpt4 book ai didi

c++ - C++中的图像处理

转载 作者:行者123 更新时间:2023-11-30 04:32:48 25 4
gpt4 key购买 nike

我想读取一个原始文件,它有 3 个交错并且大小大约 (3.5MB) 大到一个三维数组中。我用来读取文件的代码是:

ifile.open(argv[2], ios::in|ios::binary);
for(int i=0; i<1278; i++){
for(int j=0; j<968; j++){
for(int k=0; k<3; k++){
Imagedata1[i][j][k]=ifile.get();
}
}
}

问题是这个数组不是我期望的那样。我需要 1278 作为图像的宽度。968 作为高度,3 个字节是 RGB 值。我应该怎么写从文件中读取的代码,以便正确填充数组。谢谢。

最佳答案

首先,图片文件的存储方式通常是从小到大,颜色值,列,行的顺序。你没有按那个顺序阅读它们。

ifile.open(argv[2], ios::in|ios::binary);
for(int j=0; j<968; j++){
for(int i=0; i<1278; i++){
for(int k=0; k<3; k++){
Imagedata1[i][j][k]=ifile.get();
}
}
}

这就是循环的安排方式,尽管您可能想重命名变量以保持顺畅:

ifile.open(argv[2], ios::in|ios::binary);
for(int row=0; row<968; row++){
for(int col=0; col<1278; col++){
for(int color=0; color<3; color++){
Imagedata1[col][row][color]=ifile.get();
}
}
}

其次,您分配数组的方式确实很糟糕且效率低下。这是它应该如何工作:

#include <iostream>
#include <fstream>

class ColorValue {
public:
ColorValue(unsigned char r, unsigned char g, unsigned char b)
: r_(r), g_(g), b_(b) {}
ColorValue() : r_(0), g_(0), b_(0) {}

unsigned char getR() const { return r_; }
unsigned char getG() const { return g_; }
unsigned char getB() const { return b_; }

private:
unsigned char r_, g_, b_;
};

void readrows(const char *fname, ColorValue imagedata[][1278])
{
::std::ifstream ifile;
ifile.open(fname, ::std::ios::in|::std::ios::binary);
for (int row = 0; row < 968; ++row) {
for (int col = 0; col < 1278; ++col) {
char r, g, b;
ifile.get(r);
ifile.get(g);
ifile.get(b);
imagedata[row][col] = ColorValue(r, g, b);
}
}
}

int main(int argc, const char *argv[])
{
ColorValue (*imagedata)[1278] = new ColorValue[968][1278];
readrows(argv[1], imagedata);
delete[] imagedata;
}

ColorValue 使用类可以避免在代码中到处为“r”、“g”和“b”组件使用魔法索引。并且以这种方式分配数组可以使用于图像的所有内存保持连续,并删除多个不必要的间接级别。它们都具有使您的程序对缓存更加友好的特性。

我还找到了a nice article that's a really comprehensive treatment of multi-dimensional arrays in C++ .

关于c++ - C++中的图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376988/

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