Devo rilevare se il file immagine è danneggiato in Java. Sto lavorando solo con immagini PNG, JPG. E 'possibile farlo con Sanselan? Oppure può essere fatto con ImageIO? Ho provato a utilizzare ImageIO.read sembra che funzioni. Ma non sono sicuro che possa rilevare ogni tipo di errore nelle immagini. Mi piacerebbe sapere qual è la migliore pratica.Come rilevare immagini danneggiate (PNG, JPG) in Java
risposta
Se l'immagine non può essere analizzata, il file è corrotto, altrimenti il file dovrebbe essere valido ma contiene i pixel errati come sottolineato da Andrzej. Rilevare che potrebbe essere piuttosto difficile se non è possibile definire come si troveranno i pixel "sbagliati".
Se si dispone di informazioni sull'immagine di base, ad es. un istogramma o anche i pixel originali, si potrebbe provare a confrontare quelli con l'immagine di lettura. Si noti, tuttavia, che a causa della compressione potrebbero esserci alcuni errori, quindi è necessario aggiungere un valore di tolleranza.
Un'ulteriore nota a margine: Sanselan non leggerà le immagini JPEG, quindi è necessario utilizzare ImageIO qui.
Ecco la mia soluzione che gestirà il controllo di file GIF, JPG e PNG danneggiati. Si verifica la presenza di troncata JPEG usando il marcatore JPEG EOF, GIF utilizzando un indice di controllo limiti eccezione e PNG utilizzando 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;
}
}
}
Le due clausole del controllo delle condizioni JPEG non dovrebbero essere collegate con OR logico invece di AND? – mnicky
Puoi collegare questa classe ImageAnalysisResult –
Puoi includere tutte le istruzioni di importazione nella tua risposta per favore –
Se l'immagine in formato JPEG, utilizzare questo:
JPEGImageDecoder decoder = new JPEGImageDecoder(new FileImageSource(f) ,new FileInputStream(f));
decoder.produceImage();
se lancia un'eccezione; questo significa che l'immagine è corrotta.
per gli altri casi; basta usare new ImageIcon(file)
per verificare la validità.
Non funziona per me (http://i.imgur.com/rE89Bpl.jpg). – mnicky
- 1. Conversione di immagini .jpg in .png
- 2. Come convertire immagini JPG in PNG utilizzando JavaScript
- 3. SVG in JPG/PNG
- 4. paperclip - conversione di immagini tiff in jpg o png
- 5. Il file Java esiste Case sensitive .jpg e .JPG
- 6. Inserisci PNG su un JPG in PHP
- 7. ReportViewer che mostra immagini danneggiate in Chrome
- 8. Rilevamento di immagini danneggiate nello script bash
- 9. Rinominare un gruppo di immagini PNG con estensione ".jpg" su ".png"
- 10. Rileva Eof per immagini JPG
- 11. Mostra immagini jpg in python
- 12. Converti l'immagine JPG/GIF in PNG in PHP?
- 13. come sapere questa immagine è jpg o png iphone
- 14. Posso usare l'immagine JPG invece dell'immagine PNG come sfondo?
- 15. Scrivi metadati sia in jpg che in png
- 16. Frame di rendering Flash (SWF) come immagine (PDF, PNG, JPG)
- 17. PIL Converti PNG o GIF con trasparenza in JPG senza
- 18. Overlay PNG su JPG con Imagick
- 19. immagine per NumPy-array: JPG vs PNG
- 20. Quando utilizzare PNG o JPG nello sviluppo di iPhone?
- 21. combinare due immagini trasparenti PNG
- 22. Qual è il miglior formato per utilizzare le immagini (png, jpg) in iOS?
- 23. Problema con immagini PNG in C#
- 24. Unisci immagini in PHP - GIF e JPG
- 25. Come scrivere metadati personalizzati in immagini PNG su iOS
- 26. Come posso modificare un'immagine jpg tramite Java?
- 27. Converti .psd e .ai in PNG/JPG con imagick
- 28. Usa PHP per convertire PNG in JPG con la compressione?
- 29. Carica jpg/png, converti in pdf e salva con PHP?
- 30. Conversione di un array di byte in PNG/JPG
Suggerirei che l'unico modo per rilevare * ogni * tipo di errore in un'immagine (dove "errore" è definito come qualsiasi discrepanza che causa un comportamento imperfetto) è quello di andare avanti e utilizzare l'immagine. È del tutto possibile che un'immagine subisca una corruzione che comunque produce un file valido, anche se con "pixel errati". Potrebbe essere utile pensare in modo molto specifico a ciò che vuoi rilevare. –
ImageIO può rilevare il PNG troncato con un'eccezione generata, ma per JPG che viene troncato, non riesco a ottenere un'eccezione. –
Hai trovato qualche soluzione per questo? –