使用 image.Decode 解码 JPEG 并写入 PDF 时颜色不正确?
php小编子墨在使用image.Decode解码JPEG并写入PDF时遇到了一个问题,就是颜色不正确。这个问题可能是由于颜色空间的不匹配所导致的。在解码JPEG图像时,需要确保图像的颜色空间与PDF的颜色空间相匹配,否则会导致颜色不正确的问题。解决这个问题的方法是,可以尝试使用image.DecodeConfig函数获取JPEG图像的颜色模式,然后将其与PDF的颜色空间进行匹配,确保一致性。另外,还可以尝试使用其他的图像处理库或者调整图像的颜色空间来解决这个问题。
问题内容
我尝试使用 image.decode()
方法解码图像文件(png、jpg、gif 和 bmp 格式)来创建 pdf,以获取 image.image
。然后,我将像素数据写入 pdf 流,随后进行压缩。我遇到的问题是,当我解码 jpeg 时,生成的 pdf 中的颜色不正确。所有其他图像格式均按预期工作。我已附上该问题的屏幕截图。
截图: https://i.stack.imgur.com/e3hc8.png
有人知道是什么原因导致这个问题吗?使用 image.decode()
时是否需要以不同方式处理 jpeg 的特定方式?任何有关如何解决此问题的建议将不胜感激!
编辑:
代码:
var idata image.image ifile, err := os.open(path) if err != nil { [...] } else { idata, _, err = image.decode(ifile) }
[...] 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() x.Write([]byte{byte(r), byte(g), byte(b)}) } } [...]
直接使用 jpeg.decode
时,pdf 中生成的图像看起来相同。
我希望生成的 pdf 中的图像看起来就像原始 png 一样,但可能会有些退化。
原始png:https://i.stack.imgur.com/rnkgq.png
转换后的 jpg:https://i.stack.imgur.com/yj69y.jpg
其他 jpeg 也有同样的问题,例如来自 w3c 的第一个测试 jpeg https://www.w3.org/markup/test/xhtml-print/20050519/tests/a_2_1-bf-01.htm
解决方法
color.rgba()
返回 alpha 预乘颜色分量0..0xffff
的范围。
像 byte(r)
这样的值转换为 byte
将保留其最低 8 位,与原始值相比,这似乎只是随机的。您需要一个 8 位颜色分量,不要将其转换为 byte
而是使用高 8 位,这意味着右移 8(或除以 256):
x.write([]byte{byte(r>>8), byte(g>>8), byte(b>>8)})
解释为什么它仍然适用于 png 和 gif,但不适用于 jpeg:
解码 png 和 gif 图像可能使用使用 color.rgba
颜色模型,使用 8 位值存储组件。但其 rgba.rgba()
方法通过复制原始 8 位值将这些值转换为 16 位值:
func (c RGBA) RGBA() (r, g, b, a uint32) { r = uint32(c.R) r |= r << 8 g = uint32(c.G) g |= g << 8 b = uint32(c.B) b |= b << 8 a = uint32(c.A) a |= a << 8 return }
这意味着如果您采用低 8 位,您将获得与采用高 8 位相同的原始值。解码 jpeg 图像可能会使用 color.ycbcr
颜色类型,它不会重现此“实现行为”。
不要依赖于此。当您需要 16 位组件中的 8 位组件时,请始终使用较高的 8 位。
以上是使用 image.Decode 解码 JPEG 并写入 PDF 时颜色不正确?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...

本文讨论了通过go.mod,涵盖规范,更新和冲突解决方案管理GO模块依赖关系。它强调了最佳实践,例如语义版本控制和定期更新。

本文讨论了GO中使用表驱动的测试,该方法使用测试用例表来测试具有多个输入和结果的功能。它突出了诸如提高的可读性,降低重复,可伸缩性,一致性和A
