You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:36:05