1. 程式人生 > >python模塊之imghdr檢測圖片類型

python模塊之imghdr檢測圖片類型

logs python模塊 資料 .cn href 類型 manager 表示 response

1. imghdr是什麽

imghdr是一個用來檢測圖片類型的模塊,傳遞給它的可以是一個文件對象,也可以是一個字節流。

能夠支持的圖片格式:

技術分享

2. 如何使用

提供了一個api叫做imghdr.what,這個方法接受兩個參數,第一個參數是一個文件對象,第二個參數是一個字節流數組。

文件對象用來對本地文件做檢測,字節流用來對網絡上的做檢測。

當需要對文件進行檢測的時候只傳入第一個參數即可。

當需要對一個字節流檢測的時候第一個參數傳None,第二個參數傳入字節流即可,當第二個參數被指定的時候第一個參數就會被忽略掉了所以值是什麽無所謂

其返回值是一個字符串,是上面表格中的一個,表示檢測到的此圖片的類型。

2.1 對文件做檢測:對磁盤文件檢測

只傳第一個參數的時候通常是對已經存儲在本地磁盤上的文件檢測一下格式,一個簡單的例子如下:

#! /usr/bin/python

import imghdr

if __name__ == ‘__main__‘:
    # 檢測一個文件
    with open(‘D:/foo.jpg‘, ‘rb‘) as img_file:
        print(imghdr.what(img_file))
輸出:
jpeg

2.2 對流做檢測:在爬蟲中的應用

在寫爬蟲的時候如果爬取圖片的話,在保存的時候我們需要知道圖片的格式,不然gif的保存為了png什麽的就動不起來了,但是有一些圖片的格式是不太容易由url中識別出來的,比如有些圖片的url是這個樣子的:

http://www.foo.com/bar.png?foo=bar

像這種要做後綴截取的話需要考慮很多情況,搞很多用例來測試,有點得不償失啊,所以這個時候imghdr就派上用場了。

這是一個簡單的爬取圖片檢測後綴格式的例子:

#! /usr/bin/python

import imghdr
import urllib3
import uuid


class Spider:
    """
    蜘蛛俠,爬爬爬
    """
    pool_manager = urllib3.PoolManager()

    @staticmethod
    def get(url):
        return Spider.pool_manager.urlopen(‘GET‘, url)


class ImageDownLoader:
    """
    圖片下載器
    """
    @staticmethod
    def download(url, path):
        """
        這個方法用來下載圖片並保存
        :param url:  圖片的路徑
        :param path: 要保存到的路徑
        :return:
        """
        response = Spider.get(url)
        save_name = path + uuid.uuid1().hex + "." + imghdr.what(None, response.data)
        with open(save_name, ‘wb‘) as img_file:
            img_file.write(response.data)


if __name__ == ‘__main__‘:
    ImageDownLoader.download(‘http://img3.doubanio.com/view/photo/albumcover/public/p2327732376.webp‘, ‘D:/‘)

參考資料:

1. https://docs.python.org/3.6/library/imghdr.html

python模塊之imghdr檢測圖片類型