2011-11-07 8 views
9

मुझे यह पता लगाने की आवश्यकता है कि जावा में छवि फ़ाइल दूषित है या नहीं। मैं केवल पीएनजी, जेपीजी छवियों के साथ काम कर रहा हूं। क्या सांसलन के साथ ऐसा करना संभव है? या यह ImageIO के साथ किया जा सकता है? मैंने ImageIO.read का उपयोग करने की कोशिश की है जैसे यह काम करता है। लेकिन मुझे यकीन नहीं है कि यह छवियों में हर तरह की त्रुटियों का पता लगा सकता है। मैं जानना चाहता हूं कि सबसे अच्छा अभ्यास क्या है।जावा में दूषित छवियों (पीएनजी, जेपीजी) का पता लगाने के लिए

+2

मैं सुझाव दूंगा कि एक छवि में * हर * प्रकार की त्रुटि का पता लगाने का एकमात्र तरीका (जहां "त्रुटि" को किसी भी विसंगति के रूप में परिभाषित किया गया है जो अपूर्ण व्यवहार का कारण बनता है) आगे बढ़ना और छवि का उपयोग करना है। किसी छवि के लिए भ्रष्टाचार का सामना करना पूरी तरह से संभव है, फिर भी एक वैध फ़ाइल में परिणाम होता है, यद्यपि "गलत पिक्सेल" के साथ। यह जानना उपयोगी हो सकता है कि आप किस चीज को पहचानना चाहते हैं। –

+2

इमेजियो एक अपवाद के साथ छिद्रित पीएनजी का पता लगा सकता है, लेकिन जेपीजी को छोटा कर दिया गया है, मैं इसे अपवाद फेंकने के लिए नहीं मिल सकता। –

+0

क्या आपको इसके लिए कोई समाधान मिला? –

उत्तर

1

यदि छवि को पार्स नहीं किया जा सकता है तो फ़ाइल भ्रष्ट है, अन्यथा फ़ाइल वैध होनी चाहिए लेकिन गलत पिक्सेल शामिल हैं क्योंकि एंड्रज ने बताया। यह पता लगाना कि यह मुश्किल हो सकता है यदि आप परिभाषित नहीं कर सकते कि आपको "गलत" पिक्सल कैसे मिलेगा।

यदि आपके पास मूल छवि पर जानकारी है, उदा। एक हिस्टोग्राम या यहां तक ​​कि मूल पिक्सल, आप पढ़ने की छवि वाले लोगों की कोशिश कर सकते हैं और तुलना कर सकते हैं। नोट, हालांकि, संपीड़न के कारण कुछ त्रुटियां हो सकती हैं, इसलिए आपको कुछ सहिष्णुता मूल्य जोड़ने की आवश्यकता होगी।

एक अतिरिक्त पक्ष नोट: सांसेलन जेपीईजी छवियों को नहीं पढ़ेगा, इसलिए आपको इमेजियो का उपयोग करना होगा।

9

यहां मेरा समाधान है जो टूटी हुई जीआईएफ, जेपीजी और पीएनजी की जांच को संभालेगा।

JPEGImageDecoder decoder = new JPEGImageDecoder(new FileImageSource(f) ,new FileInputStream(f)); 
decoder.produceImage(); 

अगर यह: यह छोटा कर दिया जेपीईजी जेपीईजी EOF मार्कर का उपयोग, GIF सीमा अपवाद जाँच से बाहर एक सूचकांक का उपयोग कर और PNG एक 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; 
    } 
} 
} 
+2

क्या जेपीईजी स्थिति की जांच के दो खंडों को तार्किक या इसके बजाय और उससे कनेक्ट नहीं किया जाना चाहिए? – mnicky

+0

क्या आप इस कक्षा को लिंक कर सकते हैं ImageAnalysisResult –

+0

क्या आप अपने उत्तर में सभी आयात विवरण शामिल कर सकते हैं कृपया –

4

का उपयोग कर जेपीईजी में छवि, इस का उपयोग करते हैं के लिए जाँच करता एक अपवाद फेंकता है; इसका मतलब है कि छवि दूषित है। अन्य मामलों के लिए

; वैधता की जांच के लिए बस new ImageIcon(file) का उपयोग करें।

+0

मेरे लिए काम नहीं करता है (http://i.imgur.com/rE89Bpl.jpg)। – mnicky