2011-05-25 22 views

cevap

2

Aynısını nasıl tanımladığınıza bağlı olarak. ile aynı dosya anlamına gelirse, dosyaların md5sum'unu yapabilirsiniz. Tahmin ettiğim her dosya için aynı olacak.

Özellikle bitmap dosyaları için ayrım yaptığınız için, boyut olarak farklı olan dosyalarla ilgileniyor olabilirsiniz. Bu biraz daha zor. Eğer aynı büyüklükte olsalar ama tamamen aynı değillerse (birbirinden çok benzerlerse) her bir ayrı pikseli karşılaştırabilirsiniz, ve eğer yeterli sayıda piksel (eşik 1) birbirine yeterince yakınsa (eşik 2) beyan edebilirsiniz Onları aynı şekilde. Sen getPixel(int,int) can

, renk elde this page

14

Böyle bir şey olmalıdır karşılaştırmak için bu yöntemi kullanabilirsiniz:

public boolean equals(Bitmap bitmap1, Bitmap bitmap2) { 
    ByteBuffer buffer1 = ByteBuffer.allocate(bitmap1.getHeight() * bitmap1.getRowBytes()); 
    bitmap1.copyPixelsToBuffer(buffer1); 

    ByteBuffer buffer2 = ByteBuffer.allocate(bitmap2.getHeight() * bitmap2.getRowBytes()); 
    bitmap2.copyPixelsToBuffer(buffer2); 

    return Arrays.equals(buffer1.array(), buffer2.array()); 
} 
+3

Bellek dolu istisnası – Trikaldarshi

+0

@Photon, Bu yöntem için herhangi bir özel durumla karşılaşmadım – Exterminator13

+3

Bellek yetersizliği istisnası Galaksideki bile S3 – Trikaldarshi

9

Bu soru eski görünüyor, ancak bu konuda biraz zaman harcadım bugün ve işte benim yaptı.

private static boolean compare(Bitmap b1, Bitmap b2) { 
    if (b1.getWidth() == b2.getWidth() && b1.getHeight() == b2.getHeight()) { 
     int[] pixels1 = new int[b1.getWidth() * b1.getHeight()]; 
     int[] pixels2 = new int[b2.getWidth() * b2.getHeight()]; 
     b1.getPixels(pixels1, 0, b1.getWidth(), 0, 0, b1.getWidth(), b1.getHeight()); 
     b2.getPixels(pixels2, 0, b2.getWidth(), 0, 0, b2.getWidth(), b2.getHeight()); 
     if (Arrays.equals(pixels1, pixels2)) { 
      return true; 
     } else { 
      return false; 
     } 
    } else { 
     return false; 
    } 
} 
+3

Arrays.equals (piksel1, piksel2) dönmek için gerekli olan durumu basitleştirebilirsiniz; bunun yerine "(Arrays.equals (pixels1, pixels2)) { ) true değerini döndürürse } else { döndürme false; }" – ademar111190

0

12'den az API'ler için başlıca konu büyük dosya çözünürlükleri için OutOfMemory hatası alıyorum olmasıdır. Ben Byte ile karşılaştırarak sonra (örnekte 10) parçalar halinde bitmapler tükürme ve bunu çözdü: sameAs yöntemi API v12 (yani Android 3.1) kadar tanıtılan olmadığını

private boolean compareBitmaps(Bitmap bitmap1, Bitmap bitmap2) 
{ 
    if (Build.VERSION.SDK_INT > 11) 
    { 
     return bitmap1.sameAs(bitmap2); 
    } 

    int chunkNumbers = 10; 
    int rows, cols; 
    int chunkHeight, chunkWidth; 
    rows = cols = (int) Math.sqrt(chunkNumbers); 
    chunkHeight = bitmap1.getHeight()/rows; 
    chunkWidth = bitmap1.getWidth()/cols; 

    int yCoord = 0; 
    for (int x = 0; x < rows; x++) 
    { 
     int xCoord = 0; 
     for (int y = 0; y < cols; y++) 
     { 
      try 
      { 
       Bitmap bitmapChunk1 = Bitmap.createBitmap(bitmap1, xCoord, yCoord, chunkWidth, chunkHeight); 
       Bitmap bitmapChunk2 = Bitmap.createBitmap(bitmap2, xCoord, yCoord, chunkWidth, chunkHeight); 

       if (!sameAs(bitmapChunk1, bitmapChunk2)) 
       { 
        recycleBitmaps(bitmapChunk1, bitmapChunk2); 
        return false; 
       } 

       recycleBitmaps(bitmapChunk1, bitmapChunk2); 

       xCoord += chunkWidth; 
      } 
      catch (Exception e) 
      { 
       return false; 
      } 
     } 
     yCoord += chunkHeight; 
    } 

    return true; 
} 

private boolean sameAs(Bitmap bitmap1, Bitmap bitmap2) 
{ 
    // Different types of image 
    if (bitmap1.getConfig() != bitmap2.getConfig()) 
     return false; 

    // Different sizes 
    if (bitmap1.getWidth() != bitmap2.getWidth()) 
     return false; 

    if (bitmap1.getHeight() != bitmap2.getHeight()) 
     return false; 

    int w = bitmap1.getWidth(); 
    int h = bitmap1.getHeight(); 

    int[] argbA = new int[w * h]; 
    int[] argbB = new int[w * h]; 

    bitmap1.getPixels(argbA, 0, w, 0, 0, w, h); 
    bitmap2.getPixels(argbB, 0, w, 0, 0, w, h); 

    // Alpha channel special check 
    if (bitmap1.getConfig() == Bitmap.Config.ALPHA_8) 
    { 
     final int length = w * h; 
     for (int i = 0; i < length; i++) 
     { 
      if ((argbA[i] & 0xFF000000) != (argbB[i] & 0xFF000000)) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

    return Arrays.equals(argbA, argbB); 
} 

private void recycleBitmaps(Bitmap bitmap1, Bitmap bitmap2) 
{ 
    bitmap1.recycle(); 
    bitmap2.recycle(); 
    bitmap1 = null; 
    bitmap2 = null; 
} 
İlgili konular