Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Warna tidak betul apabila menggunakan imej. Nyahkod untuk menyahkod JPEG dan menulis ke PDF?

Warna tidak betul apabila menggunakan imej. Nyahkod untuk menyahkod JPEG dan menulis ke PDF?

PHPz
PHPzke hadapan
2024-02-08 22:40:121060semak imbas

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

Editor PHP Zimo menghadapi masalah semasa menggunakan imej.Nyahkod untuk menyahkod JPEG dan menulisnya ke PDF, iaitu warna tidak betul. Masalah ini mungkin disebabkan oleh ketidakpadanan dalam ruang warna. Apabila menyahkod imej JPEG, anda perlu memastikan bahawa ruang warna imej sepadan dengan ruang warna PDF, jika tidak, ia akan menyebabkan warna tidak betul. Penyelesaian kepada masalah ini ialah cuba menggunakan imej.Fungsi DecodeConfig untuk mendapatkan mod warna imej JPEG, dan kemudian memadankannya dengan ruang warna PDF untuk memastikan konsistensi. Selain itu, anda juga boleh cuba menggunakan perpustakaan pemprosesan imej lain atau melaraskan ruang warna imej untuk menyelesaikan masalah ini.

Kandungan soalan

Saya cuba menggunakan image.decode() 方法解码图像文件(png、jpg、gif 和 bmp 格式)来创建 pdf,以获取 image.image. Saya kemudian menulis data piksel ke aliran pdf dan kemudian memampatkannya. Masalah yang saya hadapi ialah apabila saya menyahkod jpeg, warna dalam pdf yang terhasil adalah tidak betul. Semua format imej lain berfungsi seperti yang diharapkan. Saya telah melampirkan tangkapan skrin isu tersebut.

Tangkapan skrin: https://i.stack.imgur.com/e3hc8.png

Ada sesiapa tahu apa punca masalah ini? Adakah terdapat cara khusus yang saya perlukan untuk mengendalikan jpeg secara berbeza apabila menggunakan image.decode()? Sebarang cadangan tentang cara menyelesaikan masalah ini amat dihargai!

Editor:

Kod:

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)})
    }
}
[...]

Apabila menggunakan jpeg.decode secara langsung, imej yang terhasil dalam pdf kelihatan sama.

Saya mahu imej dalam pdf yang dijana kelihatan sama seperti png asal, tetapi mungkin dengan sedikit kemerosotan.

PNG asal: https://i.stack.imgur.com/rnkgq.png

jpg yang ditukar: https://i.stack.imgur.com/yj69y.jpg

Jpeg lain mempunyai masalah yang sama, seperti jpeg ujian pertama dari w3c https://www.w3.org/markup/test/xhtml-print/20050519/tests/a_2_1-bf-01.htm

Penyelesaian

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

Suka byte(r) 这样的值转换为 byte 将保留其最低 8 位,与原始值相比,这似乎只是随机的。您需要一个 8 位颜色分量,不要将其转换为 byte tetapi sebaliknya menggunakan 8 bit atas, yang bermaksud anjakan kanan dengan 8 (atau bahagi dengan 256):

x.write([]byte{byte(r>>8), byte(g>>8), byte(b>>8)})

Penjelasan mengapa ia masih berfungsi untuk png dan gif, tetapi bukan jpeg:

Menyahkod imej png dan gif boleh menggunakan kaedah color.rgba的图像模型> 颜色模型,使用 8 位值存储组件。但其 rgba.rgba() untuk menukar nilai ini kepada nilai 16-bit dengan menyalin nilai 8-bit asal:

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
}

Ini bermakna jika anda mengambil 8 bit bawah, anda akan mendapat nilai asal yang sama seperti anda mengambil 8 bit atas. Menyahkod imej jpeg mungkin menggunakan jenis warna color.ycbcr, yang tidak menghasilkan semula "tingkah laku pelaksanaan" ini.

Jangan bergantung pada ini. Apabila anda memerlukan komponen 8-bit daripada komponen 16-bit, sentiasa gunakan 8-bit yang lebih tinggi.

Atas ialah kandungan terperinci Warna tidak betul apabila menggunakan imej. Nyahkod untuk menyahkod JPEG dan menulis ke PDF?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam