diff options
Diffstat (limited to 'Build/source/utils/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc')
-rw-r--r-- | Build/source/utils/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc b/Build/source/utils/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc new file mode 100644 index 00000000000..63e0c8a7368 --- /dev/null +++ b/Build/source/utils/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc @@ -0,0 +1,85 @@ +#include <cstdio> +#include <cstdlib> +#include <vector> + +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" + +#include "tinyexr.h" + +int main(int argc, char** argv) +{ + if (argc < 3) { + printf("Usage: ldr2exr input.[png|bmp|tga|jpg|...] output.exr\n"); + printf(" NOTE: Supported LDR image format = stb_image can load.\n"); + printf(" NOTE: Input pixel value [0, 255] is mapped to [0.0, 1.0] in output EXR file.\n"); + printf(" NOTE: Only supports RGB pixel format.\n"); + + exit(-1); + } + + int width, height; + int n; + unsigned char *rgb = stbi_load(argv[1], &width, &height, &n, 0); + if (!rgb || n != 3) { + return -1; + } + + EXRHeader header; + InitEXRHeader(&header); + + EXRImage image; + InitEXRImage(&image); + + image.num_channels = 3; + + std::vector<float> images[3]; + images[0].resize(width * height); + images[1].resize(width * height); + images[2].resize(width * height); + + for (int i = 0; i < width * height; i++) { + images[0][i] = rgb[3*i+0] / 255.0f; + images[1][i] = rgb[3*i+1] / 255.0f; + images[2][i] = rgb[3*i+2] / 255.0f; + } + + float* image_ptr[3]; + image_ptr[0] = &(images[2].at(0)); // B + image_ptr[1] = &(images[1].at(0)); // G + image_ptr[2] = &(images[0].at(0)); // R + + image.images = (unsigned char**)image_ptr; + image.width = width; + image.height = height; + + header.num_channels = 3; + header.channels = (EXRChannelInfo *)malloc(sizeof(EXRChannelInfo) * header.num_channels); + // Must be BGR(A) order, since most of EXR viewers expect this channel order. + strncpy(header.channels[0].name, "B", 255); header.channels[0].name[strlen("B")] = '\0'; + strncpy(header.channels[1].name, "G", 255); header.channels[1].name[strlen("G")] = '\0'; + strncpy(header.channels[2].name, "R", 255); header.channels[2].name[strlen("R")] = '\0'; + + header.pixel_types = (int *)malloc(sizeof(int) * header.num_channels); + header.requested_pixel_types = (int *)malloc(sizeof(int) * header.num_channels); + for (int i = 0; i < header.num_channels; i++) { + header.pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; // pixel type of input image + header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_HALF; // pixel type of output image to be stored in .EXR + } + + const char* err; + int ret = SaveEXRImageToFile(&image, &header, argv[2], &err); + if (ret != TINYEXR_SUCCESS) { + fprintf(stderr, "Save EXR err: %s\n", err); + return ret; + } + printf("Saved exr file. [ %s ] \n", argv[2]); + + free(rgb); + + free(header.channels); + free(header.pixel_types); + free(header.requested_pixel_types); + + return 0; +} |