如何使用标准Python类(不使用外部库)获得图像大小?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (70)

我正在使用Python 2.5。使用Python中的标准类,我想确定文件的图像大小。

我听说过PIL(PythonImageLibrary),但它需要安装才能工作。

如果不使用任何外部库,只使用Python#number0#自己的模块,我如何才能获得图像的大小?

注:我想支持常见的图像格式,特别是JPG和PNG。

提问于
用户回答回答于

首先,关于ubuntu:sudo apt-get install python-imaging

然后:

from PIL import Image
im=Image.open(filepath)
im.size # (width,height) tuple
用户回答回答于

下面是一个python 3脚本,它返回一个包含.png、.gif和.jpeg的图像高度和宽度的元组,而不使用任何外部库(即上文提到的KurtMcKee)。应该相对容易地将其传输到Python 2。

import struct
import imghdr

def get_image_size(fname):
    '''Determine the image type of fhandle and return its size.
    from draco'''
    with open(fname, 'rb') as fhandle:
        head = fhandle.read(24)
        if len(head) != 24:
            return
        if imghdr.what(fname) == 'png':
            check = struct.unpack('>i', head[4:8])[0]
            if check != 0x0d0a1a0a:
                return
            width, height = struct.unpack('>ii', head[16:24])
        elif imghdr.what(fname) == 'gif':
            width, height = struct.unpack('<HH', head[6:10])
        elif imghdr.what(fname) == 'jpeg':
            try:
                fhandle.seek(0) # Read 0xff next
                size = 2
                ftype = 0
                while not 0xc0 <= ftype <= 0xcf:
                    fhandle.seek(size, 1)
                    byte = fhandle.read(1)
                    while ord(byte) == 0xff:
                        byte = fhandle.read(1)
                    ftype = ord(byte)
                    size = struct.unpack('>H', fhandle.read(2))[0] - 2
                # We are at a SOFn block
                fhandle.seek(1, 1)  # Skip `precision' byte.
                height, width = struct.unpack('>HH', fhandle.read(4))
            except Exception: #IGNORE:W0703
                return
        else:
            return
        return width, height

扫码关注云+社区

领取腾讯云代金券