भ्रष्टाचार के लिए ग्राफिक्स फ़ाइलों की स्कैनिंग को स्वचालित करना


28

क्या किसी को भ्रष्टाचार के लिए ग्राफिक्स फ़ाइलों (विशेष रूप से जेपीईजी, जीआईएफ, और पीएनजी) की जांच करने का एक तरीका पता है (अधिमानतः स्वचालित तरीके से)?


स्पष्टीकरण:

कुछ दिनों पहले, एक कमांड ने गलत तरीके से काम किया और एक FAT32 वॉल्यूम से हजारों ग्राफिक्स फ़ाइलों को हटा दिया जो व्यावहारिक रूप से अंतरिक्ष से बाहर था। मैंने कई अलग-अलग फ़ाइल / फोटो-रिकवरी कार्यक्रमों का उपयोग किया है, लेकिन स्वाभाविक रूप से, वे इस बात में सीमित हैं कि वे कितना पुनर्प्राप्त कर सकते हैं (हालांकि सौभाग्य से वॉल्यूम में 8KB क्लस्टर हैं, जो कुछ हद तक मदद करता है)।

वैसे भी, कुछ बड़ी फाइलें, जो खंडित थीं, अब भ्रष्ट हैं। उनमें से कुछ भी वास्तविक फाइलें नहीं हैं (रिकवरी सॉफ़्टवेयर ने केवल उन समूहों को हटा दिया है जो अब-ओवरराइट लिखित प्रविष्टियों द्वारा इंगित किए गए थे), जबकि अन्य विखंडन के कारण टूट गए हैं।

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


यहां कुछ उदाहरण दिए गए हैं:

यहाँ दूसरा है। यह इतना क्षतिग्रस्त है कि यह कुछ भी प्रदर्शित नहीं करता है।

क्षतिग्रस्त छवि

(एक तीसरा भी अपलोड नहीं होगा क्योंकि इसमें सही हेडर भी नहीं है!)


आप दृश्य भ्रष्टाचार का मतलब है, मुझे लगता है? मैं इसे प्यार करता हूँ ... अंत में मैं टूटी हुई jpgs के लिए मेरी कॉमिक पुस्तकों के थंबनेल को रोक सकता था।
शिन्राय

दृश्य या संरचनात्मक। मुझे एक ऐसा ऐप मिला जो माना जाता है कि ऐसा किया गया था, लेकिन इसमें बहुत सारी फाइलें छूट गईं, जिनमें हेडर भी नहीं था !
Synetech

ओह, वह सामान मेरे पास भी नहीं था। हाँ, कृपया ... यह कुछ सही मौजूद है?
शिन्राइ

1
क्या आप ऐसी किसी टूटी हुई फ़ाइल का एक या अधिक उदाहरण अपलोड कर सकते हैं और उन्हें अपने प्रश्न में लिंक कर सकते हैं?
स्लैक

@Shinrai, थंबनेल की जांच विश्वसनीय नहीं है क्योंकि कई चित्र प्रारूपों में चित्र में एक अलग थंबनेल संस्करण शामिल है, और यह बरकरार भी हो सकता है। इसलिए कभी-कभी एक चित्र जिसका थंबनेल ठीक दिखता है, खुलने पर भ्रष्ट होता है।
Synetech

जवाबों:


12

चूँकि मैं एक ही सवाल का जवाब देने की कोशिश कर रहा था, इसलिए मैंने इसे एक और बढ़िया समाधान से जोड़ दिया।

खराब पैगी

एप्लिकेशन का स्क्रीनशॉट

उपयोग
मेनू से चयन करें File > Scanऔर फिर उस फ़ोल्डर में ब्राउज़ करने के लिए फ़ाइल संवाद का उपयोग करें जिसमें चित्र स्थित हैं। फिर प्रोग्राम छवियों और (.jpg, .png, .bmp, .gif) के लिए फ़ोल्डर और सभी सबफ़ोल्डरों को स्कैन करना शुरू कर देगा। यदि आप बहुत सारी तस्वीरों को स्कैन करना चाहते हैं तो इसमें कुछ समय लगेगा, क्योंकि प्रोग्राम को पूरी तरह से लोड करने और छवि फ़ाइल को पार्स करने की आवश्यकता है, इसलिए आप इसे रात भर चलने देना चाहते हैं।

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

