Trong phần này, ta sẽ xem loại file ảnh là gì. Xét tình huống: trong một thư mục có hàng trăm file ảnh và ta muốn lấy tất cả file jpeg (hoặc loại ảnh cụ thể nào đó). Tất cả sẽ làm tự động bằng Python.
Python cung cấp thư viện xác định loại ảnh, một trong đó là imghdr.
Package imghdr của Python xác định loại ảnh chứa trong file hoặc byte stream.
Cài đặt
Rất có thể nếu bạn dùng Python 3.6 trở lên, module imghdr là package chuẩn và đi kèm cài đặt Python.
Để cài imghdr, chạy lệnh sau trong terminal:
pip install imghdr
Sau khi cài thành công, để kiểm tra imghdr đã cài đúng chưa, import module trong Python shell.
>>> import imghdr >>>
Nếu không báo lỗi, nghĩa là imghdr đã cài trên máy.
Cú pháp
Package imghdr định nghĩa hàm sau:
imghdr.what(filename[, h])
Trong đó
Filename: kiểm tra dữ liệu ảnh trong file tên filename và trả về chuỗi mô tả loại ảnh.
h: Tùy chọn, nếu h có mặt – filename bị bỏ qua và h được giả định chứa byte stream để test.
Dưới đây là các loại ảnh được phép nhận diện bằng imghdr:
| Giá trị | Định dạng ảnh |
|---|---|
| 'rgb' | SGI ImgLib Files |
| 'gif' | GIF 87a and 89a Files |
| 'pbm' | Portable Bitmap Files |
| 'pgm' | Portable Graymap Files |
| 'ppm' | Portable Pixmap Files |
| 'tiff' | TIFF Files |
| 'rast' | Sun Raster Files |
| 'xbm' | X Bitmap Files |
| 'jpeg' | JPEG data in JFIF or Exif formats |
| 'bmp' | BMP files |
| 'png' | Portable Network Graphics |
Nhưng ta có thể mở rộng danh sách loại file imghdr nhận diện bằng cách thêm vào biến này.
imghdr.tests
Hàm này chứa danh sách các hàm thực hiện test riêng lẻ. Mỗi hàm nhận hai đối số: byte-stream và đối tượng file-like mở. Tuy nhiên, khi what() gọi với byte-stream, đối tượng file-like sẽ là None.
Hàm test trả về loại ảnh dạng chuỗi, hoặc None nếu thất bại.
>>> import imghdr >>> imghdr.what('clock.jpg') 'jpeg' Dưới đây chỉ là một triển khai của imghdr, nếu đuôi file ảnh cụ thể có mặt thì làm thao tác tương ứng:
def identify_filetype(url, imageName, folderName): session = _setupSession() try: # time out là tham số khác được tinh chỉnh image = session.get(url, timeout = 5) with open(os.path.join(folderName, imageName),'wb') as fout: fout.write(image.content) fileExtension = imghdr.what(os.path.join(folderName, imageName)) if fileExtension is None: os.remove(os.path.join(folderName, imageName)) else: newName = imageName + '.' + str(fileExtension) os.rename(os.path.join(folderName, imageName), os.path.join(folderName, newName)) except Exception as e: print ("failed to download one pages with url of " + str(url))