Maison > développement back-end > Golang > Couleurs incorrectes lors de l'utilisation de image.Decode pour décoder JPEG et écrire au format PDF ?

Couleurs incorrectes lors de l'utilisation de image.Decode pour décoder JPEG et écrire au format PDF ?

PHPz
Libérer: 2024-02-08 22:40:12
avant
1113 Les gens l'ont consulté

使用 image.Decode 解码 JPEG 并写入 PDF 时颜色不正确?

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.

Contenu de la question

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)
}
Copier après la connexion
[...]
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)})
    }
}
[...]
Copier après la connexion

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

Solution

color.rgba() 返回 alpha 预乘颜色分量0..0xffffgamme.

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)})
Copier après la connexion

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
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal