簡體   English   中英

使用圖像解碼 JPEG 時 colors 不正確。解碼並寫入 PDF?

[英]Incorrect colors when decoding JPEG using image.Decode and writing to PDF?

我正在嘗試通過使用image.Decode()方法解碼圖像文件(PNG、JPG、GIF 和 BMP 格式)來創建 PDF 來獲取image.Image 然后,我把像素數據寫成一個PDF stream,后面再壓縮。 我遇到的問題是,當我解碼 JPEG 時,生成的 PDF 中的 colors 不正確。所有其他圖像格式都按預期工作。 我附上了問題的截圖。

截圖: https://i.imgur.com/Bzz6EnD.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)})
    }
}
[...]

pdf 中的結果圖像在直接使用jpeg.Decode時看起來是一樣的。

我希望生成的 pdf 中的圖像看起來就像原始的 png 一樣,可能有點退化。

原始 PNG: https://i.imgur.com/cjjOdxj.png

轉換后的 JPG: https://i.imgur.com/I5kxTab.jpeg

其他 JPEG 也有同樣的問題,例如來自 w3c 的第一個測試 JPEG https://www.w3.org/MarkUp/Test/xhtml-print/20050519/tests/A_2_1-BF-01.htm

Color.RGBA()返回0..0xffff范圍內的 alpha 預乘顏色分量。

將這樣的值轉換為byte byte(r)之類的字節將保留其最低 8 位,與原始值相比,這看起來只是隨機的。 您需要一個 8 位顏色分量,不要將其轉換為byte ,而是使用較高的 8 位,這意味着右移 8(或除以 256):

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

解釋為什么它仍然適用於 PNG 和 GIF,但不適用於 JPEG:

解碼 PNG 和 GIF 圖像可能會使用圖像 model,該圖像使用color.RGBA顏色 model,它使用 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 位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM