[java] copie d'image du web et algo SHA - MD5

Fermé
greeg - 30 mars 2008 à 04:48
 greeg - 30 mars 2008 à 05:50
Bonjour,

je me trouve devant ce problème: je fais une recherche d'images sur un site. (java + regex), une fois que j'ai trouvé des images, je les enregistre sur mon disque dur (c:/ windows xp sp2). puis j'applique un algorithme MD5 ou SHA sur le contenu de cette image.

pour verifier ma manip, je vais chercher cette meme image à la main (avec firefox) => clic droit enregistrer sous ...
puis j'applique les memes algos.

et quand je compare mes signatures deux à deux, ce ne sont pas les memes

j'enregistre mon image comme ça:
        public boolean RecupImage(String path, String nom) {
		  try {
			  URL adresse = new URL(path);
			  URLConnection con = adresse.openConnection();
			  BufferedImage im =ImageIO.read(con.getInputStream());
			  String[] extension=ImageIO.getReaderFormatNames();
			  OutputStream img = new FileOutputStream(nom);
			  ImageIO.write(im, extension[1], img);
			  img.close();
			  return true;
		  } 
		  catch (Exception e) {
			  System.out.println("Impossible de dl l'image");
			  return false;
		  } 
	  }


je recupere son contenu comme ça :

	public String getImageContent(String image){
		String content = "";
		BufferedReader lecteurAvecBuffer;
		String ligne;
		Integer i;
		try{
			lecteurAvecBuffer = new BufferedReader(new FileReader(image));
			i=0;
			while ((ligne = lecteurAvecBuffer.readLine()) != null){
				content = content+ligne;
				i++;
			}
			lecteurAvecBuffer.close();	
		}
		catch(Exception exc){
			System.out.println("Erreur get image : "+exc);	
	    }
		return content;
	}



je la hashe comme ça :
                        String contenu = this.getImageContent("./images/"+temp);		
			try{
			        byte[] defaultBytes = contenu.getBytes("UTF-8");
				MessageDigest algorithm = MessageDigest.getInstance("MD5");
                                // OU  MessageDigest algorithm = MessageDigest.getInstance("SHA");
				algorithm.reset();
				algorithm.update(defaultBytes);
				byte messageDigest[] = algorithm.digest();
			            
				StringBuffer hexString = new StringBuffer();
				for (int i=0;i<messageDigest.length;i++) {
					hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
				}
				return hexString.toString();
			}
			catch(NoSuchAlgorithmException nsae){
			}
			catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}


et je ne comprend pas pourquoi l'empreinte des mes deux images (provenant de la meme source), ne sont pas les memes.

Sachant que les deux dernieres portions de code sont appliquées à l'identique sur les deux images, je pense que le probleme vient de ma methode d'enregistrement d'image sur le disque, mais sans en etre totalement certain.

merci pour les solutions que vous pourrez m'aporter.
A voir également:

1 réponse

public boolean RecupImage(String path, String nom) {
		  try {
			  URL adresse = new URL(path);
			  URLConnection con = adresse.openConnection();
			  BufferedInputStream in = new BufferedInputStream(con.getInputStream());
			  BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(nom));
			  byte[] read = new byte[1];
		          int len = 1;
		          while ((len = in.read(read)) > 0)
		                  out.write(read, 0, len);
		          out.flush();
		          out.close();
		          in.close();
			  return true;
		  } 
		  catch (Exception e) {
			  System.out.println("Impossible de dl l'image");
			  return false;
		  } 
	  }



plus la place pour mettre [resolu] dans mon titre
0