用c++读取原始图像文件
Reading a raw image file with C++
我有两个相同的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循环将每个字节以字符的形式倒序复制到反转字符数组变量中。一旦循环完成,就可以将反向字符串的内存复制到原始指针中。最后,我们释放了反向字符串变量的内存,因为它已经被复制到原始指针中,因此不再需要它了。
相关文章:
- 在qt窗口中具有图像,而无需将图像文件本身作为源
- 如何从所选目录(位于listWidget中)中筛选图像文件
- 如何将图像文件夹添加到CMake项目以便在c ++可执行文件中使用这些图像?
- 解码并保存 base64 C++中的图像文件
- BASE64图像文件用C 编码
- 如何在使用 c++/COM 发送时在电子邮件中插入/嵌入图像文件(.png)
- 如何使用Imebra库将压缩像素(用我自己的编码器压缩)回到DICOM图像文件中
- 使用 Imread 打开具有 Unicode 名称的图像文件
- 如何使用stb_image将像素颜色数据写入 BMP 图像文件?
- C 读取/写作PPM图像文件灰色图像
- 如何在C 中删除或删除.jpg和.dpx图像文件
- C++图像处理 - 将图像文件读入 2D 数组
- 将图像文件(.BMP)复制到其他位置
- 从位图图像文件读取像素数据值
- Boost:Asio.从服务器下载图像文件
- 打开不同的图像文件,并使用GDI 库在主应用程序窗口的背景上绘制它们
- 使用 QPixmap 和 QLabel 在 Qt Creator 中以编程方式添加图像文件 (.PNG)
- C++:将整数的文本文件转换为BMP格式的位图图像文件
- 读取/写入PPM图像文件C++
- 将C++图像文件转换为数组