用c++读取原始图像文件

Reading a raw image file with C++

本文关键字:图像 文件 原始 读取 c++      更新时间:2023-10-16

我有两个相同的c++代码,它们分别读取相同的。raw图像文件,如下所示:

this->file_variable = fopen(filename, "r")

它们处理其中的信息如下:

status = fread ((void *)this->img1,
  sizeof(float),
  (this->width * this->height),
  this->file_variable)
)

这两个代码之间的唯一区别是它们是在不同的盒子上编译的,但是我从imag1数组得到了完全不同的结果。我完全不知道如何开始调试这个。谁能告诉我正确的方向?

编辑:我正在慢慢地获得更多关于文件的信息。它们是(宽x高)1800 x 1728像素,1通道,8位深度。

听起来文件是用二进制格式编写的,所以您需要同样打开它:

this->file_variable = fopen(filename, "rb")

如果没有"b",将被读取为ASCII

现在我明白你的问题了。你的数据是以大端序存储的,你在一个小端序系统上读取它。您只需通过反转字节顺序来转换每个浮点数。使用如下函数(取自其他地方的类似答案):

float ReverseFloat( const float inFloat )
{
float retVal;
char *floatToConvert = ( char* ) & inFloat;
char *returnFloat = ( char* ) & retVal;
// swap the bytes into a temporary buffer
returnFloat[0] = floatToConvert[3];
returnFloat[1] = floatToConvert[2];
returnFloat[2] = floatToConvert[1];
returnFloat[3] = floatToConvert[0];
return retVal;
}

不能保证值的二进制(!)格式在不同的机器上是相同的。其他的this->值从哪里来?

这是一个很好的函数来翻转任何变量的字节顺序,它可以很容易地用来改变字节序。

void byteFlip(void* original, size_t numberOfBytes)
{
    char* reversed = (char*) malloc(numberOfBytes);
    for (int i = 0; i < numberOfBytes; i++)
    {
        reversed[i] = ((char*)original)[numberOfBytes - i - 1];
    }
    memcpy(original, reversed, numberOfBytes);
    free(reversed);
}

This将翻转'original'参数中使用的变量的字节顺序。例子:

short a = 512;
//AAAAAAAA BBBBBBBB - 00000010 00000000
cout << a << endl; //outputs 512
byteFlip(&a, sizeof(short)); //flip byte order of 'a'
//BBBBBBBB AAAAAAAA - 00000000 00000010
cout << a << endl; //outputs 2

解释:这个函数接受一个指向任意类型变量的指针,以及该变量的字节大小。由于我们正在反转字节顺序,并且1个字符= 1个字节,因此我们可以将此处理为与反转字符串相同的方式。创建一个与变量大小相同的新字符串来保存反转后的数据。现在使用for循环将每个字节以字符的形式倒序复制到反转字符数组变量中。一旦循环完成,就可以将反向字符串的内存复制到原始指针中。最后,我们释放了反向字符串变量的内存,因为它已经被复制到原始指针中,因此不再需要它了。