Mengotomatiskan pemindaian file grafik untuk korupsi


28

Apakah ada yang tahu cara untuk memeriksa file grafik (khususnya JPEG, GIF, dan PNG) untuk korupsi (lebih disukai dengan cara otomatis)?


Penjelasan:

Beberapa hari yang lalu, sebuah perintah tidak berfungsi dengan benar dan berakhir dengan menghapus ribuan file grafik dari volume FAT32 yang praktis kehabisan ruang. Saya telah menggunakan beberapa program pemulihan file / foto yang berbeda, tetapi secara alami, mereka terbatas pada seberapa banyak mereka dapat pulih (walaupun untungnya volume memiliki cluster 8KB, yang agak membantu).

Bagaimanapun, beberapa file yang lebih besar, yang terfragmentasi, sekarang rusak. Beberapa dari mereka bahkan bukan file nyata sama sekali (perangkat lunak pemulihan hanya membuang cluster yang ditunjukkan oleh entri direktori yang sekarang ditimpa), sementara yang lain rusak karena fragmentasi.

Selain itu, karena beberapa format gambar menyematkan versi gambar yang lebih kecil sebagai thumbnail, pemindaian thumbnail untuk korupsi tidak dapat diandalkan karena mungkin utuh sementara file yang sebenarnya (yaitu, gambar ketika dilihat ukuran penuh), bisa rusak.


Berikut adalah beberapa contoh:

Ini yang kedua. Sangat rusak sehingga tidak menampilkan apa pun.

gambar rusak

(Yang ketiga bahkan tidak akan diunggah karena bahkan tidak memiliki tajuk yang benar!)


Maksud Anda korupsi visual? Saya suka ini ... akhirnya saya bisa berhenti melihat thumbnail dari buku komik saya untuk jpg rusak.
Shinrai

Visual atau struktural. Saya menemukan satu aplikasi yang seharusnya melakukan ini, tetapi itu melewatkan banyak file yang bahkan tidak memiliki header !
Synetech

Oh, hal itu bahkan tidak terpikir olehku. Ya, tolong ... ini harus ada DI MANA SAJA, kan?
Shinrai

1
Bisakah Anda mengunggah satu atau lebih contoh dari file yang rusak dan tautan ke mereka dalam pertanyaan Anda?
slhck

@ Shinrai, memeriksa thumbnail tidak dapat diandalkan karena banyak format gambar menyertakan versi thumbnail terpisah yang tertanam dalam gambar, dan itu mungkin utuh. Itu sebabnya terkadang gambar yang thumbnail-nya terlihat bagus, rusak ketika dibuka.
Synetech

Jawaban:


12

Karena saya menemukan ini ketika mencoba menjawab pertanyaan yang sama saya akan menambahkan solusi hebat yang saya temukan:

Peggy yang buruk

Cuplikan layar aplikasi

Penggunaan
Dari menu pilih File > Scandan kemudian gunakan dialog file untuk menelusuri ke folder di mana gambar berada. Program kemudian akan mulai memindai folder dan semua subfolder untuk gambar (.jpg, .png, .bmp, .gif). Jika Anda ingin memindai banyak gambar, ini akan memakan waktu, karena program ini perlu memuat dan mem-parsing file gambar sepenuhnya, jadi Anda mungkin ingin menjalankannya semalaman.

Saat memindai, itu akan menampilkan persentase kemajuan di bilah status. Gambar apa pun yang ditemukannya yang tidak sempurna akan muncul langsung dalam daftar. Jika Anda mengeklik gambar apa pun pada daftar, itu akan menampilkan pratinjau seperti apa gambar itu. Cukup sering gambar hanya akan memiliki masalah kecil dengan format file dan gambar akan tetap terlihat baik-baik saja. Lain kali gambar tidak akan merender sama sekali dan pratinjau akan menjadi hitam. Terkadang gambar akan rusak dan Anda akan melihat sesuatu seperti pada tangkapan layar di atas.

Trik yang sangat berguna adalah klik pada tajuk kolom Reasondan gambar akan diurutkan berdasarkan seberapa parah mereka rusak (mis. Semua format file buruk yang masih dirender dengan benar akan pindah ke bagian bawah membiarkan Anda fokus pada kasus yang lebih serius) .