कॉलम हेडर में एक बहुत ही आसान ट्रिक पर क्लिक किया जाता है Reasonऔर चित्रों को इस आधार पर क्रमबद्ध किया जाएगा कि वे कितनी बुरी तरह क्षतिग्रस्त हैं (जैसे कि सभी खराब फ़ाइल प्रारूप जो अभी भी सही ढंग से प्रस्तुत होते हैं, नीचे की ओर बढ़ेंगे और अधिक गंभीर मामलों पर ध्यान केंद्रित करेंगे) ।

इसके अलावा अगर पहला स्कैन समाप्त हो गया है और आप दूसरा स्कैन शुरू करते हैं, तो परिणाम बस सूची में जुड़ जाएंगे। इसलिए यदि आपके पास छवियों के साथ कई अलग-अलग फ़ोल्डर हैं, तो जब आप एक नया स्कैन शुरू करते हैं, तो बिना सूची को साफ़ किए आप उन्हें क्रमिक रूप से स्कैन कर सकते हैं। यदि आप सूची साफ़ करना चाहते हैं, तो संदर्भ मेनू का उपयोग करें और क्लिक करें Clear list


विंडोज, लिनक्स और ओएस एक्स के लिंक डाउनलोड यहां देखे जा सकते हैं:
https://www.coderslagoon.com

स्रोत कोड यहां है:
https://github.com/llaith/BadPeggy


ठीक करने के लिए धन्यवाद। मैंने थोड़ी उपयोग जानकारी जोड़ी है (भले ही कार्यक्रम बहुत आत्म-व्याख्यात्मक हो)।
पॉल

सोर्स कोड लिंक टूट गया है।
निकोलस राउल

9

अपनी JPEG फ़ाइलों के लिए jpeginfo ' -c' विकल्प आज़माएं ।

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

पीएनजी सुविधाओं के लिए एक मूल परिचय में फाइल इंटीग्रिटी चेक भी देखें ।

आप इस Stackoverflow सवाल में रुचि हो सकती है,
मैं कैसे प्रोग्राम की जाँच करें कि क्या एक छवि (PNG, JPEG, या GIF) दूषित है ?


अपडेट : टिमो कोककोनन द्वारा संस्करण 1.6.1 के लिए स्रोत टारबॉल । आपको अपनी मशीन के लिए एक बाइनरी बनाने में सक्षम होना चाहिए।


दुर्भाग्य से, मुझे कोई विंडोज पोर्ट नहीं मिल रहा है।
21

jpeginfo ओपन-सोर्स है; आपको टारबॉल प्राप्त करने में सक्षम होना चाहिए और इसे अपने सिस्टम पर संकलित करना चाहिए (हो सकता है कि सिग्विन के साथ जिसमें लिबजप्रेस हो)।
निक

यह किसी भी तरह से लूट है, क्योंकि मुझे कम से कम GIF और PNG को स्कैन करने की आवश्यकता है।
सिनटेक

1
@ मिनिक - ऑक्स डायरेक्टरी, जो कि jpeginfo के टेरबॉल का हिस्सा है, विंडोज पर उस नाम के तहत नहीं बनाई जा सकती है, जिससे विंडोज के तहत निकालने में बहुत मुश्किल होती है, कम अकेले इसे बनाते हैं। क्या आप इसे विंडोज के तहत बनाने में कामयाब रहे हैं?
रूक

jpeginfo -c *.JPG | ag (WARNING|ERROR)मेरे लिए काम किया
Selrond

3

ImageMagick की पहचान कार्यक्रम आपको बताएगा कि क्या कोई छवि भ्रष्ट है। पहचान के लिए कोई भी 0-रिटर्न कोड के लिए लूप टेस्टिंग में 'a for i' लगता है, जिससे आप क्षतिग्रस्त या दूषित फ़ाइलों की सूची को डंप करने के लिए टेस्ट को आसानी से स्क्रिप्ट कर पाएंगे। यह Windows पर PowerShell के साथ भी काम करता है।

यहाँ छवि विवरण दर्ज करें

आपके पथ के परिवर्तनों के साथ निम्न कोड शब्

$stream = [System.IO.StreamWriter] "corrupt_jpegs.txt" 
get-childitem "c:\" -include *.jpg -recurse | foreach ($_) { 
    & "C:\Program Files\ImageMagick-6.7.1-Q16\identify.exe" $_.fullname > $null 
    if($LastExitCode -ne 0){ 
        $stream.writeline($_.fullname) 
    } 
} 
$stream.close()

मैंने थोड़ी देर में ImageMagick का उपयोग नहीं किया है (यह पिछली बार जब मैंने कोशिश की थी तब कीड़े थे), लेकिन मैं इसे देखूंगा। सलाह के लिये धन्यवाद।
Synetech

