¿Hay alguna manera de de verificación si los mapas de bits son los mismos? ¿Alguien me puede ayudar?la comparación de imágenes de mapa de bits en Android
Respuesta
Dependiendo de cómo se defina el mismo. Si quiere decir exactamente el mismo archivo, puede hacer un md5sum de los archivos. Eso será lo mismo para cada tipo de archivo, supongo.
Debido a que específicamente hacer la distinción para los archivos de mapa de bits, que podría estar interesado en los archivos que difieren en tamaño. Eso es un poco mas dificil Si son del mismo tamaño, pero no por completo el mismo (pero se ven realmente muy similar entre si) puede comparar cada píxel separada, y si suficientes píxeles (umbral 1) son lo bastante cerca uno del otro en el color (umbral 2) puede declarar ellos como siendo lo mismo.
Puede getPixel(int,int)
para obtener el color, consulte this page
clase Bitmap tiene método "sameAs", puede utilizar este método para comparar dos mapas de bits
Debe ser algo como esto:
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());
}
Fuera de excepción de memoria – Trikaldarshi
@Photon, no he encontrado ninguna excepción para este método – Exterminator13
Fuera de excepción de memoria Incluso en Galaxy S3 – Trikaldarshi
esta pregunta parece viejo pero pasó algún tiempo en este tema hoy y aquí está lo que yo hizo.
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;
}
}
se puede simplificar el DECLARACIÓN volver Arrays.equals (pixels1, pixels2); en cambio "si (Arrays.equals (pixels1, pixels2)) { return true;} else { return false;} " – ademar111190
El principal problema para las API de menos de 12 es que obtenemos OutOfMemory
error para resoluciones de grandes archivos. Lo resuelto por escupir mapas de bits en piezas (10 en el ejemplo) y luego compararlos por Bytes:
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. porcentaje de Android Android porcentaje de mapa de bits diferencia de píxeles entre dos imágenes
- 2. Android rápido Mapa de bits cargando
- 3. ¿SVG admite la incorporación de imágenes de mapa de bits?
- 4. Girar mapa de bits en Android Canvas
- 5. Android Widget de mapa de bits Tamaños
- 6. ¿Voltear un mapa de bits en la ayuda de Android?
- 7. Tamaño de imagen de mapa de bits de Android
- 8. Android: compartir mapa de bits no guardado en SD
- 9. Cómo convertir mapa de bits a lápiz en Android?
- 10. Cómo desenfocar un mapa de bits (Android)?
- 11. tamaño del mapa de bits Android
- 12. Android - Rellene mapa de bits con color
- 13. Android: animación de interpolación de un mapa de bits
- 14. cortar la porción de mapa de bits
- 15. Azulejo de mapa de bits de Android en X solo
- 16. Error de memoria de mapa de bits en Android ...
- 17. Conversión de mapa de bits en jpeg en android
- 18. imagen de conversión a mapa de bits en android
- 19. Lote obteniendo muchos recursos de mapa de bits en Android
- 20. crear mapa de bits de byteArray en android
- 21. Cómo subir imágenes de mapa de bits desde un dispositivo Android?
- 22. ¿Cómo almacenar (imagen de mapa de bits) y recuperar imágenes de la base de datos sqlite en android?
- 23. Convertir texto en mapa de bits (Pixel) en Android
- 24. Android: ¿cómo convertir ImageView completo a mapa de bits?
- 25. Límite de mapa de bits de Android - Prevención de java.lang.OutOfMemory
- 26. Android: mapa de bits de vista de gran tamaño
- 27. algoritmo de comparación de imágenes
- 28. Girar un mapa de bits guardado en Android
- 29. ¿Cómo tinte un mapa de bits en Android?
- 30. Cómo dibujar un mapa de bits en Android usando OpenGL
Tenga en cuenta que el método sameAs no se introdujo hasta API v12 (es decir, Android 3.1), así que esto no es muy servicial para versiones anteriores. – Ithildin
minSdk 14 todas las cosas – Blundell
minSdk 19 todas las cosas – ADev