RGB цвета в Java против VB.net
Я не являюсь носителем английского языка, поэтому прошу прощения за любые ошибки перевода.
У меня нет проблем с кодированием. Это скорее концептуальный вопрос.
Я написал два раза один и тот же кусок кода, переводя изображение в список значений RGB. (1 комбинация из 3 значений для каждого пикселя).
Сначала я написал код на VB.net, используя:
Dim bmp As New Bitmap(File)
For x As Integer = 0 To w - 1
For y As Integer = 0 To h - 1
Dim c As Color = bmp.GetPixel(x, y)
Dim Red as integer = c.R
Dim Green as integer = c.G
Dim Blue as integer = c.B
Next y
next x
После этого я написал следующее на Java:
BufferedImage image = ImageIO.read(new File(File))
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
int pixel = image.getRGB(i,j);
int Red = ((pixel >> 16) & 0xff);
int Green = ((pixel >> 8) & 0xff);
int Blue = ((pixel) & 0xff);
}
}
Я ожидал бы получить одинаковые значения из обоих фрагментов кода, так как они используют одно и то же изображение. Я попробовал это на изображении (270x320), которое было фотографией (таким образом, полный спектр цветов). К своему удивлению я увидел там, где небольшие различия в значениях RGB между кодами VB.net и Java.
Если я сравниваю java(красный) с VB.net(красный), java(зеленый) с VB.net(зеленый) и java(синий) с VB. Чистый (синий) Я сравниваю 270x320x3 = 259,2 тыс. комбинаций. Различия между целыми числами, полученными из VB.net и из кода Java, заключаются в следующем:
- Без разницы: 250178 (96,5%)
- Одно отличие: 7426 (2,9%)
- Две разницы: 1582 (0,6%)
- Три различия: 14 (0,0%)
- Четыре или более различий: 0 (0,0%)
Кто-нибудь может объяснить мне, откуда эта разница? Это связано со способом считывания цветов, способом буферизации изображения или с чем-то вроде сглаживания?
Действительно любопытно, в чем причина, спасибо заранее
1 ответ
Как уже упоминалось, разница вызвана сжатием с потерями в формате JPEG.
Вы должны тестировать эти методы в формате без потерь.