使用C ++读取原始图像文件

时间:2013-04-04 18:13:17

标签: c++ image

我有两个相同的C ++代码,每个代码都读取相同的.raw图像文件:

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

他们处理其中的信息:

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

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

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

4 个答案:

答案 0 :(得分:2)

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

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

没有“b”,它被读作ASCII。

答案 1 :(得分:1)

现在我看到了你的问题。您的数据以big endian存储,您可以在一个小端系统上读取它。您需要通过反转字节顺序简单地转换每个浮点数。使用这样的函数(取自其他地方的类似答案):

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;
}

答案 2 :(得分:0)

无法保证不同计算机上的二进制(!)格式的值相同。其他this->值来自何处?

答案 3 :(得分:0)

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

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);
}

这将翻转'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循环将每个字节以相反的顺序复制为反转字符数组变量。循环完成后,我们可以将反转字符串的内存复制到原始指针中。最后,我们释放了反向字符串变量的内存,因为它已被复制到原始指针中,因此不再需要。

相关问题