From ce5548e658f5e477aa7a29c07173cc537e4ba353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net> Date: Tue, 17 Jan 2023 15:22:21 +0100 Subject: [PATCH] `save_exr`: fix incorrect header --- src/tinyexr_wrapper.cu | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/tinyexr_wrapper.cu b/src/tinyexr_wrapper.cu index 096716d..ea1608c 100644 --- a/src/tinyexr_wrapper.cu +++ b/src/tinyexr_wrapper.cu @@ -54,28 +54,28 @@ __global__ void interleave_and_cast_kernel(const uint32_t num_pixels, bool has_a *((uint64_t*)&out[i*4]) = *((uint64_t*)&rgba_out[0]); } -void save_exr(const float* data, int width, int height, int nChannels, int channelStride, const char* outfilename) { +void save_exr(const float* data, int width, int height, int n_channels, int channel_stride, const char* outfilename) { EXRHeader header; InitEXRHeader(&header); EXRImage image; InitEXRImage(&image); - image.num_channels = nChannels; + image.num_channels = n_channels; - std::vector<std::vector<float>> images(nChannels); - std::vector<float*> image_ptr(nChannels); - for (int i = 0; i < nChannels; ++i) { + std::vector<std::vector<float>> images(n_channels); + std::vector<float*> image_ptr(n_channels); + for (int i = 0; i < n_channels; ++i) { images[i].resize(width * height); } - for (int i = 0; i < nChannels; ++i) { - image_ptr[i] = images[nChannels - i - 1].data(); + for (int i = 0; i < n_channels; ++i) { + image_ptr[i] = images[n_channels - i - 1].data(); } for (size_t i = 0; i < (size_t)width * height; i++) { - for (int c = 0; c < nChannels; ++c) { - images[c][i] = data[channelStride*i+c]; + for (int c = 0; c < n_channels; ++c) { + images[c][i] = data[channel_stride * i + c]; } } @@ -83,18 +83,16 @@ void save_exr(const float* data, int width, int height, int nChannels, int chann image.width = width; image.height = height; - header.num_channels = nChannels; + header.num_channels = n_channels; header.channels = (EXRChannelInfo *)malloc(sizeof(EXRChannelInfo) * header.num_channels); + // Must be (A)BGR order, since most of EXR viewers expect this channel order. - strncpy(header.channels[0].name, "B", 255); header.channels[0].name[strlen("B")] = '\0'; - if (nChannels > 1) { - strncpy(header.channels[1].name, "G", 255); header.channels[1].name[strlen("G")] = '\0'; - } - if (nChannels > 2) { - strncpy(header.channels[2].name, "R", 255); header.channels[2].name[strlen("R")] = '\0'; - } - if (nChannels > 3) { - strncpy(header.channels[3].name, "A", 255); header.channels[3].name[strlen("A")] = '\0'; + const char* channel_names[] = { + "R", "G", "B", "A" + }; + + for (size_t i = 0; i < n_channels; ++i) { + strncpy(header.channels[i].name, channel_names[n_channels - i - 1], 255); } header.pixel_types = (int *)malloc(sizeof(int) * header.num_channels); -- GitLab