使用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
相关产品推荐
相关产品推荐

