J'ai trouvé que je reçois des différents RVB lors de l'utilisation de Java (& en fait paint.NET) que je suis en utilisant ImageMagick, Gimp, Python, et Octave. Les 4 derniers tous d'accord avec eachother et donc je suis en supposant que correcte.
Pour ces exemples, je suis en utilisant ce test de l'image: http://farm3.static.flickr.com/2811/9177301733_9836174725_o.jpg
Test de pixel 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)
Ce qui donne?
Voici un test rapide en utilisant imagemagick:
convert image.jpg -crop 1x1+4144+2768 -depth 8 txt:
sortie:
# ImageMagick pixel enumeration: 1,1,65535,srgb
0,0: (32896,27242,17219) #806A43 srgb(128,106,67)
Voici quelques java et le code python qui montre également le problème:
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);
}
}
Et voici le correspondant script python:
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]
J'ai essayé d'utiliser cette 12monkeys de la bibliothèque dans l'espoir de le guérir, mais pas de dés. Toutes les autres idées de comment je peux extraire de corriger les valeurs RVB à l'aide de java? Je ne suis sûrement pas la première personne à avoir ce problème!
Mise à jour
J'ai essayé d' getRaster().getSample()
, mais il a obtenu le même résultat invalide: System.out.println(raster.getSample(4144, 2768, 0)+","+ raster.getSample(4144, 2768, 1)+","+ raster.getSample(4144, 2768, 2));
sortie: 125,107,69
Plus d'infos
Voici une sortie qui montre ce que les valeurs RVB sont décodés par trois outils différents pour la première 9 (3x3 de carrés de pixels en haut à gauche de l'image. Comme vous pouvez le voir, Python et ImageMagick sont à l'unisson. Java parfois matchs. J'ai mis un X à l'endroit où java n'est pas d'accord...:
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)
Pourquoi Java donner des valeurs différentes pour certains pixels? Sinon, est-il une autre (rapide) de façon à générer des valeurs correctes à l'aide du code Java natif?
Mise à JOUR 2016-09-26:
J'ai commis mon code qui illustre ce problème et l'a poussé à github (imageio-test), de sorte que j'ai facilement pu le tester sur des machines différentes. Il s'avère que Java a été cohérents dans les deux OSX et Ubuntu Linux, mais il a été Python, ImageMagick et Octave qui ne l'était pas. En d'autres termes, sous Linux, tous les outils d'accord les uns avec les autres, et donc, je suis en train de penser que java a toujours été la bonne, et c'est aux autres outils de donner des résultats incorrects sur OSX! Je ne comprends vraiment pas pourquoi et je n'ai pas de preuve concrète que les valeurs sont les bonnes, mais je suis quelque part...