Grafik dosyalarının taranmasını önlemek için otomatikleştirme


27

Grafik dosyalarını (özellikle JPEG, GIF ve PNG) bozulmalara karşı (tercihen otomatik bir şekilde) kontrol etmenin bir yolunu bilen var mı?


Açıklama:

Birkaç gün önce, bir komut yanlış çalıştı ve neredeyse grafik dışı bir FAT32 biriminden binlerce grafik dosyasını silmeye başladı. Birkaç farklı dosya / fotoğraf kurtarma programı kullandım, ancak doğal olarak, ne kadar toparlayabilecekleri konusunda sınırlılar (neyse ki birimin 8KB küme olmasına rağmen, bu da bir şekilde yardımcı oluyor).

Her neyse, parçalanmış büyük dosyalardan bazıları şimdi bozulmuştur. Hatta bazıları gerçek dosya bile değildir (kurtarma yazılımı, sadece üzerine yazılan dizin girişlerinin gösterdiği kümeleri çökertti), bazıları ise parçalanma nedeniyle bozuldu.

Ayrıca, bazı resim formatları, resmin küçük bir sürümünü küçük resim olarak gömdüğü için, küçük resimlerin bozulmaya karşı taranması güvenilir değildir, çünkü gerçek dosya (yani, tam boyutlu görüntülendiğinde resim) bozulmuş olabilir.


Burada bir çift örnek var:

İşte ikincisi. Hiçbir şey göstermeyecek kadar hasar gördü.

hasarlı görüntü

(Üçüncüsü bile yüklenmedi çünkü doğru başlığa bile sahip değil!)


Görme bozukluğunu kastediyorsunuz, sanırım? Bunu SEVİYORUM ... nihayet çizgi romanlarımın küçük resimlerini kırık jpgs için izlemekten vazgeçebilirdim.
Shinrai

Görsel veya yapısal. Sözde bunu yapan bir uygulama buldum, ancak başlığına bile sahip olmayan birçok dosyayı kaçırdım !
Synetech

Oh, o şey benim başıma gelmedi bile. Evet, lütfen ... bu, bir yerde doğru olmalı?
Shinrai

1
Böyle bir bozuk dosya için bir veya daha fazla örnek yükleyebilir ve sorunuza bunlara link verebilir misiniz?
slhck

@Shinrai, minik resimleri incelemek güvenilir değil çünkü birçok resim formatı resimde gömülü ayrı bir minik resim sürümü içeriyor ve sağlam olabilir. Bu yüzden bazen küçük resmi iyi görünen bir resim açıldığında bozuluyor.
Synetech

Yanıtlar:


12

Aynı soruyu cevaplamaya çalışırken karşılaştığım için bulduğum başka harika bir çözüm ekleyeceğim:

Kötü Peggy

Uygulamanın ekran görüntüsü

Kullanım
Menüden, File > Scangörüntülerin bulunduğu klasöre göz atmak için dosya iletişim kutusunu seçin ve kullanın. Program daha sonra görüntüler için klasör ve tüm alt klasörleri taramaya başlayacaktır (.jpg, .png, .bmp, .gif). Çok fazla resim taramak istiyorsanız, bu işlem biraz zaman alacaktır, çünkü programın resim dosyasını tam olarak yüklemesi ve ayrıştırması gerekir, bu yüzden gece boyunca çalışmasına izin vermek isteyebilirsiniz.

Tarama yaparken durum çubuğunda bir ilerleme yüzdesi gösterecektir. Mükemmel olmadığını bulduğu görüntüler doğrudan listede görünecektir. Listedeki herhangi bir resmi tıklarsanız, resmin nasıl göründüğünün bir önizlemesi gösterilir. Oldukça sık bir görüntünün dosya biçiminde yalnızca küçük bir sorunu olur ve görüntü yine de iyi görünecektir. Diğer zamanlarda görüntü hiç işlenmez ve önizleme yalnızca siyah olur. Bazen görüntü zarar görür ve yukarıdaki ekran görüntüsünde olduğu gibi bir şey görürsünüz.

Çok kullanışlı bir hile sütun başlığına tıklamaktır Reasonve görüntüler ne kadar kötü hasar gördüklerine göre sıralanır (örneğin, doğru şekilde işleyen tüm kötü dosya biçimleri, daha ciddi durumlara odaklanmanıza izin vererek en alt seviyeye taşınır) .