1
दर्शक उपकरण अभी भी छोटी गाड़ी है, लेकिन एक समान समस्या के साथ मेरे लिए बहुत काम की पहचान है। मैंने भ्रष्ट और या 0 लंबाई वाली छवि फ़ाइलों की सूची प्राप्त करने के लिए इस तरह से एक शक्तियुक्त स्क्रिप्ट का उपयोग किया।
ओल्डवुल्फ

@ सिंथे इंक। क्षमा करें, मूल पोस्ट को स्वरूपित कोड के साथ अपडेट नहीं किया जा सकता है क्योंकि एक छवि को पोस्ट किया गया था और मुझे यह अच्छी तरह से प्रारूपित करने के लिए नहीं मिल सकता है। नमूना पॉवर्सशेल स्क्रिप्ट: (अपने रास्तों, फ़ाइल प्रकारों को समायोजित करें ..) $ स्ट्रीम = [System.IO.StreamWriter] "भ्रष्ट_jpegs.txt" get-childitem "c: \" -include * .jpg -recurse | foreach ($ _) {& "C: \ Program Files \ ImageMagick-6.7.1-Q16 \" "$ _। fullname> $ null अगर ($ LastExitCode -ne 0) {$ stream.writeline ($ _)। fullname)}} $ स्ट्रीम.close ()
ओल्डवुल्फ

1
कमांड लाइन से, identifyभ्रष्ट जेपीईजी डेटा दिखा सकता है -verbose, आम तौर पर यह नहीं दिखाता है।
kenorb

3

यह पायथन इमेजिंग लाइब्रेरी की .verify()कमांड का उपयोग करके किया जा सकता है । [1]

विंडोज में इसे चलाने के लिए, पायथन स्थापित करें (मैंने पायथन 2 की वर्तमान नवीनतम रिलीज स्थापित की है), और फिर पिलो (पायथन इमेजिंग लाइब्रेरी (पीआईएल) का एक कांटा) स्थापित करें। फिर, jpeg_corrupt.py [2] के कोड को कॉपी करें और इसकी सामग्री को .PY फ़ाइल, जैसे jpeg_corrupt.py पर सहेजें।

ध्यान दें कि मैं में कोड की निम्न पंक्ति बदल jpeg_corrupt.py :
self.globs = ['*.jpg', '*.jpe', '*.jpeg']
करने के लिए
self.globs = ['*.jpg', '*.jpe', '*.jpeg', '*.png', '*.gif']
यह बहुत .PNG और .GIF फ़ाइलों भी स्कैन किया जाएगा।

इसे इस तरह विंडोज कमांड प्रॉम्प्ट (cmd.exe) के माध्यम से निष्पादित किया जा सकता है: C:\Python27\python.exe "C:\Directory containing the .PY file\jpeg_corrupt.py" "C:\Directory of folder to be scanned"

कमांड का पहला भाग, ' C: \ Python27 \ python.exe ', हो सकता है कि आपके द्वारा स्थापित पायथन के किस संस्करण के आधार पर भिन्न हो और आपने इसे किस निर्देशिका में स्थापित किया। मेरे उदाहरण में, यह पायथन 2.7 की डिफ़ॉल्ट स्थापना निर्देशिका है।

यह सभी जेपीजी, जीआईएफ और पीएनजी छवियों को निर्दिष्ट निर्देशिका और उसके सभी उपनिर्देशिकाओं में स्कैन करना चाहिए। यदि यह एक दूषित छवि फ़ाइल का पता लगाता है तो यह आउटपुट दिखाएगा।

मैंने इसे ओपी की नमूना छवि पर चलाया और इस त्रुटि संदेश को दिया ...\YcB9n.png: string index out of range:।

कोड को एक .BAT स्क्रिप्ट फ़ाइल में भी दर्ज किया जा सकता है, इसलिए आप आसानी से इसे निर्दिष्ट निर्देशिका को कमांड कमांड का उपयोग करने की आवश्यकता के बिना चला सकते हैं:

C:\Python27\python.exe "C:\Directory containing the .PY file\jpeg_corrupt.py" "%CD%"
pause



सूत्रों का कहना है:

[१]: स्टैक ओवरफ्लो में उत्तर - "मैं कैसे प्रोग्रामेटिक रूप से जांच सकता हूं कि क्या कोई छवि (PNG, JPEG, या GIF) दूषित है?" ChristopheD द्वारा
[2]: एसओ उत्तर में डेनिल्सन सा द्वारा टिप्पणी [1] में जुड़ा हुआ है


