bitmap'lerinin aynı olup olmadığını kontrol etmenin bir yolu var mı? birisi bana yardım edebilir mi?Android'de Bitmap görüntülerinin karşılaştırılması
cevap
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
Bitmap sınıfı yöntemi "sameAs" vardır görmek için iki bitmap
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());
}
Bellek dolu istisnası – Trikaldarshi
@Photon, Bu yöntem için herhangi bir özel durumla karşılaşmadım – Exterminator13
Bellek yetersizliği istisnası Galaksideki bile S3 – Trikaldarshi
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;
}
}
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
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;
}
- 1. SVG görüntülerine gömülmüş bitmap görüntülerinin kenar yumuşatmasını kapatın
- 2. androidde greyview için özel adaptör
- 3. androidde openssl nasıl kurulur
- 4. Docker görüntülerinin sürüm artışı
- 5. karşılaştırılması nesneler
- 6. androidde shift-jis kodunu çözme
- 7. Simge Görüntülerinin Başlık ile Hizalanması
- 8. Bitmap görüntüleri listesinden bir .avi dosyası oluşturun
- 9. Boolean'larla ArrayLists Karşılaştırılması
- 10. karşılaştırılması DNA dizileri 3
- 11. GenericType Arabirimlerin Karşılaştırılması
- 12. Lisp'deki listelerin karşılaştırılması
- 13. Farklı şekillerdeki matrislerin karşılaştırılması
- 14. upper_bound/lower_bound işlevinin karşılaştırılması
- 15. karşılaştırılması telefon numaraları Android
- 16. Listeler arasındaki bigramların karşılaştırılması
- 17. değişken Bitmap
- 18. Uygulama boyutlarını bilirken androidde özel görünümler ekleme
- 19. Tepki yerli androidde Coach işareti nasıl uygulanır?
- 20. Docker görüntülerinin kesin tarihi nasıl alınır?
- 21. FPGA'nın ASIC tasarımı ile karşılaştırılması
- 22. Python ve R sözcüklerinin karşılaştırılması
- 23. 2 tarihin momentJS ile karşılaştırılması
- 24. İki matris arasındaki satırların karşılaştırılması
- 25. Bir sayfa veya denetleyicinin karşılaştırılması
- 26. Yücelteki sayı ve sayıların karşılaştırılması
- 27. SQL - Bir tablodaki tarihlerin karşılaştırılması
- 28. Ayrı .txt dosyalarındaki sütunların karşılaştırılması
- 29. Bitmap.Clone() ve yeni Bitmap (Bitmap) arasındaki fark nedir? Söyleyebileceğim
- 30. GLSurfaceView'den bitmap nasıl kaydedilir (Sadece tüm bitmap değil, tüm doku)
Not, bu nedenle bu gerçekten yararlı değildir eski versiyonlar için. – Ithildin
minSdk 14 her şey – Blundell
minSdk 19 her şey – ADev