Cập nhật
Tôi cũng đã triển khai giải pháp sau trong tập lệnh Python của mình tại đây trên GitHub .
Tôi cũng xác minh rằng các tệp bị hỏng (jpg) thường không phải là ảnh 'bị hỏng', tức là tệp ảnh bị hỏng đôi khi vẫn là tệp ảnh hợp pháp, ảnh gốc bị mất hoặc bị thay đổi nhưng bạn vẫn có thể tải nó mà không bị lỗi. Tuy nhiên, việc cắt ngắn tệp luôn gây ra lỗi.
Kết thúc cập nhật
Bạn có thể sử dụng mô-đun Python Pillow (PIL), với hầu hết các định dạng hình ảnh, để kiểm tra xem tệp có phải là tệp hình ảnh hợp lệ và nguyên vẹn hay không.
Trong trường hợp bạn nhắm đến việc phát hiện cả hình ảnh bị hỏng, @Nadia Alramli đề xuất chính xác im.verify()
phương pháp, nhưng điều này không phát hiện tất cả các lỗi hình ảnh có thể có , ví dụ: im.verify
không phát hiện hình ảnh bị cắt ngắn (mà hầu hết người xem thường tải với một vùng xám).
Pillow cũng có thể phát hiện các loại khuyết tật này, nhưng bạn phải áp dụng thao tác hình ảnh hoặc giải mã / mã hóa hình ảnh trong hoặc để kích hoạt kiểm tra. Cuối cùng, tôi đề nghị sử dụng mã này:
try:
im = Image.load(filename)
im.verify() #I perform also verify, don't know if he sees other types o defects
im.close() #reload is necessary in my case
im = Image.load(filename)
im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
im.close()
except:
#manage excetions here
Trong trường hợp có lỗi hình ảnh, mã này sẽ đưa ra một ngoại lệ. Hãy coi rằng im.verify nhanh hơn khoảng 100 lần so với việc thực hiện thao tác trên hình ảnh (và tôi nghĩ rằng lật là một trong những phép biến đổi rẻ hơn). Với mã này, bạn sẽ xác minh một tập hợp hình ảnh ở tốc độ khoảng 10 MByte / giây với Pillow tiêu chuẩn hoặc 40 MByte / giây với mô-đun Pillow-SIMD (CPU 2,5Ghz x86_64 hiện đại).
Đối với các định dạng khác psd , xcf , .. bạn có thể sử dụng Imagemagick wrapper Wand , mã như sau:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Tuy nhiên, từ các thử nghiệm của tôi, Wand không phát hiện ra hình ảnh bị cắt bớt, tôi nghĩ rằng nó tải các phần thiếu dưới dạng vùng xám mà không cần nhắc.
Tôi đỏ mà ImageMagick có một lệnh bên ngoài xác định rằng có thể làm cho công việc, nhưng tôi đã không tìm thấy một cách để gọi chức năng lập trình và tôi đã không kiểm tra tuyến đường này.
Tôi đề nghị luôn thực hiện kiểm tra sơ bộ, kiểm tra kích thước tệp để không bằng 0 (hoặc rất nhỏ), là một ý tưởng rất rẻ :
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case