c++ - 在Nuke中翻转OpenEXR RgbaOutputFile

标签 c++ image nuke openexr

我一直在尝试从OpenEXR库创建EXR图像,但是该图像倒置进入Nuke中。唯一看起来像我期望的那样渲染图像的是DJV。

我得到一个看起来正确的视觉文件,其中立方体朝向图像底部,光源位于顶部边缘,在DJV中使用DECREASING_Y:
DJV_EXR

但是,当我将同一幅图像带入Nuke时,它是将图像上下颠倒地显示,立方体朝向图像的顶部,而光位于底部的边缘:
Nuke_EXR

Photoshop似乎也发生了同样的事情。

这是我用来尝试创建图像的代码:

RgbaOutputFile file(filename, width, height, WRITE_RGBA, 1, IMATH_NAMESPACE::V2f(0, 0), 1, DECREASING_Y, Imf_2_3::Compression::ZIPS_COMPRESSION);
file.setFrameBuffer(pixels, 1, width);
file.writePixels(height);

我尝试同时使用INCREASING_Y和DECREASING_Y以及使用许多不同的压缩类型。我不确定在此过程中缺少什么。

有谁知道为什么会这样?有解决办法吗?

最佳答案

被告知在DJV中翻转的图像实际上是DJV的一个错误,正在研究下一个版本:https://github.com/darbyjohnston/DJV/issues/195

真正的问题是,当从RenderTexture读取图像时,图像颠倒了。

我发现的解决方案是在调用RgbaOutputFile之前,使用2D数组进行循环以翻转C++代码中的像素。

Rgba *flippedPixels = new Rgba[width * height];

for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
    {
        // Set top scanline of flippedPixels to be bottom scanline of pixels
        flippedPixels[(((height - 1) - i) * width) + j] = pixels[(i * width) + j];
    }
}

RgbaOutputFile file(filename, width, height, WRITE_RGBA, 1, IMATH_NAMESPACE::V2f(0, 0), 1, INCREASING_Y, Imf_2_3::Compression::ZIPS_COMPRESSION);
file.setFrameBuffer(flippedPixels, 1, width); // Use flippedPixels instead of pixels
file.writePixels(height);

delete flippedPixels;

关于c++ - 在Nuke中翻转OpenEXR RgbaOutputFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59940738/

相关文章:

c++ - 与精确值的 double / float 比较

c++ - 如何获得最小的 SDL 程序以在 visual studio 2008 express 中编译和链接?

c++ - 有没有办法强制用户显式指定模板参数类型?

css - 如何为 NextGen masonry gallery 设置图像大小

python - 为什么在 CLI 模式下 Read() 不读取帧范围?

python - 使用 python 设置 nuke 中下拉菜单的默认值

python - 如何在 Nuke 脚本中找到所有 ReadGeo 节点?

c# - CLR 在调用 C++ 函数时如何避免 thunking?

php - 通过 PHP 上传 Wordpress 附件

node.js - 使用 Sharp 包进行图像操作的好例子?