Tự động quét các tệp đồ họa cho tham nhũng


27

Có ai biết cách kiểm tra các tệp đồ họa (đặc biệt là JPEG, GIF và PNG) xem có bị hỏng không (tốt nhất là theo cách tự động)?


Giải trình:

Vài ngày trước, một lệnh hoạt động không chính xác và cuối cùng đã xóa hàng ngàn tệp đồ họa khỏi ổ đĩa FAT32 thực tế đã hết dung lượng. Tôi đã sử dụng một số chương trình phục hồi tập tin / ảnh khác nhau, nhưng một cách tự nhiên, chúng bị giới hạn về mức độ chúng có thể phục hồi (mặc dù may mắn là âm lượng có cụm 8KB, giúp ích phần nào).

Dù sao, một số tệp lớn hơn, bị phân mảnh, hiện bị hỏng. Một số trong số chúng thậm chí không phải là tệp thực sự (phần mềm khôi phục chỉ đổ các cụm được chỉ ra bởi các mục nhập thư mục hiện bị ghi đè), trong khi các phần mềm khác bị hỏng do bị phân mảnh.

Ngoài ra, do một số định dạng hình ảnh nhúng phiên bản nhỏ hơn của hình ảnh dưới dạng hình thu nhỏ, việc quét hình thu nhỏ để tìm tham nhũng là không đáng tin cậy vì nó có thể còn nguyên vẹn trong khi tệp thực tế (ví dụ: hình ảnh khi được xem ở kích thước đầy đủ), có thể bị hỏng.


Dưới đây là một vài ví dụ:

Đây là cái thứ hai. Nó bị hư hỏng đến nỗi nó không hiển thị bất cứ thứ gì.

hình ảnh bị hư hỏng

(Người thứ ba thậm chí sẽ không tải lên vì nó thậm chí không có tiêu đề chính xác!)


Bạn có nghĩa là tham nhũng thị giác, tôi giả sử? Tôi YÊU điều này ... cuối cùng tôi cũng có thể ngừng nhìn vào hình thu nhỏ của những cuốn truyện tranh của mình vì những jpg bị hỏng.
Shinrai

Trực quan hoặc cấu trúc. Tôi đã tìm thấy một ứng dụng được cho là đã làm điều này, nhưng nó đã bỏ lỡ rất nhiều tệp thậm chí không có tiêu đề !
Synetech

Ồ, những thứ đó thậm chí không xảy ra với tôi. Vâng, xin vui lòng ... điều này phải tồn tại SOMEWHERE phải không?
Shinrai

1
Bạn có thể tải lên một hoặc nhiều ví dụ về một tệp bị hỏng như vậy và liên kết với chúng trong câu hỏi của bạn không?
slhck

@Shinrai, kiểm tra hình thu nhỏ không đáng tin cậy vì nhiều định dạng hình ảnh bao gồm một phiên bản hình thu nhỏ riêng biệt được nhúng trong hình ảnh và điều đó có thể còn nguyên vẹn. Đó là lý do tại sao đôi khi một hình ảnh có hình thu nhỏ của nó trông đẹp, bị hỏng khi mở.
Synetech

Câu trả lời:


12

Vì tôi tình cờ phát hiện ra điều này trong khi cố gắng trả lời cùng một câu hỏi, tôi sẽ thêm một giải pháp tuyệt vời khác mà tôi đã tìm thấy:

Xấu

Ảnh chụp màn hình của ứng dụng

Cách sử dụng
Từ menu chọn File > Scanvà sau đó sử dụng hộp thoại tập tin để duyệt đến thư mục chứa hình ảnh. Chương trình sau đó sẽ bắt đầu quét thư mục và tất cả các thư mục con cho hình ảnh (.jpg, .png, .bmp, .gif). Nếu bạn muốn quét nhiều hình ảnh, việc này sẽ mất một chút thời gian, vì chương trình cần tải đầy đủ và phân tích tệp hình ảnh, vì vậy bạn có thể muốn để nó chạy qua đêm.

Trong khi quét, nó sẽ hiển thị phần trăm tiến trình trong thanh trạng thái. Bất kỳ hình ảnh nào nó thấy không hoàn hảo sẽ hiển thị trực tiếp trong danh sách. Nếu bạn nhấp vào bất kỳ hình ảnh nào trong danh sách, nó sẽ hiển thị bản xem trước của hình ảnh trông như thế nào. Thông thường, một hình ảnh sẽ chỉ có một vấn đề nhỏ với định dạng tệp và hình ảnh sẽ vẫn ổn. Những lần khác, hình ảnh hoàn toàn không hiển thị và phần xem trước sẽ chỉ có màu đen. Đôi khi hình ảnh sẽ bị hỏng và bạn sẽ thấy một cái gì đó giống như trong ảnh chụp màn hình ở trên.

