web-dev-qa-db-fra.com

Automatiser la numérisation des fichiers graphiques pour la corruption

Est-ce que quelqu'un connaît une façon de vérifier les fichiers graphiques (en particulier JPEG, GIF et PNG) pour la corruption (de préférence d'une manière automatisée)?


Explication:

Il y a quelques jours, une commande a travaillé de manière incorrecte et a fini par supprimer des milliers de fichiers graphiques d'un volume FAT32 qui était pratiquement hors de l'espace. J'ai utilisé plusieurs programmes différents de fichiers/de photo-récupération, mais naturellement, ils sont limités dans combien ils peuvent récupérer (bien que heureusement, le volume a des grappes de 8 ko, ce qui aide quelque peu).

Quoi qu'il en soit, certains des fichiers plus volumineux, fragmentés, sont maintenant corrompus. Certains d'entre eux ne sont même pas des fichiers réels du tout (le logiciel de récupération a simplement vidé les grappes qui ont été signalés par des entrées de répertoire maintenant écrasées), tandis que d'autres sont cassés en raison de la fragmentation.

De plus, comme certains formats d'images ont incorporé une version plus petite de la photo comme une vignette, la numérisation des vignettes de corruption n'est pas fiable car elle peut être intacte pendant que le fichier réel (c'est-à-dire la photo lors de la visualisation de taille moyenne), pourrait être corrompu.


Voici quelques exemples:

Voici le second. Il est tellement endommagé qu'il n'ayant rien afficher.

damaged image

(Un troisième == ne serait même pas téléchargé parce que cela n'a même pas la bonne en-tête!)

28
Synetech

Essayez le ( Jpeginfo '-c 'Option pour vos fichiers JPEG.

J'ai vu la corruption que vous montrez aussi avec de mauvaises cartes mémoire.
[.____] Ce que vous voulez devrait être possible et disponible, vérifiez corruption des fichiers graphiques ;
[.____] une section de la ligne en ligne Encyclopédie des formats de fichier graphique .

Voir également Vérifications d'intégrité du fichier dans ne introduction de base à [~ # ~] png [~ # ~] Caractéristiques .

Vous pouvez être intéressé par cette question Stackoverflow,
[.____] Comment vérifier par programme si une image (png, jpeg ou gif) est corrompue ?


Mise à jour : Source Tarball pour version 1.6.1 par Timo Kokkonen =.
[.____] Vous devriez être capable de construire un binaire pour votre machine.

10
nik

Identifier ImageMagick Programme vous permettra de savoir si une image est corrompue. Un test de boucle "pour I in Recound" pour un code de retour NON-0 de Identifier vous permettrait de scripter le test de manière assez facile à jeter une liste de fichiers endommagés ou corrompus. Cela fonctionne aussi sur Windows avec PowerShell.

enter image description here

Le code suivant avec les modifications de votre chemin fonctionne bien dans 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()
4
OldWolf

Installez ImageMagick, si vous êtes sur Mac, vous pouvez utiliser Homebrew.

brew update && brew install imagemagick

Ensuite, vous pouvez utiliser ce petit Python script.

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)

Remplacer /Your/Path/To/Files/ Et Définissez la dernière ligne si vous souhaitez supprimer les images corrompues.

3
Gotenks

J'ai modifié le code de la réponse de Galacticninja pour faire exactement ce que veuillez rechercher. Il est exécuté de la même manière, mais il déplacera les fichiers dans un dossier de capture dans la racine C:\ répertoire au lieu de simplement inscrire les images sur l'invite de commande.

Vous pouvez trouver mon code modifié sur Pastebin ou ci-dessous:

#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()
3
CosmicNaut

Ce message de blog répertorie cinq outils pouvant (détecter et) réparation Fichiers d'image corrompue. Le seul gratuit d'entre eux est la réparation de fichiers 2.1.

1
root

Utilisez identify de l'emballage imagemagick.

Exemple d'échantillon:

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

Et la commande suivante identifierait tous les fichiers JPEG corrompus dans le dossier actuel:

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