L'éditeur PHP Zimo a rencontré un problème lors de l'utilisation de image.Decode pour décoder le JPEG et l'écrire au format PDF, c'est-à-dire que la couleur était incorrecte. Ce problème peut être dû à une inadéquation dans les espaces colorimétriques. Lors du décodage d'une image JPEG, vous devez vous assurer que l'espace colorimétrique de l'image correspond à l'espace colorimétrique du PDF, sinon cela entraînera des couleurs incorrectes. Pour résoudre ce problème, vous pouvez essayer d'utiliser la fonction image.DecodeConfig pour obtenir le mode couleur de l'image JPEG, puis le faire correspondre avec l'espace colorimétrique du PDF pour garantir la cohérence. De plus, vous pouvez également essayer d'utiliser d'autres bibliothèques de traitement d'image ou ajuster l'espace colorimétrique de l'image pour résoudre ce problème.
J'ai essayé d'utiliser image.decode()
方法解码图像文件(png、jpg、gif 和 bmp 格式)来创建 pdf,以获取 image.image
. J'écris ensuite les données de pixels dans un flux PDF, puis je les compresse. Le problème que j'ai est que lorsque je décode le jpeg, les couleurs du pdf résultant sont incorrectes. Tous les autres formats d'image fonctionnent comme prévu. J'ai joint une capture d'écran du problème.
Capture d'écran : https://i.stack.imgur.com/e3hc8.png
Est-ce que quelqu'un sait ce qui cause ce problème ? Existe-t-il une manière spécifique de gérer les fichiers JPEG différemment lorsque j'utilise image.decode()
? Toute suggestion sur la façon de résoudre ce problème serait grandement appréciée !
Éditeur :
Code :
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)}) } } [...]
Lorsque vous utilisez jpeg.decode
directement, l'image résultante dans le pdf est la même.
Je veux que les images du pdf généré ressemblent aux png originaux, mais peut-être avec une certaine dégradation.
PNG original : https://i.stack.imgur.com/rnkgq.png
Jpg converti : https://i.stack.imgur.com/yj69y.jpg
D'autres jpeg ont le même problème, comme le premier jpeg de test du w3c https://www.w3.org/markup/test/xhtml-print/20050519/tests/a_2_1-bf-01.htm
color.rgba()
返回 alpha 预乘颜色分量0..0xffff
gamme.
J'aime byte(r)
这样的值转换为 byte
将保留其最低 8 位,与原始值相比,这似乎只是随机的。您需要一个 8 位颜色分量,不要将其转换为 byte
mais utilise à la place les 8 bits supérieurs, ce qui signifie un décalage vers la droite de 8 (ou une division par 256) :
x.write([]byte{byte(r>>8), byte(g>>8), byte(b>>8)})
Explication pourquoi cela fonctionne toujours pour les png et les gif, mais pas pour les jpeg :
Le décodage des images png et gif peut utiliser la méthode color.rgba
颜色模型,使用 8 位值存储组件。但其 rgba.rgba()
pour convertir ces valeurs en valeurs 16 bits en copiant les valeurs originales 8 bits :
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 }
Cela signifie que si vous prenez les 8 bits inférieurs, vous obtiendrez la même valeur originale que si vous preniez les 8 bits supérieurs. Le décodage des images jpeg peut utiliser le type de couleur color.ycbcr
, qui ne reproduit pas ce "comportement d'implémentation".
Ne comptez pas là-dessus. Lorsque vous avez besoin d'un composant 8 bits sur un composant 16 bits, utilisez toujours le 8 bits le plus élevé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!