Một mẹo rất tiện lợi là nhấp vào tiêu đề cột Reasonvà các hình ảnh sẽ được sắp xếp theo mức độ hư hỏng của chúng (ví dụ: tất cả các định dạng tệp xấu vẫn hiển thị chính xác sẽ di chuyển xuống dưới cùng cho phép bạn tập trung vào các trường hợp nghiêm trọng hơn) .

Ngoài ra nếu lần quét đầu tiên kết thúc và bạn bắt đầu một lần quét khác, kết quả sẽ chỉ được thêm vào danh sách. Vì vậy, nếu bạn có nhiều thư mục khác nhau với hình ảnh, bạn có thể chỉ cần quét chúng liên tục mà không bị xóa danh sách khi bạn bắt đầu quét mới. Nếu bạn muốn xóa danh sách, sử dụng menu ngữ cảnh và nhấp Clear list.

Liên kết
Tải xuống cho Windows, Linux và OS X có thể được tìm thấy ở đây:
https://www.coderslagoon.com

Mã nguồn ở đây:
https://github.com/llaith/BadPeggy


Cảm ơn đã sửa chữa. Tôi đã thêm một ít thông tin sử dụng (mặc dù chương trình rất tự giải thích).
Paul

Liên kết mã nguồn bị hỏng.
Nicolas Raoul

9

Hãy thử tùy chọn jpeginfo ' -c' cho các tệp JPEG của bạn.

Tôi cũng đã thấy sự tham nhũng mà bạn thể hiện xảy ra với thẻ nhớ xấu.
Những gì bạn muốn nên có thể và có sẵn, hãy kiểm tra Tham nhũng của Tệp Đồ họa ;
một phần trong Từ điển bách khoa trực tuyến về định dạng tệp đồ họa .

Đồng thời xem Kiểm tra tính toàn vẹn của tệp trong phần Giới thiệu cơ bản về các tính năng PNG .

Bạn có thể quan tâm đến câu hỏi Stackoverflow này,
Làm cách nào để lập trình kiểm tra xem hình ảnh (PNG, JPEG hoặc GIF) có bị hỏng không?


Cập nhật : Nguồn tarball cho phiên bản 1.6.1 của Timo Kokkonen .
Bạn sẽ có thể xây dựng một nhị phân cho máy của bạn.


Thật không may, tôi không thể tìm thấy bất kỳ cổng Windows nào.
Synetech

jpeginfo là mã nguồn mở; bạn sẽ có thể lấy tarball và biên dịch nó trên hệ thống của bạn (có thể với Cygwin có libjpeg).
nik

Dù sao đi nữa, vì tôi cũng cần quét ít nhất là GIF và PNG.
Synetech

1
@nik - thư mục phụ, là một phần của tarball của jpeginfo không thể được tạo dưới tên đó trên Windows, khiến cho việc này rất khó để trích xuất trong Windows, ít hơn là xây dựng nó. Bạn đã quản lý để xây dựng nó trong Windows?
Rook

jpeginfo -c *.JPG | ag (WARNING|ERROR)làm việc cho tôi
Selrond

3

Chương trình nhận dạng của ImageMagick sẽ cho bạn biết nếu một hình ảnh bị hỏng. Kiểm tra vòng lặp 'for i in find' cho mã trả về không 0 từ nhận dạng sẽ cho phép bạn tạo kịch bản kiểm tra khá dễ dàng để loại bỏ danh sách các tệp bị hỏng hoặc bị hỏng. Nó cũng hoạt động trên Windows với PowerShell.

nhập mô tả hình ảnh ở đây

Đoạn mã sau với các thay đổi cho đường dẫn của bạn hoạt động tốt trong 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()

Tôi đã không sử dụng ImageMagick trong một thời gian (nó đã bị lỗi lần trước khi tôi thử), nhưng tôi sẽ xem xét nó. Cám ơn vì sự gợi ý.
Synetech

1
Công cụ xem vẫn còn lỗi, nhưng xác định đã làm việc rất tốt với tôi với một vấn đề tương tự. Tôi đã sử dụng một tập lệnh powershell như thế này để có được một danh sách các tập tin hình ảnh bị hỏng và 0 độ dài.
OldWolf

@Synetech inc. Xin lỗi, không thể cập nhật bài viết gốc với mã được định dạng vì một hình ảnh đã được đăng lên nó và tôi dường như không thể có được định dạng này một cách độc đáo. Kịch bản Powershell mẫu: (điều chỉnh đường dẫn, loại tệp của bạn, v.v.) $ stream = [System.IO.StreamWriter] "Corrupt_jpegs.txt" get-childitem "c: \" -include * .jpg -recurse | foreach ($ _) {& "C: \ Chương trình tập tin \ ImageMagick-6.7.1-Q16 \ ID.exe" $ _. fullname> $ null if ($ LastExitCode -ne 0) {$ stream.writeline ($ _. tên đầy đủ)}} $ stream.close ()
OldWolf

1
Từ dòng lệnh, identifycó thể hiển thị dữ liệu JPEG bị hỏng với -verbose, thông thường nó không hiển thị.
kenorb

