[英]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.