- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将一个 bmp 文件加载到一个 CImg 对象中,并将它保存到 pfm 文件中。成功的。我将这个 .pfm 文件用于另一个库,但是这个库不接受大端,只接受小端。
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,不是 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?!ù=‚ì:„ç‹?
结果是一样的。
最佳答案
这绝对不是一个正确的答案,但暂时可以作为一种解决方法。
我没有找到如何使用 CImg
的函数正确地反转字节顺序,所以我修改了生成的文件。这是一个黑客。结果在 GIMP 中打开很好,看起来非常接近原始图像,但我不能说它是否适用于您正在使用的库。可能值得一试。
代码中的注释:
#include "CImg/CImg.h"
#include <algorithm>
#include <filesystem> // >= C++17 must be selected as Language Standard
#include <ios>
#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
using namespace cimg_library;
namespace fs = std::filesystem;
// a class to remove temporary files
class remove_after_use {
public:
remove_after_use(const std::string& filename) : name(filename) {}
remove_after_use(const remove_after_use&) = delete;
remove_after_use& operator=(const remove_after_use&) = delete;
const char* c_str() const { return name.c_str(); }
operator std::string const& () const { return name; }
~remove_after_use() {
try {
fs::remove(name);
}
catch (const std::exception & ex) {
std::cerr << "remove_after_use: " << ex.what() << "\n";
}
}
private:
std::string name;
};
// The function to hack the file saved by CImg
template<typename T>
bool save_pfm_endianness_inverted(const T& img, const std::string& filename) {
remove_after_use tempfile("tmp.pfm");
// get CImg's endianness inverted image and save it to a temporary file
img.get_invert_endianness().save_pfm(tempfile.c_str());
// open the final file
std::ofstream os(filename, std::ios::binary);
// read "tmp.pfm" and modify
// The Scale Factor / Endianness line
if (std::ifstream is; os && (is = std::ifstream(tempfile, std::ios::binary))) {
std::string lines[3];
// Read the 3 PFM header lines as they happen to be formatted by
// CImg. Will maybe not work with another library.
size_t co = 0;
for (; co < std::size(lines) && std::getline(is, lines[co]); ++co);
if (co == std::size(lines)) { // success
// write the first two lines back unharmed:
os << lines[0] << '\n' << lines[1] << '\n';
if (lines[2].empty()) {
std::cerr << "something is wrong with the pfm header\n";
return false;
}
// add a '-' if it's missing, remove it if it's there:
if (lines[2][0] == '-') { // remove the - to invert
os << lines[2].substr(1);
}
else { // add a - to invert
os << '-' << lines[2] << '\n';
}
// copy all the rest as-is:
std::copy(std::istreambuf_iterator<char>(is),
std::istreambuf_iterator<char>{},
std::ostreambuf_iterator<char>(os));
}
else {
std::cerr << "failed reading pfm header\n";
return false;
}
}
else {
std::cerr << "opening files failed\n";
return false;
}
return true;
}
int main()
{
CImg<float> img("memorial.bmp");
img.normalize(0.f, 1.f);
std::cout << "saved ok: " << std::boolalpha
<< save_pfm_endianness_inverted(img, "memorial.pfm") << "\n";
}
关于c++ - 将 exr/pfm 保存为小端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59192684/
我将一个 bmp 文件加载到一个 CImg 对象中,并将它保存到 pfm 文件中。成功的。我将这个 .pfm 文件用于另一个库,但是这个库不接受大端,只接受小端。 CImg image;
我在 RGB 颜色空间中有一个 16 位 .exr 图像序列。当我使用以下方法将其转换为 .mp4 时: ffmpeg -start_frame 1100 -i input.$04d.exr outp
我正在寻找一个可以从 OpenEXR 图像序列创建 Quicktime 影片 (PhotoJpeg) 的编码器。 任何帮助将不胜感激 最佳答案 DJV Imaging 0.7.0 Beta 似乎可以解
我正在使用 OpenCV for Android 来加载 EXR 图像: String testImgPath = "/storage/sdcard0/test2.exr"; //I know bet
我使用 blender 生成了一些深度图,并以 OpenEXR 格式保存了 z 缓冲区值(32 位)。有没有办法使用 OpenCV 2.4.13 和 python 2.7 从 .exr 文件(逐像素深
我正在尝试将一些位图文件转换为自定义图像(exr、pfm 等),然后再转换回位图: CImg image(_T("D:\\Temp\\test.bmp")); image.normalize(0.0,
对于我当前正在创建的 2d 自上而下的基于图 block 的游戏,我需要将包含高度图数据的 .exr 文件解析到我的 mongodb 中(或将其转换为其他格式,然后读入数据库)。 这基本上是我的游戏世
我正在尝试加载两个 exr 文件并将它们加载到 gui 上的标签中,以便我可以并排查看这两个文件。我可以让一个工作,但是当我尝试加载两个 python 时都会崩溃。下面是我的代码: def exrTo
我目前正在使用 OpenEXR 进行一个项目,我想实现一些 Blob 检测算法。为此,我想我可以使用 OpenCV,因为它在文档中说它可以打开 OpenEXR 格式文件。 我已经安装并运行了所有的库,
我正在尝试以原始分辨率将 EXR 转换为 h264:MOV。它会创建 QT,但是当我回放它时,它会循环播放前 24 帧,一遍又一遍,似乎是帧序列的持续时间。 下面是我正在运行的命令,以及输出: /us
我想读取 exr 文件格式的图像并查看相应位置的像素强度。并且还想将它们堆叠在一起以将它们放入神经网络。我怎样才能对这些格式进行正常的图像处理?请帮我做这件事! 我已经使用 OpenEXR 文件尝试过
以下代码不起作用,它在将图像写入磁盘之前将值转换为 np.uint8。 import cv2 import numpy as np # Generate dummy gradient with flo
我正在使用 ffmpeg 4.3.1 将一些 EXR 转换为 mp4,并使用源中扩展范围的色调映射和 mp4 的 rec709 转换。 我正在使用这个命令: ffmpeg -pattern_type
我只是想将 EXR 转换为 jpg 图像,但我的结果变得非常暗。有谁知道我在这里做错了什么?我正在规范化图像值,然后将它们放入 0-255 颜色空间。尽管如此,它仍然看起来不正确。 测试 exr 图片
我正在使用 OpenEXR 在 Python 中读取 EXR 文件。我有带半数据 (float16) 的 R、G 和 B channel 。我尝试使用 Numpy 将数据从 float16 转换为 u
我正在将 RGB 图像转换为 EXR 格式,使用 openexr ,如下: int w = 1024; int h = 768; Array2D p (h, w); QString fileName
我是一名优秀的程序员,十分优秀!