使用Libraw读取RAW文件转DNG后颜色异常及尺寸不符问题求助
使用LibRaw导出DNG文件后颜色异常、尺寸不匹配问题
背景
我使用Libraw读取RAW文件(通常为NEF格式),流程运行正常。经过部分处理后需要将RAW图像保存为DNG格式文件,但在Photoshop中打开导出的DNG文件时,颜色显示异常。
为获取CFA阵列,我通过RawProcessor.COLOR读取阵列前两行两列的取值,得到的阵列为\00\01\01\02,之后我通过如下代码写入RAW图像数据:
const int width = RawProcessor.imgdata.sizes.raw_width; const int height = RawProcessor.imgdata.sizes.raw_height; const std::array<float, 9> color_matrix = { raw_color.cam_xyz[0][0], raw_color.cam_xyz[0][1], raw_color.cam_xyz[0][2], raw_color.cam_xyz[1][0], raw_color.cam_xyz[1][1], raw_color.cam_xyz[1][2], raw_color.cam_xyz[2][0], raw_color.cam_xyz[2][1], raw_color.cam_xyz[2][2], }; const std::array<float, 3> as_shot_neutral = { 1.0f / (raw_color.cam_mul[0] / raw_color.cam_mul[1]), 1.f, 1.0f / (raw_color.cam_mul[2] / raw_color.cam_mul[1]) }; const auto base_black_level = static_cast<float>(raw_color.black); std::array<float, 4> black_level = { base_black_level + static_cast<float>(raw_color.cblack[0]), base_black_level + static_cast<float>(raw_color.cblack[1]), base_black_level + static_cast<float>(raw_color.cblack[2]), base_black_level + static_cast<float>(raw_color.cblack[3]) }; if (raw_color.cblack[4] == 2 && raw_color.cblack[5] == 2) { for (int x = 0; x < raw_color.cblack[4]; ++x) { for (int y = 0; y < raw_color.cblack[5]; ++y) { const auto index = y * 2 + x; black_level[index] = raw_color.cblack[6 + index]; } } } static const uint32_t white_level = raw_color.maximum; static const short bayerPatternDimensions[] = { 2, 2 }; TIFF* tif = TIFFOpen(strAddr.c_str(), "w"); TIFFSetField(tif, TIFFTAG_DNGVERSION, "\01\01\00\00"); TIFFSetField(tif, TIFFTAG_SUBFILETYPE, 0); TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CFA); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); TIFFSetField(tif, TIFFTAG_CFAREPEATPATTERNDIM, bayerPatternDimensions); TIFFSetField(tif, TIFFTAG_CFAPATTERN, 4, "\00\01\01\02"); TIFFSetField(tif, TIFFTAG_MAKE, "DNG"); TIFFSetField(tif, TIFFTAG_UNIQUECAMERAMODEL, "DNG"); TIFFSetField(tif, TIFFTAG_COLORMATRIX1, 9, &color_matrix ); TIFFSetField(tif, TIFFTAG_ASSHOTNEUTRAL, 3, &as_shot_neutral ); TIFFSetField(tif, TIFFTAG_BLACKLEVEL, 4, &black_level); TIFFSetField(tif, TIFFTAG_WHITELEVEL, 1, &white_level); for (int i = 0; i < height; i++) TIFFWriteScanline(tif, &RawProcessor.imgdata.rawdata.raw_image[(i)*width], i, 0); TIFFWriteDirectory(tif); TIFFClose(tif);
我通过RawProcessor.imgdata.color.cam_xyz获取相机转XYZ色彩矩阵,该矩阵为4行3列结构,我舍弃最后一行得到使用的cam_xyz。cam_mul取自RawProcessor.imgdata.color.cam_mul的4个元素,舍弃最后一个元素后取倒数传入TIFF标签。
补充:LibRaw读取RAW文件代码
LibRaw RawProcessor; int ret; if ((ret = RawProcessor.open_file(strAddr.c_str())) != LIBRAW_SUCCESS) return false; // Unpack the image if ((ret = RawProcessor.unpack()) != LIBRAW_SUCCESS) return false; // Data unpacking ret = RawProcessor.dcraw_process(); if (LIBRAW_SUCCESS != ret) // error at the previous step return false; else // Successful document processing { std::cout << "Successful document processing..." << std::endl; // Process the RAW data }
采集到的参数
cam_xyz取值如下:
[1.0405 -0.3755 -0.127 -0.5461 1.3787 0.1793 -0.104 0.2015 0.6785 0 0 0 ]
cam_mul取值为:[1.78906, 1, 1.67969, 1]
问题描述
- 主要问题:导出的DNG在Photoshop中打开后颜色不正确,推测可能是色彩矩阵或白平衡参数设置错误导致。
- 次要问题:原NEF文件在Photoshop中打开的尺寸为5504x8256,但导出的DNG文件尺寸为5520x8288,查看到的参数
RawProcessor.imgdata.sizes.top_margin为0,RawProcessor.imgdata.sizes.left_margin为2,和其他软件打开NEF得到的尺寸参数不匹配。
测试说明:使用尼康D850样图测试均会得到类似结果。
内容的提问来源于stack exchange,提问作者user3178756
相关产品推荐
相关产品推荐

