Я обнаружил, что у меня разные RGB при использовании Java (& фактически paint.NET), чем я использую ImageMagick, Gimp, Python и Октав. Последние 4 все согласны с eachother, и поэтому я предполагаю, что они верны.
Для этих примеров я использую это тестовое изображение: http://farm3.static.flickr.com/2811/9177301733_9836174725_o.jpg
Тестирование пикселя x=4144 y=2768
R G B
Java = (125, 107, 69)
Paint.NET = (125, 107, 69)
ImageMagick = (128, 106, 67)
Python = (128, 106, 67)
Octave = (128, 106, 67)
Gimp = (128, 106, 67)
Что дает?
Вот быстрый тест с использованием imagemagick:
convert image.jpg -crop 1x1+4144+2768 -depth 8 txt:
выход:
# ImageMagick pixel enumeration: 1,1,65535,srgb
0,0: (32896,27242,17219) #806A43 srgb(128,106,67)
Здесь приведен код java и python, который также демонстрирует проблему:
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
public class ImageIOTest {
@Test
public void can_read_file() throws IOException, InterruptedException, URISyntaxException {
File tempFile = File.createTempFile("image", "jpg");
FileUtils.copyURLToFile(new URL("http://farm3.static.flickr.com/2811/9177301733_9836174725_o.jpg"), tempFile);
BufferedImage image = ImageIO.read(tempFile);
int javaRGB = image.getRGB(4144, 2768);
int javaRed = (javaRGB >> 16) & 0xFF;
int javaGreen = (javaRGB >> 8) & 0xFF;
int javaBlue = (javaRGB >> 0) & 0xFF;
System.out.printf("rgb: (%d, %d, %d)", javaRed, javaGreen, javaBlue);
}
}
И вот соответствующий питон script:
from PIL import Image
import sys, urllib, cStringIO
file = cStringIO.StringIO(urllib.urlopen("http://farm3.static.flickr.com/2811/9177301733_9836174725_o.jpg").read())
im = Image.open(file)
pix = im.load()
print pix[4144, 2768]
Я пробовал использовать эту библиотеку 12monkeys в надежде, что это исправит ее, но не кубики. Любые другие идеи, как я могу извлечь правильные значения RGB с помощью java? Конечно, я не первый человек, у которого есть эта проблема!
Update
Я пробовал getRaster().getSample()
, но получил тот же неверный результат: System.out.println(raster.getSample(4144, 2768, 0)+","+ raster.getSample(4144, 2768, 1)+","+ raster.getSample(4144, 2768, 2));
output: 125,107,69
Подробнее
Вот какой вывод, который показывает, какие значения RGB декодируются тремя различными инструментами для первых 9 (3x3 квадратных) пикселей в верхнем левом углу изображения. Как вы можете видеть, Python и ImageMagick находятся в унисон. Java иногда совпадает. Я поставил X, где java не согласен...:
Tool [x, y] = (R , G , B )
ImageIO : [0, 0] = (86, 90, 93)
Python : [0, 0] = (86, 90, 93)
ImageMagick : [0, 0] = (86, 90, 93)
ImageIO : [1, 0] = (86, 90, 93)
Python : [1, 0] = (86, 90, 93)
ImageMagick : [1, 0] = (86, 90, 93)
ImageIO : [2, 0] = (90, 91, 95) X
Python : [2, 0] = (88, 92, 95)
ImageMagick : [2, 0] = (88, 92, 95)
ImageIO : [0, 1] = (85, 93, 95)
Python : [0, 1] = (85, 93, 95)
ImageMagick : [0, 1] = (85, 93, 95)
ImageIO : [1, 1] = (85, 93, 95) X
Python : [1, 1] = (87, 92, 95)
ImageMagick : [1, 1] = (87, 92, 95)
ImageIO : [2, 1] = (87, 92, 95)
Python : [2, 1] = (87, 92, 95)
ImageMagick : [2, 1] = (87, 92, 95)
ImageIO : [0, 2] = (83, 93, 94)
Python : [0, 2] = (83, 93, 94)
ImageMagick : [0, 2] = (83, 93, 94)
ImageIO : [1, 2] = (83, 93, 94) X
Python : [1, 2] = (84, 92, 94)
ImageMagick : [1, 2] = (84, 92, 94)
ImageIO : [2, 2] = (83, 91, 93)
Python : [2, 2] = (83, 91, 93)
ImageMagick : [2, 2] = (83, 91, 93)
Почему Java дает разные значения для некоторых пикселей? Кроме того, существует ли другой (быстрый) способ генерации правильных значений с использованием собственного кода Java?
ОБНОВЛЕНИЕ 2016-09-26:
Я передал свой код, демонстрирующий эту проблему, и переместил его в github (imageio-test), чтобы я мог легко протестировать его на разных машинах. Оказывается, Java совместима как с OSX, так и с Ubuntu Linux, но это были Python, ImageMagick и Octave, которые были непоследовательными. Другими словами, в ящике Linux все инструменты согласуются друг с другом, и поэтому я теперь думаю, что Java был прав все время, и это другие инструменты, которые дают неверные результаты на OSX! Я до сих пор не понимаю, почему, и у меня нет никакого конкретного доказательства того, какие ценности правильные, но я куда-то...