首頁 > 後端開發 > Golang > 主體

使用 image.Decode 解碼 JPEG 並寫入 PDF 時顏色不正確?

PHPz
發布: 2024-02-08 22:40:12
轉載
1058 人瀏覽過

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

php小編子墨在使用image.Decode解碼JPEG並寫入PDF時遇到了一個問題,就是顏色不正確。這個問題可能是由於顏色空間的不匹配所導致的。在解碼JPEG影像時,需要確保影像的色彩空間與PDF的色彩空間相匹配,否則會導致顏色不正確的問題。解決這個問題的方法是,可以嘗試使用image.DecodeConfig函數來取得JPEG影像的顏色模式,然後將其與PDF的色彩空間進行匹配,確保一致性。另外,也可以嘗試使用其他的影像處理庫或調整影像的色彩空間來解決這個問題。

問題內容

我嘗試使用image.decode() 方法解碼圖像檔案(png、jpg、gif 和bmp 格式)來建立pdf,以取得image.image。然後,我將像素資料寫入 pdf 流,隨後進行壓縮。我遇到的問題是,當我解碼 jpeg 時,生成的 pdf 中的顏色不正確。所有其他圖像格式均按預期工作。我已附上該問題的螢幕截圖。

截圖: https://i.stack.imgur.com/e3hc8.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)})
    }
}
[...]
登入後複製
直接使用 jpeg.decode

時,pdf 中產生的圖片看起來相同。

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

原始png:https://i.stack.imgur.com/rnkgq.png

轉換後的 jpg:https://i.stack.imgur.com/yj69y.jpg

其他jpeg 也有相同的問題,例如來自w3c 的第一個測試jpeg https://www.w3.org/markup/test/xhtml-print/20050519/tests/a_2_1-bf-01.htm

解決方法

color.rgba() 傳回alpha 預乘顏色分量0..0xffff

的範圍。

byte(r) 這樣的值轉換為 byte 將保留其最低 8 位,與原始值相比,這似乎只是隨機的。您需要一個 8 位元顏色分量,不要將其轉換為 byte

而是使用高 8 位,這表示右移 8(或除以 256):

x.write([]byte{byte(r>>8), byte(g>>8), byte(b>>8)})
登入後複製

解釋為什麼它仍然適用於 png 和 gif,但不適用於 jpeg:

解碼 png 和 gif 圖像可能使用使用 color.rgba 顏色模型,使用 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 位元。 ###

以上是使用 image.Decode 解碼 JPEG 並寫入 PDF 時顏色不正確?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!