[英]BufferedImage unexpectedly changing color
我有以下代碼,該代碼創建灰度BufferedImage,然后設置每個像素的隨機顏色。
import java.awt.image.BufferedImage;
public class Main {
public static void main(String[] args) {
BufferedImage right = new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_GRAY);
int correct = 0, error = 0;
for (int i = 0; i < right.getWidth(); i++) {
for (int j = 0; j < right.getHeight(); j++) {
int average = (int) (Math.random() * 255);
int color = (0xff << 24) | (average << 16) | (average << 8) | average;
right.setRGB(i, j, color);
if(color != right.getRGB(i, j)) {
error++;
} else {
correct++;
}
}
}
System.out.println(correct + ", " + error);
}
}
在大約25%到30%的像素中會發生奇怪的行為,我在其中設置了顏色,然后立即設置了與先前設置不同的值。 我是否以錯誤的方式設置顏色?
我認為您的問題與圖片類型有關(BufferedImage構造函數的第三個參數)。 如果將類型更改為BufferedImage.TYPE_INT_ARGB
,則將獲得100%正確的結果。
查看BufferedImage.getRGB(int,int)
的文檔,當您獲得不是默認顏色空間的RGB時會有一些轉換
返回默認RGB顏色模型(TYPE_INT_ARGB)和默認sRGB顏色空間中的整數像素。 如果此默認模型與圖像ColorModel不匹配,則會進行顏色轉換。
因此,您可能會看到由於轉換而導致的不匹配。
這是您的解決方案:禁止getRGB並使用Raster(比getRGB更快,更容易)甚至更好的DataBuffer(最快,但必須處理編碼):
import java.awt.image.BufferedImage;
public class Main
{
public static void main(String[] args)
{
BufferedImage right = new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_GRAY);
int correct = 0, error = 0;
for (int x=0 ; x < right.getWidth(); x++)
for (int j = 0; j < right.getHeight(); j++)
{
int average = (int) (Math.random() * 255) ;
right.getRaster().setSample(x, y, 0, average) ;
if ( average != right.getRaster().getSample(x, y, 0) ) error++ ;
else correct++;
}
System.out.println(correct + ", " + error);
}
}
在您的情況下,getRGB太糟糕了,因為編碼是一個字節數組(8位),並且您必須使用getRGB操縱RGB值。 柵格將為您完成所有轉換工作。
胡亂猜測:
刪除(0xff << 24)| 這是Alpha通道,顏色不透明/不透明。 給定是/否透明,並且平均應用透明度為<或> = 128,則25%可能是錯誤的顏色映射(非常瘋狂的猜測)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.