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

使用image.Decode解码JPEG并写入PDF时颜色异常求助

JPEG解码写入PDF后颜色异常问题解决

问题描述

通过image.Decode()解码PNG、JPG、GIF、BMP格式图片,得到image.Image对象后将像素数据写入PDF流(后续会压缩)。目前遇到的问题是:解码JPEG并写入PDF后颜色显示异常,但其他格式图片均正常。直接使用jpeg.Decode也会出现同样的颜色异常,所有JPEG文件都存在该问题。期望PDF中的图片效果与原PNG一致,允许轻微画质损失。

原因分析

核心问题在于color.Color.RGBA()方法返回的红、绿、蓝分量是16位无符号整数(范围0~65535),而代码中直接将其转为byte(仅保留低8位),导致颜色值被错误截断。正确的8位RGB分量应该取16位值的高8位(即右移8位),直接转byte会取低8位,造成颜色失真。

另外,JPEG图片解码后通常以image.YCbCr格式存储,虽然调用RGBA()会自动转换为RGB颜色空间,但转换后的16位值仍需正确转换为8位才能符合PDF的DeviceRGB要求。

修复方案

将RGBA()返回的每个分量右移8位,得到正确的8位RGB值后再写入PDF流。

修改后的代码示例

[...]
x.Dictionary.Set("ColorSpace", "/DeviceRGB")
x.Dictionary.Set("BitsPerComponent", 8)
for j := 0; j < iData.Bounds().Dy()/pixelMul; j++ {
    for k := 0; k < iData.Bounds().Dx()/pixelMul; k++ {
        r, g, b, _ := iData.At(k*pixelMul, j*pixelMul).RGBA()
        // 将16位RGBA分量转换为8位RGB
        r8 := byte(r >> 8)
        g8 := byte(g >> 8)
        b8 := byte(b >> 8)
        x.Write([]byte{r8, g8, b8})
    }
}
[...]

验证效果

修改后,JPEG图片写入PDF的颜色会与原图片一致,其他格式图片的处理不受影响(因为它们的RGBA()返回值同样是16位,右移8位是通用的正确转换方式)。

内容的提问来源于stack exchange,提问作者Sett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:45:31