Juga jika pemindaian pertama telah selesai dan Anda memulai pemindaian lain, hasilnya hanya akan ditambahkan ke daftar. Jadi, jika Anda memiliki banyak folder berbeda dengan gambar, Anda dapat memindai secara berurutan tanpa daftar dihapus saat Anda memulai pemindaian baru. Jika Anda ingin daftar dihapus, gunakan menu konteks dan klik Clear list.

Tautan
Unduhan untuk Windows, Linux dan OS X dapat ditemukan di sini:
https://www.coderslagoon.com

Kode sumber ada di sini:
https://github.com/llaith/BadPeggy


Terima kasih untuk perbaikannya. Saya telah menambahkan sedikit informasi penggunaan (meskipun programnya sangat jelas).
Paul,

Tautan kode sumber rusak.
Nicolas Raoul

9

Coba opsi jpeginfo ' -c' untuk file JPEG Anda.

Saya telah melihat korupsi yang Anda tunjukkan terjadi pada kartu memori buruk juga.
Apa yang Anda inginkan harus dimungkinkan dan tersedia, periksa Korupsi File Grafik ;
bagian dari Ensiklopedia online Format File Grafik .

Juga lihat Pemeriksaan Integritas File di Pengantar Dasar untuk Fitur PNG .

Anda mungkin tertarik dengan pertanyaan Stackoverflow ini,
Bagaimana cara saya memeriksa secara terprogram apakah suatu gambar (PNG, JPEG, atau GIF) rusak ?


Pembaruan : Source tarball untuk versi 1.6.1 oleh Timo Kokkonen .
Anda harus dapat membangun biner untuk mesin Anda.


Sayangnya, saya tidak dapat menemukan port Windows.
Synetech

jpeginfo adalah open-source; Anda harus bisa mendapatkan tarball dan mengompilasinya di sistem Anda (mungkin dengan Cygwin yang memiliki libjpeg).
nik

Bagaimanapun, ini bisa diperdebatkan, karena saya perlu memindai setidaknya GIF dan PNG juga.
Synetech

1
@nik - direktori aux, yang merupakan bagian dari tarball jpeginfo tidak dapat dibuat dengan nama itu di Windows, membuat ini sangat sulit untuk diekstrak di Windows, apalagi membuatnya sendiri. Sudahkah Anda membangunnya di bawah Windows?
Benteng

jpeginfo -c *.JPG | ag (WARNING|ERROR)bekerja untuk saya
Selrond

3

Program identifikasi ImageMagick akan memberi tahu Anda jika gambar rusak. Pengujian loop 'for i in find' untuk kode tidak ada-0 dari identifikasi akan memungkinkan Anda skrip pengujian dengan mudah untuk membuang daftar file yang rusak atau rusak. Ini bekerja pada Windows dengan PowerShell juga.

masukkan deskripsi gambar di sini

Kode berikut dengan perubahan untuk jalur Anda berfungsi dengan baik di 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()

Saya belum pernah menggunakan ImageMagick untuk sementara waktu (ada bug saat terakhir kali saya mencoba), tapi saya akan memeriksanya. Terima kasih untuk sarannya.
Synetech

1
Alat penampil masih bermasalah, tetapi mengidentifikasi bekerja dengan baik untuk saya dengan masalah yang sama. Saya menggunakan skrip PowerShell seperti ini untuk mendapatkan daftar file gambar yang rusak dan atau 0 panjang.
OldWolf

@Synetech inc. Maaf, tidak dapat memperbarui posting asli dengan kode yang diformat karena gambar telah diposting padanya dan sepertinya saya tidak bisa mendapatkan ini untuk memformat dengan baik juga. Contoh skrip Powershell: (sesuaikan jalur Anda, jenis file, dll.) $ Stream = [System.IO.StreamWriter] "corrupt_jpegs.txt" get-childitem "c: \" -include * .jpg -recurse | foreach ($ _) {& "C: \ Program Files \ ImageMagick-6.7.1-Q16 \ ident.exe" $ _. nama lengkap> $ null if ($ LastExitCode -ne 0) {$ stream.writeline ($ _. nama lengkap)}} $ stream.close ()
OldWolf

1
Dari baris perintah, identifydapat menampilkan data JPEG yang rusak dengan -verbose, biasanya tidak ditampilkan.
kenorb

3

Hal ini dapat dilakukan dengan menggunakan Python Imaging Library ini .verify()perintah . [1]

