OpenEXR RgbaOutputFile переворачивается в Nuke - PullRequest
1 голос
/ 28 января 2020

Я пытался создать EXR-изображения из библиотеки OpenEXR, но изображение попадает в 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, так и много разных типов сжатия. Я не уверен, что мне не хватает в этом процессе.

Кто-нибудь знает, почему это произойдет? Есть ли исправление для этого?

1 Ответ

1 голос
/ 30 января 2020

Было сказано, что изображение, переворачиваемое в DJV, на самом деле было ошибкой в ​​DJV и рассматривается в следующем выпуске: https://github.com/darbyjohnston/DJV/issues/195

Настоящая проблема здесь заключалась в том, что изображение было перевернуто при чтении из RenderTexture.

Решение, которое я нашел, состояло в том, чтобы использовать двумерный массив для l oop, чтобы перевернуть пиксели в коде C ++ перед вызовом RgbaOutputFile.

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