Cập nhật
Tôi cũng đã thực hiện giải pháp sau trong tập lệnh Python của mình ở đâ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à hình ảnh 'bị hỏng'. Nhưng, việc cắt tập tin gây ra lỗi luôn luôn.
Cập nhật kết thúc
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 không.
Trong trường hợp bạn nhằm mục đích phát hiện hình ảnh bị hỏng, @nadia alramli gợi ý chính xác phương pháp im.verify[]
, nhưng điều này không phát hiện tất cả các lỗi hình ảnh có thể, 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 khu vực màu xám] .does not detect all the possible image defects, e.g., im.verify
does not detect truncated images [that most viewers often load with a greyed area].
Gối 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ã hình ảnh/recode trong hoặc để kích hoạt kiểm tra. Cuối cùng tôi đề nghị sử dụng mã này:
from PIL import Image
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[Image.FLIP_LEFT_RIGHT]
im.close[]
except:
#manage excetions here
Trong trường hợp lỗi hình ảnh, mã này sẽ tăng một ngoại lệ. Vui lòng xem xét rằng Im.verify nhanh hơn khoảng 100 lần so với thực hiện thao tác hình ảnh [và tôi nghĩ rằng Flip là một trong những biến đổi rẻ hơn]. Với mã này, bạn sẽ xác minh một bộ hình ảnh ở khoảng 10 mbytes/giây với gối tiêu chuẩn hoặc 40 mbyte/giây với mô-đun gối-SIMD [CPU hiện đại 2.5GHz x86_64].
Đối với các định dạng khác XCF, .. bạn có thể sử dụng Wand Wand ImageMagick, mã như sau: Kiểm tra tài liệu đũa phép: Tại đây, để cài đặt: Tại đây
im = wand.image.Image[filename=filename]
temp = im.flip;
im.close[]
Nhưng, từ các thí nghiệm của tôi, WAND không phát hiện ra hình ảnh bị cắt ngắn, tôi nghĩ rằng nó tải thiếu các bộ phận như khu vực màu xám mà không nhắc nhở.
Tôi màu đỏ mà Imagemagick có một lệnh bên ngoài xác định có thể tạo ra công việc, nhưng tôi không tìm thấy cách để gọi chức năng đó theo chương trình và tôi chưa kiểm tra tuyến đường này.could make the job, but I have not found a way to invoke that function programmatically and I have not tested this route.
Tôi đề nghị luôn thực hiện kiểm tra sơ bộ, hãy kiểm tra tệp không phải bằng không [hoặc rất nhỏ], là một ý tưởng rất rẻ:
import os
statfile = os.stat[filename]
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case
Python có nhiều mô -đun trong thư viện tiêu chuẩn của nó. Một cái thường bị bỏ qua là IMGHDR cho phép bạn xác định loại hình ảnh có trong một tệp, luồng byte hoặc đối tượng giống như đường dẫn.
IMGHDR có thể nhận ra các loại hình ảnh sau:imghdr can recognize the following image types:
- RGB
- GIF
- PBM
- PGM
- ppm
- Tiff
- RAST
- XBM
- JPEG / JPG
- BMP
- PNG
- trang web
- exr
Dưới đây là cách bạn sẽ sử dụng IMGHDR để phát hiện loại hình ảnh của một tệp:
>>> import imghdr >>> path = 'python.jpg' >>> imghdr.what[path] 'jpeg' >>> path = 'python.png' >>> imghdr.what[path] 'png'
Tất cả những gì bạn cần làm là truyền một đường dẫn đến Imghdr. Điều gì [đường dẫn] và nó sẽ cho bạn biết nó nghĩ loại hình ảnh là gì.imghdr.what[path] and it will tell you what it thinks the image type is.
Một phương pháp thay thế để sử dụng sẽ là sử dụng gói gối mà bạn có thể cài đặt với PIP nếu bạn chưa có.
Đây là cách bạn có thể sử dụng gối:
>>> from PIL import Image >>> img = Image.open['/home/mdriscoll/Pictures/all_python.jpg'] >>> img.format 'JPEG'
Phương pháp này gần như dễ dàng như sử dụng IMGHDR. Trong trường hợp này, bạn cần tạo một đối tượng hình ảnh và sau đó gọi thuộc tính định dạng của nó. Gối hỗ trợ nhiều loại hình ảnh hơn IMGHDR, nhưng tài liệu không thực sự cho biết nếu thuộc tính định dạng sẽ hoạt động cho tất cả các loại hình ảnh đó.imghdr. In this case, you need to create an Image object and then call its format attribute. Pillow supports more image types than imghdr, but the documentation doesn't really say if the format attribute will work for all those image types.
Dù sao, tôi hy vọng điều này sẽ giúp bạn xác định loại hình ảnh của các tệp của bạn.
Mã nguồn: lib/imghdr.py Lib/imghdr.py
Không dùng nữa kể từ phiên bản 3.11, sẽ bị xóa trong phiên bản 3.13: Mô -đun imghdr
được không dùng nữa [xem PEP 594 để biết chi tiết và lựa chọn thay thế].The
imghdr
module is deprecated [see PEP 594 for details and alternatives].
Mô -đun imghdr
xác định loại hình ảnh có trong một tệp hoặc luồng byte.
Mô -đun imghdr
xác định chức năng sau:
Kiểm tra dữ liệu hình ảnh có trong tệp được đặt tên bằng tệp và trả về một chuỗi mô tả loại hình ảnh. Nếu H tùy chọn được cung cấp, đối số tệp bị bỏ qua và H được giả định chứa luồng byte để kiểm tra.
Các loại hình ảnh sau được nhận dạng, như được liệt kê dưới đây với giá trị trả về từ
im = wand.image.Image[filename=filename]
temp = im.flip;
im.close[]
1:
2 | Các tập tin Imglib SGI |
3
| Tệp GIF 87A và 89A |
4
| Tệp bitmap di động |
5
| Các tập tin graymap di động |
6
| Tệp pixmap di động |
7
| TIFF FILE |
8
| Các tập tin raster mặt trời |
9
| X Tệp bitmap |
0 | Dữ liệu JPEG ở định dạng JFIF hoặc EXIF |
1
| Tệp BMP |
2
| Biểu đồ minh họa mạng lưới không dây |
3
| Tệp web |
4
| Các tập tin openexr |
Mới trong phiên bản 3.5: Các định dạng EXR và trang web đã được thêm vào.The exr and webp formats were added.
Bạn có thể mở rộng danh sách các loại tệp imghdr
có thể nhận ra bằng cách nối thêm biến này:
Một danh sách các chức năng thực hiện các bài kiểm tra riêng lẻ. Mỗi hàm có hai đối số: luồng byte và một đối tượng giống như tệp mở. Khi
im = wand.image.Image[filename=filename]
temp = im.flip;
im.close[]
1 được gọi bằng luồng byte, đối tượng giống như tệp sẽ là import os
statfile = os.stat[filename]
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case
7.Hàm thử nghiệm sẽ trả về một chuỗi mô tả loại hình ảnh nếu thử nghiệm thành công hoặc
import os
statfile = os.stat[filename]
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case
7 nếu nó thất bại.Example:
>>> import imghdr >>> imghdr.what['bass.gif'] 'gif'