6
votes

Android Compute Hash d'un bitmap


2 commentaires

Votre question est très confuse: vous attendez-vous à deux bitmaps avec la même "image à l'intérieur" et des noms différents pour résulter du même hachage? Pourquoi ce que vous avez déjà trouvé n'est pas la bonne solution pour vous? Oui bitmaps.hashscode () renvoie un entier, qu'est-ce qui ne va pas avec elle (si Sha n'est pas forcé)? Veuillez reformuler votre question si vous voulez avoir une réponse significative


Je recèle différents bitmaps (CAPTCHAS) de l'analyse d'un site Web, souvent les mêmes images avec des noms différents. Peut-être que j'ai mal compris bitmap.hashcode (), il génère un hash pour l'objet, et non pour la teneur en bitmap? // question modifiée


5 Réponses :


7
votes

dans Android 3.1 ou version ultérieure (niveau d'API 12) Il existe une méthode sur bitmap appelé samas () qui comparera les pixels et le retour si les deux représentent la même chose image. Cela le fait dans le code natif, il est donc relativement rapide.

Si vous devez cibler un niveau d'API inférieur, vous devez écrire une méthode qui itière sur chaque pixel des deux objets et voir s'ils correspondent. Ce sera un processus très intensif si cela est fait en code Java, vous pouvez donc envisager d'écrire une petite routine à l'aide de la NDK que vous pouvez appeler de votre application pour effectuer la comparaison dans le code natif (il y a des API bitmap dans le NDK afin que vous puissiez facilement Obtenez sur les tampons de pixels).

Si vous choisissez de le faire en Java, getpixels () vous aidera à obtenir des tableaux des données pixels que vous pouvez comparer entre les deux images.

htth


0 commentaires

1
votes

Vous pouvez essayer d'écrire votre propre fonction en utilisant uniquement le pixel à partir du bitmap:

public long hashBitmap(Bitmap bmp){
  long hash = 31 //or a higher prime at your choice
  for(int x = 0; x < bmp.getWidth(); x++){
    for (int y = 0; y < bmp.getHeight(); y++){
      hash *= (bmp.getPixel(x,y) + 31);
    }
  }
  return hash;
}


0 commentaires

2
votes

Voici un moyen plus natif pour calculer le hasch bitmap, en utilisant arrayes.hashcode et bitmap.getpixels xxx


0 commentaires

2
votes

La solution la plus rapide que j'ai trouvée jusqu'à présent dans Kotlin: xxx

presque 100 fois plus rapidement que la réponse acceptée


1 commentaires

toujours retourne 1



1
votes

problème similaire et cela a fonctionné pour moi (problème résolu avec un nouveau nom pour un bitmap spécifique, je pourrais donc vérifier s'il était déjà stocké):

fun getUniqueBitmapFileName(bitmap: Bitmap): String {
    val buffer = ByteBuffer.allocate(bitmap.getByteCount())
    bitmap.copyPixelsToBuffer(buffer)
    return Arrays.hashCode(buffer.array()).toString()
}


0 commentaires