Ayrıca, ilk tarama bittiyse ve başka bir tarama başlatırsanız, sonuçlar listeye eklenir. Bu nedenle, görüntülü birçok farklı klasörünüz varsa, yeni bir taramaya başladığınızda liste silinmeden bunları sırayla tarayabilirsiniz. Listenin silinmesini istiyorsanız, içerik menüsünü kullanın ve tıklayın Clear list.

Bağlantılar
Windows, Linux ve OS X için indirmeleri burada bulabilirsiniz:
https://www.coderslagoon.com

Kaynak kodu burada:
https://github.com/llaith/BadPeggy


Düzeltme için teşekkürler. Biraz kullanım bilgisi ekledim (program çok açıklayıcı olsa da).
Paul,

Kaynak kodu bağlantısı koptu.
Nicolas Raoul

9

JPEG dosyalarınız için jpeginfo ' -c' seçeneğini deneyin .

Gösterdiğin yozlaşmanın da kötü hafıza kartlarında olduğunu gördüm.
İstediğiniz mümkün ve kullanılabilir olmalıdır ; Grafik Dosyalarının Bozulması ;
çevrimiçi Grafik Dosya Biçimleri Ansiklopedisi'nden bir bölüm .

Ayrıca bakınız Dosya Bütünlüğü Çekler içinde A Temel Giriş PNG Özellikleri .

Bu Stackoverflow sorusu ilginizi çekebilir,
bir resmin (PNG, JPEG veya GIF) bozuk olup olmadığını programlı olarak nasıl kontrol ederim ?


Güncelleme : Timo Kokkonen tarafından sürüm 1.6.1 için kaynak tarball . Makineniz için bir binary oluşturabilmelisiniz.


Ne yazık ki, herhangi bir Windows portu bulamıyorum.
Synetech

jpeginfo açık kaynaklı; tarball'ı alabilmeniz ve sisteminizde derleyebilmeniz gerekir (belki libjpeg'i olan Cygwin ile).
nik

Her iki şekilde de olabilir, çünkü en azından GIF ve PNG'leri de taramam gerekiyor.
Synetech

1
jpeginfo'nun tarball'ının bir parçası olan @nik - aux dizini, Windows'ta bu adla oluşturulamaz, bu, Windows altında bile ayıklanmayı zorlaştırır, daha az tek başına oluşturması. Windows altında inşa etmeyi başardınız mı?
Rook

jpeginfo -c *.JPG | ag (WARNING|ERROR)benim için çalıştı
Selrond

3

ImageMagick tanımlama programı, bir görüntünün bozuk olup olmadığını size bildirir. Tanımlamak için bir 0 dönüş kodu için bir 'i bulmak için' döngü testi, bozuk veya bozuk dosyaların bir listesini dökmek için testi kolayca kolayca kodlamanızı sağlar. PowerShell ile Windows üzerinde de çalışır.

görüntü tanımını buraya girin

Yolunuzda yaptığınız değişiklikleri içeren aşağıdaki kod powershell'de iyi çalışıyor

$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'i bir süredir kullanmamıştım (en son denediğimde hatalar vardı), ama içine bakacağım. Önerin için teşekkürler.
Synetech

1
İzleyici aracı hala buggy, ancak tanımlayıcı benim için de benzer bir problemle çalıştı. Bozuk ve veya 0 uzunluktaki görüntü dosyalarının bir listesini almak için böyle bir powershell betiğini kullandım.
OldWolf

@ Synetech inc. Maalesef, bir resim gönderildiği için orijinal yazıyı biçimlendirilmiş kodla güncelleyemiyorum ve bunu da güzel bir biçimde biçimlendirmek için görünmüyor. Örnek Powershell betiği: (yollarınızı, dosya türlerinizi vb. Ayarlayın.) $ Stream = [System.IO.StreamWriter] "corrupt_jpegs.txt" get-childitem "c: \" -include * .jpg -recurse | foreach ($ _) {& "C: \ Program Files \ ImageMagick-6.7.1-Q16 \ define.exe" $ _. tam adı> $ null ise ($ LastExitCode -ne 0) {$ stream.writeline ($ _. fullname)}} $ stream.close ()
OldWolf

1
Komut satırından identifybozuk JPEG verilerini gösterebilir -verbose, normalde göstermez.
kenorb

3

Bu Python Imaging Library'nin .verify()komutunu kullanarak yapılabilir . [1]

