簡體   English   中英

BufferedImage行為不一致

[英]BufferedImage inconsistent behavior

在使用setRGB將java.awt.image.BufferedImage的像素設置為值后,對getRGB的后續調用將返回與我設置的值不同的值。

碼:

BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_GRAY);
int color1 = -16711423; // corresponds to RGB(1, 1, 1)
image.setRGB(0, 0, color1);
int color2 = image.getRGB(0, 0);
System.out.println(color1);
System.out.println(color2);

它產生以下輸出

-16711423
-16777216

我認為它必須做一些伽瑪校正,但我在文檔中找不到任何關於它的東西。

理想情況下,我想更改此行為以返回與我設置相同的值。 那可能嗎?

BufferedImage.getRGB()方法始終在非線性 sRGB顏色空間( ColorSpace.CS_sRGB )中返回顏色(作為“壓縮格式”中的int )。 無論您的圖像具有什么顏色空間和每像素位等,它都會這樣做。 因此,可能發生轉換和可能的精度損失。

來自JavaDoc

返回默認RGB顏色模型(TYPE_INT_ARGB)和默認sRGB顏色空間中的整數像素。 如果此默認模型與圖像ColorModel不匹配,則會進行顏色轉換。

您的TYPE_BYTE_GRAY圖像內部使用線性灰色空間( ColorSpace.CS_GRAY ),它不會與sRGB一對一地映射。

此外,我建議對(A)RGB顏色使用十六進制表示法,它使顏色和差異更容易看到:

-16711423 == 0xff010101
-16777216 == 0xff000000

所以,這里有一個小的精度損失,但沒有任何意外。

如果要直接訪問像素數據,請查看RasterSampleModelDataBuffer類(及其各自的子類)。

您可以設置使用int指定的顏色,該顏色將RGB分量存儲為字節(范圍為0..255)。

但是你的圖像的顏色模型不是RGB而是BYTE_GRAY 顯然你可能會遭受精確失敗。 這解釋了不同的顏色。 如果你使用了圖像類型TYPE_INT_RGB你最終會得到相同的顏色。

暫無
暫無

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

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