4
मैंने एक jpg फ़ाइल के कुछ हिस्सों को यादृच्छिक रूप से हटा दिया - स्क्रिप्ट ने कुछ नहीं दिखाया। यह केवल सबसे खराब मामलों में त्रुटियों का पता लगाता है - जब हेडर पूरी तरह से उदाहरण के लिए याद किया जाता है ...
Pavel Vlasov

वास्तव में, वही jpeginfo के लिए जाता है।
wp78de

2

मैंने गैलेक्टिनिन्जा के जवाब से कोड को संशोधित किया है जो ओपी चाहता था। यह उसी तरह से चलाया जाता है, हालांकि यह फाइलों को रूट C:\प्रॉम्प्ट में कैच फ़ोल्डर में ले जाएगा, बजाय कमांड प्रॉम्प्ट पर छवियों को सूचीबद्ध करने के।

आप पास्टिबिन पर या नीचे मेरा संशोधित कोड पा सकते हैं :

#This program will scan a directory and all it's subdirectories for corrupted jpg, png, gif, and bmp images and collect them in a Catch folder

#To run this program you will need to install Python 2.7 and PILLOW
#Once installed save this file in a notepad document with the .py extension
#Than run cmd.exe and type the following: C:\Python27\python.exe "C:\Directory this is saved in\this.py" "C:\Directory to be scanned"
#You must make a folder called Catch in your root C:\ directory for the corrupted images to be collected in


#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# vi:ts=4 sw=4 et

# Okay, this code is a bit ugly, with a few "anti-patterns" and "code smell".
# But it works and I don't want to refactor it *right now*.

# TODO:
#  * Refactor it a little
#  * Add support for custom filename filter (instead of the hardcoded one)

#Big thanks to denilsonsa for writing most of this code at https://bitbucket.org/denilsonsa/small_scripts/src/542edd54d290d476603e939027ca654b25487d85/jpeg_corrupt.py?at=default


import getopt
import fnmatch
import re
import os
import os.path
import sys
import PIL.Image


available_parameters = [
    ("h", "help", "Print help"),
    ("v", "verbose", "Also print clean files"),
]


class ProgramOptions(object):
    """Holds the program options, after they are parsed by parse_options()"""

    def __init__(self):
        self.globs = ['*.jpg', '*.jpe', '*.jpeg', '*.gif', '*.png', '*.bmp']
        self.glob_re = re.compile('|'.join(
            fnmatch.translate(g) for g in self.globs
        ), re.IGNORECASE)

        self.verbose = False
        self.args = []


def print_help():
    global opt
    scriptname = os.path.basename(sys.argv[0])
    print "Usage: {0} [options] files_or_directories".format(scriptname)
    print "Recursively checks for corrupt image files"
    print ""
    print "Options:"
    long_length = 2 + max(len(long) for x,long,y in available_parameters)
    for short, long, desc in available_parameters:
        if short and long:
            comma = ", "
        else:
            comma = "  "

        if short == "":
            short = "  "
        else:
            short = "-" + short[0]

        if long:
            long = "--" + long

        print "  {0}{1}{2:{3}}  {4}".format(short,comma,long,long_length, desc)

    print ""
    print "Currently (it is hardcoded), it only checks for these files:"
    print "  " + " ".join(opt.globs)


def parse_options(argv, opt):
    """argv should be sys.argv[1:]
    opt should be an instance of ProgramOptions()"""

    try:
        opts, args = getopt.getopt(
            argv,
            "".join(short for short,x,y in available_parameters),
            [long for x,long,y in available_parameters]
        )
    except getopt.GetoptError as e:
        print str(e)
        print "Use --help for usage instructions."
        sys.exit(2)

    for o,v in opts:
        if o in ("-h", "--help"):
            print_help()
            sys.exit(0)
        elif o in ("-v", "--verbose"):
            opt.verbose = True
        else:
            print "Invalid parameter: {0}".format(o)
            print "Use --help for usage instructions."
            sys.exit(2)

    opt.args = args
    if len(args) == 0:
        print "Missing filename"
        print "Use --help for usage instructions."
        sys.exit(2)


def is_corrupt(imagefile):
    """Returns None if the file is okay, returns an error string if the file is corrupt."""
    #http://stackoverflow.com/questions/1401527/how-do-i-programmatically-check-whether-an-image-png-jpeg-or-gif-is-corrupted/1401565#1401565
    try:
        im = PIL.Image.open(imagefile)
        im.verify()
    except Exception as e:
        return str(e)
    return None


