【发布时间】:2019-12-05 10:07:48
【问题描述】:
我将 bmp 文件加载到 CImg 对象中,并将其保存到 pfm 文件中。成功的。而这个 .pfm 文件我正在将它用于另一个库,但是这个库不接受 big-endian,只接受 little endian。
CImg<float> image;
image.load_bmp(_T("D:\\Temp\\memorial.bmp"));
image.normalize(0.0, 1.0);
image.save_pfm(_T("D:\\Temp\\memorial.pfm"));
那么,如何将 bmp 文件保存到 pfm 文件 为 little endian,not big endian 。 . 有可能吗?
后期编辑:
我检查了 .pfm 头文件中的前 5 个元素。这是没有 invert_endianness 的结果:
CImg<float> image;
image.load_bmp(_T("D:\\Temp\\memorial.bmp"));
image.normalize(0.0, 1.0);
image.save_pfm(_T("D:\\Temp\\memorial.pfm"));
PF
512
768
1.0
=øøù=€€=‘>
这是invert_endianness的结果:
CImg<float> image;
image.load_bmp(_T("D:\\Temp\\memorial.bmp"));
image.invert_endianness();
image.normalize(0.0, 1.0);
image.save_pfm(_T("D:\\Temp\\memorial.pfm"));
PF
512
768
1.0
?yôx?!ù=‚ì:„ç‹?
结果是一样的。
【问题讨论】:
-
将使用和不使用
invert_endianness()获得的 PFM 标题行添加到您的问题中。 Scale Factor / Endianness 行是最重要的。 -
太好了,这就是我需要的输出。事实上,它看起来不像是反转字节序。如果您这样做会发生什么:1. 读取 BMP,2. 写入 PFM。 3. 阅读 PFM。 4. 反转字节序。 5. 再次写入 PFM。我在想
CImg可能无法在 BMP 上反转字节顺序 - 但这是一个远景。 -
...但有一件事:您显示的 PFM 文件中的 实际 图像字节在使用和不使用
invert_endianness时是不同的。如果您手动进入并将比例因子/字节序从1.0更改为-1.0,会发生什么?或者如果你image.invert_endianness();之后image.normalize(0.0, 1.0);?无论如何,那些标准化值应该做什么?我觉得它们有点奇怪。 -
好的,但是您使用的实际值与我在文档中看到的示例中使用的值不同。我自己刚刚下载了
CImg并会尝试一下。 -
您好 Ted,我几天不在办公室。我会尝试你的解决方案,我会让你知道结果。
标签: c++ image image-processing visual-c++ cimg