Comparar imágenes jpg en java

Quería saber si conocías algún comando para comparar imágenes jpg en java.
Por ejemplo
if (foto1==foto2)
System. Out.println("Son iguales");
O algo similar que me ayude.
Respuesta
1
Tengo la respuesta a tu anterior pregunta de guardar imágenes como fichero
Mira esto, lo encontré buscando otra cosa...
http://java.sun.com/j2se/1.4.2/docs/guide/imageio/spec/apps.fm1.html
En cuanto a comparar, no recuerdo, pero se puede pasar a arrays RGB y comparar arrays, mira a ver si hay alguna clase que redefina el equals de Object, pero ahora mismo no recuerdo... tengo un poco de prisa que me voy de viaje.

2 respuestas más de otros expertos

Respuesta
1
Luego de crear el BufferedImage deberías dibujar la imagen que quieres comparar sobre el mismo:
...
Graphics g = b1.createGraphics();
//Pintar Image en BufferedImage
g.drawImage(img1, 0, 0, null);
g.dispose();
//De forma similar para img2
g = b2.createGraphics();
g.drawImage(img2, 0, 0, null);
g.dispose();
...
Ahora prueba con el código anterior. Si no te funciona, trata comparando pixel a pixel. A continuación te coloco un algoritmo que puedes utilizar:
//Comparar la data de dos imágenes
public static boolean checkIdentical(BufferedImage imgA, BufferedImage imgB) {
if(imgA.getWidth()!=imgB.getWidth() || imgA.getHeight()!=imgB.getHeight())
return false;
int w = imgA.getWidth();
int h = imgA.getHeight();
for(int i=0; i<h; i++) {
for(int j=0; j<w; j++) {
if(imgA.getRGB(j,i) != imgB.getRGB(j,i))
return false;
}
}
return true;
}
Por favor lee todos los mensajes anteriores.
Solo me sale el mensaje de son iguales cuando coloco:
if(rgbs1.equals(rgbs1)) //por supuesto que es cierto
o con el otro array
if(rgbs2.equals(rgbs2))
Agradezco toda tu ayuda! Un Millón!
Hola de nuevo!
Probé con el código que tengo:
Image borde = getToolkit().getImage("borde.jpg");
try {
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(borde, 0);
tracker.waitForID(0);
} catch (Exception e) {}
int iw = borde.getWidth(this);
int ih = borde.getHeight(this);
b1 = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_ARGB);
int w1 = b1.getWidth(null);
int h1 = b1.getHeight(null);
int[] rgbs1 = new int[w1*h1];
b1.getRGB(0, 0, w1, h1, rgbs1, 0, w1);
Cargo el mismo archivo de imagen 2 veces (b1 y b2 es lo mismo (buffered image)) y me sale que son diferentes!
¿Qué puede estar pasando?
Te agradecería me ayudaras con crear un bufferes Image a partir de un image.
Para llamar al archivo de la imagen hago lo siguiente:
Image borde = getToolkit().getImage("borde.jpg");
try {
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(borde, 0);
tracker.waitForID(0);
} catch (Exception e) {}
int iw = borde.getWidth(this);
int ih = borde.getHeight(this);
b1 = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
¿Esto funciona? ¿Cómo quedaría el código?
Ok, ¿qué tipo de comparaci? ¿N deseas hacer? ¿Igualdad pixel a pixel? ¿Similitud? Necesito que seas un poco más explicita al respecto para poder ayudarte.
Bueno, quisiera que fuera de pixel a pixel pero no se cual sería más fácil.
¿Si se usa para comparar similitud igual comparas cada pixel?
Si quieres hacer la comparación pixel a pixel, y ya que sabes utilizar la siguiente clase, utiliza java. Awt. Image. BufferedImage. Esta clase tiene un método que se llama getRGB que retorna un arreglo de los pixeles asociados a la imagen.
El código para ésto será algo similar a lo siguiente:
//Obtener todos los pixeles de la imagen 1
int w1 = bufferedImage1.getWidth(null);
int h1 = bufferedImage1.getHeight(null);
int[] rgbs1 = new int[w1*h1];
bufferedImage.getRGB(0, 0, w1, h1, rgbs1, 0, w1);
//De forma similar para la imagen 2
...
Luego de haber creado los dos arreglos de pixeles utiliza el método equals para compararlos:
if(rgbs1.equals(rgbs2))
System.out.println("Son iguales");
else
System.out.println("Son diferentes");
¿Sabes cómo crear un BufferedImage a partir de un Image? Si no sabes, te puedo ayudar con eso también.
Respuesta
1
El operador '==' implementa la llamada al método equals de Object, el cual compara los hashCodes de los objetos, por lo cual creo que es perfectamente válido lo que estas usando.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas