Python之Django图片生成缩略图

from PIL import Image
#按原图比例生成缩略图
#imgpath 需要生成缩略图图片的地址,如/uploads/111.jpg
#imgthumb 缩略图地址,如/upload/thumb/111.jpg
#wide 缩略图宽度
def imageThb(imgpath = '', imgthumb = '',wide = 200):
    img = ['JPG', 'JPEG', 'PNG', 'GIF']
    mime = imgpath.split('.')[-1]
    # 判断是否是图片格式
    if mime.upper() not in img:
        return False
    try:
        imobj = Image.open(imgpath)
        ratio = imobj.size[0] / imobj.size[1]
        imobj.thumbnail((wide, imobj.size[1] * ratio))
        imobj.save(imgthumb)
        return True
    except Image.UnidentifiedImageError:
        return False

PIL全称是Python Image Library,顾名思义,是用来做图像处理的。

  • 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等;

  • 图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示;

  • PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。


Image类是PIL中的核心类,你有很多种方式来对它进行初始化,比如从文件中加载一张图像,处理其他形式的图像,或者是从头创造一张图像等。

下面是PIL的 Image类中常用的方法和属性:

1、open方法

#Image.open(file) ⇒ image
#Image.open(file, mode) ⇒ image
from PIL import Image
imobj = Image.open(imgpath)

该方法会读取一个图片文件,如果文件不是图片类型,会报异常Image.UnidentifiedImageError


2、save方法

#im.save(outfile,options…)
#im.save(outfile, format, options…)
from PIL import Image
imobj = Image.open(imgpath)
imobj.save(imgthumb)

若要保存文件,则使用 Image 类的 save() 方法,此时保存文件的文件名就变得十分重要了,除非指定格式,否则这个库将会以文件名的扩展名作为格式保存。使用给定的文件名保存图像。如果变量format缺省,如果可能的话,则从文件名称的扩展名判断文件的格式。该方法返回为空。关键字options为文件编写器提供一些额外的指令。如果编写器不能识别某个选项,它将忽略它。用户可以使用文件对象代替文件名称。在这种情况下,用户必须指定文件格式。文件对象必须实现了seek()、tell()和write()方法,且其以二进制模式打开。如果方法save()因为某些原因失败,这个方法将产生一个异常(通常为IOError异常)。如果发生了异常,该方法也有可能已经创建了文件,并向文件写入了一些数据。如果需要的话,用户的应用程序可以删除这个不完整的文件。


3、format属性

#im.format ⇒ string or None
from PIL import Image
im = Image.open(imgpath)
print(im.format) ## 打印出格式信息
im.show()

这个属性标识了图像来源,如果图像不是从文件读取它的值就是None,否则返回图像格式,例如JPEG


4、Mode属性

modes描述
11位像素,黑和白,存成8位的像素
L8位像素,黑白
P8位像素,使用调色板映射到任何其他模式
RGB3× 8位像素,真彩
RGBA4×8位像素,真彩+透明通道
CMYK4×8位像素,颜色隔离
YCbCr3×8位像素,彩色视频格式
I32位整型像素
F32位浮点型像素


#im.mode ⇒ string
from PIL import Image
im = Image.open(imgpath)
print(im.mode) ## 打印出模式信息,如RGB
im.show()


5、convert方法

#im.convert(mode)⇒ image
from PIL import Image
im = Image.open(imgpath)
new_im = im.convert('P')
print(new_im.mode)
new_im.show()

将当前图像转换为其他模式,并且返回新的图像。当从一个调色板图像转换时,这个方法通过这个调色板来转换像素。如果不对变量mode赋值,该方法将会选择一种模式,在没有调色板的情况下,使得图像和调色板中的所有信息都可以被表示出来。当从一个颜色图像转换为黑白图像时,PIL库使用ITU-R601-2 luma转换公式:

L = R * 299/1000 + G * 587/1000 + B * 114/1000

当转换为2位图像(模式“1”)时,源图像首先被转换为黑白图像。结果数据中大于127的值被设置为白色,其他的设置为黑色;这样图像会出现抖动。如果要使用其他阈值,更改阈值127,可以使用方法point()。为了去掉图像抖动现象,可以使用dither选项。

im.convert(“P”,**options) ⇒ image

这个与第一个方法定义一样,但是当“RGB”图像转换为8位调色板图像时能更好的处理。可供选择的选项为:

Dither=. 控制颜色抖动。默认是FLOYDSTEINBERG,与邻近的像素一起承担错误。不使能该功能,则赋值为NONE。

Palette=. 控制调色板的产生。默认是WEB,这是标准的216色的“web palette”。要使用优化的调色板,则赋值为ADAPTIVE。

Colors=. 当选项palette为ADAPTIVE时,控制用于调色板的颜色数目。默认是最大值,即256种颜色


im.convert(mode,matrix) ⇒ image

使用转换矩阵将一个“RGB”图像转换为“L”或者“RGB”图像。变量matrix为4或者16元组。

from PIL import Image
im = Image.open(imgpath)
print(im.mode)
rgb2xyz = (0.412453,0.357580, 0.180423, 0,
           0.212671,0.715160, 0.072169, 0,
           0.019334,0.119193, 0.950227, 0 )
new_im = im.convert("L", rgb2xyz)
print(new_im.mode)
new_im.show()


6、size属性

图像的尺寸,按照像素数计算,它的返回值为宽度和高度的二元组(width, height)。

#im.size ⇒ (width, height)
from PIL import Image
im = Image.open(imgpath)
print(im.size) ## 打印出尺寸信息
im.show()


如需了解更多推荐链接https://blog.csdn.net/zhangziju/article/details/79123275