[英]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
所以,這里有一個小的精度損失,但沒有任何意外。
如果要直接訪問像素數據,請查看Raster
, SampleModel
和DataBuffer
類(及其各自的子類)。
您可以設置使用int
指定的顏色,該顏色將RGB分量存儲為字節(范圍為0..255)。
但是你的圖像的顏色模型不是RGB而是BYTE_GRAY
。 顯然你可能會遭受精確失敗。 這解釋了不同的顏色。 如果你使用了圖像類型TYPE_INT_RGB
你最終會得到相同的顏色。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.