def check_files(files):
    """Receives a list of files and check each one."""
    global opt
    i = 0
    for f in files:
        # Filtering JPEG, GIF, PNG, and BMP images
        i=i+1
        if opt.glob_re.match(f):
            status = is_corrupt(f)
            if opt.verbose and status is None:
                status = "Ok"
            if status:
                file = "{0}".format(f, status)
                print file
                shorthand = file.rsplit('\\', 1)
                extention =shorthand[1]
                fullFileName = "C:\Catch" + "\\" + extention
                os.rename(file, fullFileName)


def main():
    global opt
    opt = ProgramOptions()
    parse_options(sys.argv[1:], opt)

    for pathname in opt.args:
        if os.path.isfile(pathname):
            check_files([pathname])
        elif os.path.isdir(pathname):
            for dirpath, dirnames, filenames in os.walk(pathname):
                check_files(os.path.join(dirpath, f) for f in filenames)
        else:
            print "ERROR: '{0}' is neither a file or a dir.".format(pathname)


if __name__ == "__main__":
    main()

2

यदि आप मैक पर हैं, तो आप Homebrew का उपयोग कर सकते हैं, imagemagick स्थापित करें।

brew update && brew install imagemagick

तब आप इस छोटे से पायथन स्क्रिप्ट का उपयोग कर सकते हैं।

import os
from subprocess import Popen, PIPE

def checkImage(fn):
    proc = Popen(['identify', '-verbose', fn], stdout=PIPE, stderr=PIPE)
    out, err = proc.communicate()
    exitcode = proc.returncode

    return exitcode, out, err

for directory, subdirectories, files in os.walk('/Your/Path/To/Files/'):
    for file in files:
        filePath = os.path.join(directory, file)
        code, output, error = checkImage(filePath)
        if code != 0 or error != '':
            print(str(code)+' '+error)
            #os.remove(filePath)

/Your/Path/To/Files/यदि आप दूषित छवियों को हटाना चाहते हैं, तो अंतिम पंक्ति को बदलें और अनसुना करें।


1

identifyImageMagick पैकेज से उपयोग करें ।

नमूना उदाहरण:

identify -verbose -regard-warnings my_file.jpg >/dev/null && echo File is OK. || echo File is corrupted.

और निम्न आदेश वर्तमान फ़ोल्डर में सभी दूषित JPEG फ़ाइलों की पहचान करेगा:

find . -name \*.jpg -exec identify -verbose -regard-warnings {} >/dev/null "+"

0

यदि आपके पास पर्ल स्थापित है तो आप इस स्क्रिप्ट का उपयोग कर सकते हैं। स्क्रिप्ट चलाने से पहले आपको f.txt में जाँच करने के लिए फ़ाइलों की सूची को सहेजने की आवश्यकता है। आप इरफानव्यू का उपयोग करके यह सूची बना सकते हैं। (सब थ्रेडर्स को सबमर्स से लोड करें और txt में सेव करें)। अच्छी फ़ाइलों की सूची को okf.txt में सहेजा गया है और भ्रष्ट फ़ाइलों को टूटी हुई सूची में सूचीबद्ध किया गया है।

=====================

use Image::Magick;

open(BROKEN, ">>brokenf.txt");  # Open for appending
open(OK, ">>okf.txt");  # Open for appending
$list='f.txt';          
open(TOSORT, $list) or die("Could not open  file."); 
foreach $pic (<TOSORT>)  {     
    chomp($pic);   
    $p = new Image::Magick;
    $s = 0;    
    $error = $p->Read($pic);
        if ($error) {print BROKEN $pic . "\n";
                   }     
           else {
                  print OK $pic . "\n"; 
                }  
    }
close(TOSORT);
close(BROKEN);
close(OK);
    }

close(TOSORT);
close(BROKEN);
close(OK);

0

मेरा खुला स्रोत पायथन लिपि चेक-मीडिया-अखंडता तस्वीरों की अखंडता, और वीडियो / ऑडियो फाइलों की जांच करता है। यह फाइल को डिकोड करने के लिए पिलो मॉड्यूल, इमेजमैजिक और एफएफएमपी रैपर का उपयोग करता है।

पिलो इमेज ।verify सभी दोषों को नहीं देखता है (उदाहरण के लिए, ट्रंकेशन को अनदेखा करता है) इस कारण से मैंने इमेज / डिकोड + मैनिपुलेशन भी किया।


0

यह ब्लॉग पोस्ट उन पांच टूल को सूचीबद्ध करता है जो दूषित छवि फ़ाइलों की पहचान (और पता) कर सकते हैं । उनमें से एकमात्र मुफ्त फ़ाइल मरम्मत 2.1 है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.