Necesito detectar si el archivo de imagen está dañado en Java. Estoy trabajando solo con PNG, imágenes JPG. ¿Es esto posible con Sanselan? ¿O se puede hacer con ImageIO? Intenté usar ImageIO.read parece que funciona. Pero no estoy seguro de si puede detectar todo tipo de errores en las imágenes. Me gustaría saber cuál es la mejor práctica.Cómo detectar imágenes dañadas (PNG, JPG) en Java
Respuesta
Si la imagen no se puede analizar, el archivo está dañado, de lo contrario, el archivo debería ser válido pero contiene los píxeles incorrectos como señaló Andrzej. Detectar eso podría ser bastante difícil si no puede definir cómo encontraría píxeles "incorrectos".
Si tiene información sobre la imagen base, p. un histograma o incluso los píxeles originales, puede intentar y compararlos con la imagen leída. Tenga en cuenta, sin embargo, que debido a la compresión puede haber algunos errores, por lo que deberá agregar algún valor de tolerancia.
Una nota adicional: Sanselan no leerá imágenes JPEG, por lo que tendrá que utilizar ImageIO aquí.
Aquí está mi solución que manejaría la comprobación de GIF roto, JPG y PNG. Comprueba si truncada JPEG usando el marcador JPEG EOF, GIF utilizando un índice de verificación de los límites excepción y PNG utilizando un EOFException
public static ImageAnalysisResult analyzeImage(final Path file)
throws NoSuchAlgorithmException, IOException {
final ImageAnalysisResult result = new ImageAnalysisResult();
final InputStream digestInputStream = Files.newInputStream(file);
try {
final ImageInputStream imageInputStream = ImageIO
.createImageInputStream(digestInputStream);
final Iterator<ImageReader> imageReaders = ImageIO
.getImageReaders(imageInputStream);
if (!imageReaders.hasNext()) {
result.setImage(false);
return result;
}
final ImageReader imageReader = imageReaders.next();
imageReader.setInput(imageInputStream);
final BufferedImage image = imageReader.read(0);
if (image == null) {
return result;
}
image.flush();
if (imageReader.getFormatName().equals("JPEG")) {
imageInputStream.seek(imageInputStream.getStreamPosition() - 2);
final byte[] lastTwoBytes = new byte[2];
imageInputStream.read(lastTwoBytes);
if (lastTwoBytes[0] != (byte)0xff || lastTwoBytes[1] != (byte)0xd9) {
result.setTruncated(true);
} else {
result.setTruncated(false);
}
}
result.setImage(true);
} catch (final IndexOutOfBoundsException e) {
result.setTruncated(true);
} catch (final IIOException e) {
if (e.getCause() instanceof EOFException) {
result.setTruncated(true);
}
} finally {
digestInputStream.close();
}
return result;
}
public class ImageAnalysisResult {
boolean image;
boolean truncated;
public void setImage(boolean image) {
this.image = image;
}
public void setTruncated(boolean truncated) {
this.truncated = truncated;
}
}
}
¿No deberían las dos cláusulas de la comprobación de estado JPEG conectarse con OR lógico en lugar de Y? – mnicky
Puede vincular esta clase ImageAnalysisResult –
¿Podría incluir todas las instrucciones de importación en su respuesta? –
Si la imagen en formato JPEG, utilice esto:
JPEGImageDecoder decoder = new JPEGImageDecoder(new FileImageSource(f) ,new FileInputStream(f));
decoder.produceImage();
si arroja una excepción; esto significa que la imagen está corrupta.
para los demás casos; solo use new ImageIcon(file)
para verificar la validez.
No funciona para mí (http://i.imgur.com/rE89Bpl.jpg). – mnicky
- 1. Detectar Eof para imágenes JPG
- 2. Descargar png/jpg con R
- 3. Conversión de imágenes .jpg a .png
- 4. sujetapapeles - convertir imágenes tiff en jpg o png
- 5. SVG a JPG/PNG
- 6. Ponga PNG sobre un JPG en PHP
- 7. Convierta png/jpg/gif a ico
- 8. Cómo convertir una imagen JPG a PNG
- 9. cómo saber esta imagen es jpg o png iphone
- 10. ¿Cómo responder_ a PNG o JPG en Rails y generar imágenes desde HTML?
- 11. Bmp a jpg/png en C#
- 12. Mostrar imágenes jpg en python
- 13. ¿Cómo convertimos WMF/EMF (metarchivos MS) en imágenes estándar como JPG o PNG utilizando cualquier API de Java?
- 14. Cuándo usar PNG o JPG en el desarrollo de iPhone?
- 15. ¿Convertir imagen JPG/GIF a PNG en PHP?
- 16. php imagick convertir PNG a jpg
- 17. Combina dos imágenes transparentes PNG
- 18. Guardar lienzo como PNG o JPG
- 19. Android save view to jpg or png
- 20. imagen para numpy-matriz: JPG PNG vs
- 21. Problema con imágenes PNG en C#
- 22. Cómo leer imágenes PNG en NSImage
- 23. Paperclip guardar las imágenes en formato JPG con fondo blanco
- 24. detectar imágenes similares
- 25. Exportar gráficos de JPanel a .png o .gif o .jpg
- 26. Renderizar marco de flash (SWF) como imagen (PDF, PNG, JPG)
- 27. ¿Cómo guardar la imagen en formato jpg o png en iphone?
- 28. ¿Pueden las imágenes jpg admitir animación?
- 29. Cómo cargar imágenes .png, .jpeg usando MFC?
- 30. Fusionando imágenes png en un archivo pdf
Sugeriría que la única manera de detectar * cada * tipo de error en una imagen (donde "error" se define como cualquier discrepancia que causa un comportamiento imperfecto) es seguir adelante y usar la imagen. Es muy posible que una imagen sufra una corrupción que, no obstante, da como resultado un archivo válido, aunque uno con "los píxeles incorrectos". Puede ser útil pensar muy específicamente sobre qué es lo que quiere detectar. –
ImageIO puede detectar PNG truncado con una excepción lanzada, pero para JPG que está truncado, no puedo hacer que arroje una excepción. –
¿Obtuviste alguna solución para esto? –