3

Điều này có thể được thực hiện bằng cách sử dụng lệnh của Thư viện hình ảnh Python.verify() . [1]

Để chạy cái này trong Windows, hãy cài đặt Python (Tôi đã cài đặt bản phát hành Python 2 mới nhất hiện tại), sau đó cài đặt Gối (một nhánh của Thư viện hình ảnh Python (PIL)). Sau đó, sao chép mã của jpeg_corrupt.py [2] và lưu nội dung của nó vào tệp .PY, ví dụ: jpeg_corrupt.py.

Lưu ý rằng tôi đã thay đổi dòng mã sau trong jpeg_corrupt.py :
self.globs = ['*.jpg', '*.jpe', '*.jpeg']
thành
self.globs = ['*.jpg', '*.jpe', '*.jpeg', '*.png', '*.gif']
Điều này để các tệp .PNG và .GIF cũng sẽ được quét.

Sau đó, nó có thể được thực thi thông qua dấu nhắc lệnh Windows (cmd.exe) như thế này: C:\Python27\python.exe "C:\Directory containing the .PY file\jpeg_corrupt.py" "C:\Directory of folder to be scanned"

Phần đầu tiên của lệnh, ' C: \ Python27 \ python.exe ', có thể khác nhau tùy thuộc vào phiên bản Python bạn đã cài đặt và thư mục bạn đã cài đặt. Trong ví dụ của tôi, nó là thư mục cài đặt mặc định của Python 2.7.

Nó nên quét tất cả các hình ảnh JPG, GIF và PNG trong thư mục được chỉ định và tất cả các thư mục con của nó. Nó sẽ hiển thị đầu ra nếu phát hiện tệp hình ảnh bị hỏng.

Tôi đã chạy nó trên hình ảnh mẫu của OP và nó đã đưa ra thông báo lỗi này : ...\YcB9n.png: string index out of range.

Mã cũng có thể được nhập vào tệp tập lệnh .BAT, vì vậy bạn có thể dễ dàng chạy nó một thư mục được chỉ định mà không cần sử dụng dấu nhắc lệnh:

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



Nguồn:

[1]: Trả lời trong Stack Overflow - "Làm cách nào để lập trình kiểm tra xem hình ảnh (PNG, JPEG hoặc GIF) có bị hỏng không?" by BarsheD
[2]: Nhận xét của Denilson Sá trong câu trả lời SO được liên kết trong [1]


4
Tôi đã xóa ngẫu nhiên một số phần của tệp jpg - tập lệnh không hiển thị gì. Nó chỉ phát hiện lỗi trong những trường hợp xấu nhất - ví dụ như khi tiêu đề hoàn toàn bị bỏ qua ...
Pavel Vlasov

Chính xác, điều tương tự cũng xảy ra với jpeginfo.
wp78de

2

Tôi đã sửa đổi mã từ câu trả lời của galacticninja để làm chính xác những gì OP muốn. Nó được chạy theo cùng một cách, tuy nhiên nó sẽ di chuyển các tệp vào thư mục bắt trong thư mục gốc C:\thay vì chỉ liệt kê các hình ảnh trên dấu nhắc lệnh.

Bạn có thể tìm thấy mã sửa đổi của tôi trên Pastebin hoặc bên dưới:

#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

Cài đặt hình ảnh, nếu bạn trên Mac, bạn có thể sử dụng Homebrew.

brew update && brew install imagemagick

Sau đó, bạn có thể sử dụng tập lệnh Python nhỏ này.

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)

Thay thế /Your/Path/To/Files/và bỏ ghi chú dòng cuối cùng nếu bạn muốn xóa các hình ảnh bị hỏng.


1

Sử dụng identifytừ gói ImageMagick.

Ví dụ mẫu:

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

Và lệnh sau sẽ xác định tất cả các tệp JPEG bị hỏng trong thư mục hiện tại:

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

0

Nếu bạn đã cài đặt Perl thì bạn có thể sử dụng tập lệnh này. Bạn cần lưu danh sách các tệp để kiểm tra trong f.txt trước khi chạy tập lệnh. Bạn có thể tạo danh sách này bằng cách sử dụng Irfanview. (tải tất cả các ngón tay cái từ các thư mục con và lưu trong txt). Danh sách các tệp tốt được lưu trong okf.txt và các tệp bị hỏng được liệt kê trong 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

Kịch bản Pyhton mã nguồn mở của tôi kiểm tra tính toàn vẹn phương tiện truyền thông kiểm tra tính toàn vẹn của hình ảnh và tệp video / âm thanh. Nó sử dụng các mô-đun Gối, trình bao bọc ImageMagick và FFmpeg để thử giải mã các tệp.

Gối image.verify không nhìn thấy tất cả các khiếm khuyết (ví dụ: bỏ qua cắt ngắn) vì lý do này tôi cũng đã thực hiện thao tác hình ảnh / giải mã + thao tác.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.