Bunu Windows'ta çalıştırmak için, Python'u yükleyin (Python 2'nin en son sürümünü yükledim) ve sonra Pillow'u (bir Python Görüntüleme Kütüphanesi (PIL) çatalı) kurun . Ardından, jpeg_corrupt.py [2] kodunu kopyalayın ve içeriğini .PY dosyasına kaydedin, örneğin jpeg_corrupt.py.

Jpeg_corrupt.py dosyasında aşağıdaki kod satırını değiştirdiğimi unutmayın :
self.globs = ['*.jpg', '*.jpe', '*.jpeg']
to
self.globs = ['*.jpg', '*.jpe', '*.jpeg', '*.png', '*.gif']
Buna, .PNG ve .GIF dosyaları da taranacaktır.

Daha sonra, bunun gibi Windows komut istemi (cmd.exe) aracılığıyla çalıştırılabilir: C:\Python27\python.exe "C:\Directory containing the .PY file\jpeg_corrupt.py" "C:\Directory of folder to be scanned"

Komutun ilk bölümü olan ' C: \ Python27 \ python.exe ', yüklediğiniz Python sürümüne ve onu yüklediğiniz dizine bağlı olarak farklı olabilir. Benim örneğimde, Python 2.7'nin varsayılan kurulum dizinidir.

Belirtilen dizindeki ve alt dizinlerinin tümündeki JPG, GIF ve PNG resimlerini taramalıdır. Bozuk bir görüntü dosyası tespit ederse bir çıktı gösterecektir.

Ben OP'ın örnek görüntü üzerinde bu koştum ve onu bu hata mesajını verdi: ...\YcB9n.png: string index out of range.

Kod bir .BAT komut dosyasına da girilebilir, böylece komut istemini kullanmanıza gerek kalmadan kolayca belirtilen bir dizini çalıştırabilirsiniz:

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



Kaynaklar:

[1]: Yığın Taşması Yanıtı - "Bir görüntünün (PNG, JPEG veya GIF) bozuk olup olmadığını programlı olarak nasıl kontrol ederim?" ChristopheD
[2]: [1] 'deki SO cevabındaki Denilson Sá tarafından yapılan yorum.


4
Bir jpg dosyasının bazı bölümlerini rastgele sildim - komut dosyası hiçbir şey göstermedi. Yalnızca en kötü durumlarda hataları algılar - örneğin başlık tamamen kaçırıldığında ...
Pavel Vlasov

Aynen, aynısı jpeginfo için de geçerli.
wp78de

2

Galaktikninja'nın cevabındaki kodu OP'nin istediğini yapması için değiştirdim . Aynı şekilde çalıştırılır, ancak C:\yalnızca komut isteminde görüntüleri listelemek yerine dosyaları kök dizindeki bir yakalama klasörüne taşır .

Değiştirilmiş kodumu Pastebin'de veya altında bulabilirsiniz:

#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

Imaemagick'i yükleyin, Mac kullanıyorsanız Homebrew kullanabilirsiniz.

brew update && brew install imagemagick

Sonra bu küçük Python betiğini kullanabilirsiniz.

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/Bozuk görüntüleri silmek istiyorsanız, son satırı değiştirin ve yorumunu kaldırın.


1

identifyImageMagick paketinden kullanın .

Örnek örnek:

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

Ve aşağıdaki komut geçerli klasördeki tüm bozuk JPEG dosyalarını tanımlar:

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

0

Eğer Perl'i yüklediyseniz, bu betiği kullanabilirsiniz. Komut dosyasını çalıştırmadan önce f.txt dosyasını kontrol etmek için dosyaların listesini kaydetmeniz gerekir. Bu listeyi Irfanview kullanarak yapabilirsiniz. (tüm başparmakları alt klasörlerden yükleyin ve txt'ye kaydedin). İyi dosyaların listesi okf.txt içine kaydedilir ve bozuk dosyalar brokenf.txt içinde listelenir.

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

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

Açık kaynak kodlu Pyhton script check-media- bütünlüğü, resimlerin ve video / ses dosyalarının bütünlüğünü kontrol eder. Dosyaları çözmeyi denemek için Pillow modülleri, ImageMagick ve FFmpeg paketleyicileri kullanır.

Pillow image.verify tüm hataları görmüyor (örneğin, kesmeyi yok sayar) bu nedenle de image / decode + manipülasyonu yaptım.


0

Bu blog yazısı , bozuk görüntü dosyalarını onarabilen (tespit edip) beş araç listeler . Bunlardan sadece bir tanesi Dosya Onarımı 2.1.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.