Untuk menjalankan ini di Windows, instal Python (saya menginstal rilis terbaru Python 2), dan kemudian instal Pillow (garpu Python Imaging Library (PIL)). Kemudian, salin kode jpeg_corrupt.py [2] dan simpan kontennya ke file .PY, misalnya jpeg_corrupt.py.

Perhatikan bahwa saya mengubah baris kode berikut di jpeg_corrupt.py :
self.globs = ['*.jpg', '*.jpe', '*.jpeg']
menjadi
self.globs = ['*.jpg', '*.jpe', '*.jpeg', '*.png', '*.gif']
ini sehingga file .PNG dan .GIF akan dipindai juga.

Kemudian dapat dieksekusi melalui prompt perintah Windows (cmd.exe) seperti ini: C:\Python27\python.exe "C:\Directory containing the .PY file\jpeg_corrupt.py" "C:\Directory of folder to be scanned"

Bagian pertama dari perintah, ' C: \ Python27 \ python.exe ', mungkin berbeda tergantung pada versi Python yang Anda instal dan direktori tempat Anda menginstalnya. Dalam contoh saya, ini adalah direktori instalasi default Python 2.7.

Seharusnya memindai semua gambar JPG, GIF dan PNG di direktori yang ditentukan dan semua subdirektori. Ini akan menampilkan output jika mendeteksi file gambar yang rusak.

Aku berlari ini pada gambar sampel OP dan itu memberi pesan kesalahan ini: ...\YcB9n.png: string index out of range.

Kode juga dapat dimasukkan dalam file skrip .BAT, sehingga Anda dapat dengan mudah menjalankannya direktori yang ditentukan tanpa perlu menggunakan command prompt:

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



Sumber:

[1]: Jawab di Stack Overflow - "Bagaimana cara saya memeriksa secara terprogram apakah suatu gambar (PNG, JPEG, atau GIF) rusak?" oleh ChristopheD
[2]: Komentar oleh Denilson Sá dalam jawaban SO yang ditautkan dalam [1]


4
Saya menghapus beberapa bagian file jpg secara acak - skrip tidak menunjukkan apa-apa. Ini mendeteksi kesalahan dalam kasus terburuk saja - ketika header benar-benar tidak terjawab misalnya ...
Pavel Vlasov

Persis, hal yang sama berlaku untuk jpeginfo.
wp78de

2

Saya telah memodifikasi kode dari jawaban galacticninja untuk melakukan apa yang diinginkan OP. Ini dijalankan dengan cara yang sama, namun itu akan memindahkan file ke folder catch di C:\direktori root , bukan hanya daftar gambar pada command prompt.

Anda dapat menemukan kode saya yang dimodifikasi pada Pastebin atau di bawah:

#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

Instal imagemagick, jika Anda menggunakan Mac Anda dapat menggunakan Homebrew.

brew update && brew install imagemagick

Maka Anda dapat menggunakan skrip Python kecil ini.

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)

Ganti /Your/Path/To/Files/dan batalkan komentar pada baris terakhir jika Anda ingin menghapus gambar yang rusak.


1

Gunakan identifydari paket ImageMagick.

Contoh contoh:

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

Dan perintah berikut akan mengidentifikasi semua file JPEG yang rusak di folder saat ini:

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

0

Jika Anda memasang Perl, Anda dapat menggunakan skrip ini. Anda perlu menyimpan daftar file untuk memeriksa f.txt sebelum Anda menjalankan skrip. Anda dapat membuat daftar ini menggunakan Irfanview. (muat semua jempol dari subfolder dan simpan dalam txt). Daftar file yang baik disimpan di okf.txt dan file yang rusak terdaftar di brokenf.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

Skrip open source Pyhton saya memeriksa integritas media memeriksa integritas gambar, dan file video / audio. Menggunakan modul Bantal, pembungkus ImageMagick dan FFmpeg untuk mencoba mendekode file.

Pillow image.verify tidak melihat semua cacat (misalnya, mengabaikan pemotongan) karena alasan ini saya juga melakukan manipulasi image / decode +.


0

Posting blog ini berisi daftar lima alat yang dapat (mendeteksi dan) memperbaiki file gambar yang rusak. Satu-satunya gratis di antara mereka adalah Perbaikan File 2.1.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.