Первые две вещи, которые я протестировал, я распечатал два изображения.
BufferedImage@544fa968: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 цветового пространства = java .awt. цвет. ICC_ColorSpace@68e5eea7 прозрачность = 1 имеет альфа = false isAlphaPre = false ByteInterleavedRaster: ширина = 400 высота = 400 #numDataElements 3 dataOff [0] = 2
BufferedImage@11fc564b: тип = 10 ColorModel: #pixelBits = 8 numComponents = 1 цветовое пространство = java .awt.color. ICC_ColorSpace@394a2528 прозрачность = 1 имеет альфа = false isAlphaPre = false ByteInterleavedRaster: ширина = 400 высота = 400 #numDataElements 1 dataOff [0] = 0
Мы видим, что изображения имеют другое цветовое пространство, и смещение данных отличается.
И я использовал графику для рисования исходного изображения на выходе.
Graphics g = grayImage.getGraphics();
g.drawImage(rgbImage, 0, 0, null);
Это работало нормально. Я сохранил изображение как png, но это не влияет на то, как ты видишь, и когда я взял разницу между двумя изображениями, они были одинаковыми.
Суть в том, что значения rgb различны для двух разных типов изображений. Таким образом, хотя вы видите одно и то же значение с помощью get rgb, они отображаются как разные значения при отображении.
Использование графики немного медленнее, но выдает правильное изображение.
Я думаю, что здесь различие заключается в том, что setRGB / getRGB работают с данными неинтуитивно.
DataBuffer rgbBuffer = rgbImage.getRaster().getDataBuffer();
DataBuffer grayBuffer = grayImage.getRaster().getDataBuffer();
System.out.println(grayBuffer.size() + ", " + rgbBuffer.size() );
for(int i = 0; i<10; i++){
System.out.println(
grayBuffer.getElem(i) + "\t"
+ rgbBuffer.getElem(3*i) + ", "
+ rgbBuffer.getElem(3*i+1) + ", "
+ rgbBuffer.getElem(3*i + 2) );
}
Показывает ожидаемые нами данные. Размер буфера rgb равен 3x, пиксели соответствуют напрямую.
160000, 480000
255 255, 255, 255
255 255, 255, 255
254 254, 254 , 254
253 253, 253, 253
252 252, 252, 252
252 252, 252, 252
251 251, 251, 251
251 251, 251, 251
250 250, 250, 250
250 250, 250, 250
Когда мы проверяем соответствующие значения RGB.
for(int i = 0; i<10; i++){
System.out.println(
Integer.toHexString( grayImage.getRGB(i, 0) ) + ", "
+ Integer.toHexString( rgbImage.getRGB(i, 0) ) + " " );
}
ffffffff, ffffffff
ffffffff, ffffffff
ffffffff, fffefefe
fffefefe, fffdfdfd
fffefefe, fffcfcf c
ffffeffff *
fffdfdfd, fffbfbfb
fffdfdfd, fffbfbfb
fffdfdfd, fffafafa
fffdfdfd, fffafafa
Так, чтобы изображение было правильным, оно должно иметь разные значения rgb.