Pillow的使用-Image篇_pillow image-程序员宅基地

技术标签: image  python  pillow  

安装Pillow

pip install pillow

构建图像

  • Image.open(fp, mode =’r’ ):打开图片文件,返回一个Image对象
    • fp:图片路径
    • mode:模式。如果给出,必须是r
from PIL import Image
im = Image.open(path)
  • Image.alpha_composite(im1, im2):在im1对象上的透明层复合im2,返回一个Image对象
    • im1:Image对象1
    • im2:Image对象2
from PIL import Image
im1 = Image.open(path1)
im2 = Image.open(path2)
im3 = Image.alpha_composite(im1,im2)
  • Image.blend(im1, im2, alpha):在两个图片对象之间进行插值,返回一个Image对象
    • im1:Image对象1
    • im2:Image对象2
    • alpha:透明图

如果alpha为0.0,则返回第一个图像的副本。如果alpha为1.0,则返回第二个图像的副本,基本的算法如下:

out  =  image1  *  (1.0  -  alpha ) +  image2  *  alpha
  • Image.eval(image, *args):将函数应用于给定图像的中每一个像素。请注意,该函数对每个可能的像素值都进行一次评估,因此您不能使用随机组件或其他生成器。返回一个Image对象
    • image:Image对象
    • args:一个函数对象和该函数的一个取整参数
from PIL import Image

def func(a):
    return a

im1 = Image.open(path1)
img = Image.eval(img1,func,1)
  • Image.merge(mode, bands):将一组单波段图像合并成为一个多波段图像。返回一个Image对象
    • mode:用于输出图像的模式。支持的模式请看下方Pillow支持的模式表
    • bands:输出图像中每个波段包含一个单波段图像的序列
  • Image.new(mode, size, color=0):根据模式、大小和颜色创建一个新的Image对象。烦会一个Image对象
    • mode:用于新图像的模式。支持的模式请看下方Pillow支持的模式表
    • size: 大小,元组类型,包含宽度与高度
    • color:用于新图像的颜色。传入一个整数的单波段模式,或传入一个元组的多波段模式,或者传入一个ImageColor对象
from PIL import Image

# 单个整数值
img = Image.new("RGBA",(1024,768),215)

# 元组
img = Image.new("RGBA",(1024,768),(215,0,0)

# ImageColor
from PIL import ImageColor
color = ImageColor.getrgb("#FF0000")
img = Image.new("RGBA",(1024,768),color)

img.show()

从上面代码运行结果显示是一个红色,1024*768的图像

图像对象

  • alpha_composite(im, dest=(0,0), source=(0,0)):在Image对象中符合im,效果与类方法alpha_composite相似。无返回值

    • im:Image对象
    • dest:指定此(目标)图像左上角的可选的长度为2的元组(左,上)
    • source:盖源图像中左上角的长度为2的元组(左,上)或源矩形边界的长度为4的元组(左,上,右,下)
  • copy():复制此图片

from PIL import Image

img = Image.new("RGBA",(1024,768),215)
img_copy = img.copy()
  • crop(box=None):返回此图像的一个矩形区域,为一个Image对象
    • box:裁剪矩形,为一个长度为4的元组(左,上,右,下)
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
img_copy = img.crop(box=(0,0,500,500))
  • draft(mode, size):配置图像文件加载器,以便返回尽可能接近给定模式和大小的图像版本,无返回值

    • mode:模式
    • size:大小
  • filter(filter):使用给定的过滤器过滤此图像,返回一个Image对象

    • filter:过滤器
  • getbands():获取此图像中每个波段名称的元组。返回一个tuple

from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.getbands()    # ('R', 'G', 'B', 'A')
  • getbbox():计算图像中非零区域的边界框,返回一个tuple
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.getbbox()     # (0, 0, 1024, 768)
  • getcolors(maxcolors=256):返回此图像中使用的颜色列表,返回一个计算与像素元组组成的元组列表
    • maxcolors: 最大颜色数量,超过此值,当前方法将返回None
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.getcolors()       # [(786432, (215, 0, 0, 0))]
  • getdata(band=None):以包含像素值的序列对象的形式返回此图像的内容。返回一个可迭代对象。
    • band:波段,默认是获取所有。如果需要获取单波段,传入索引值(例如0从“RGB”图像中获得“R”波段)。
from PIL import Image

img = Image.new("RGBA",(1024,768),215)

for item in img.getdata():
    print item  

# 打印结果:
(215, 0, 0, 0)
(215, 0, 0, 0)
(215, 0, 0, 0)
...
  • getextrema():获取每个波段的最小和最大像素值。对于单波段图像,返回一个长度为2的元组。对与多波段图像,每个波段包含一个2元组。
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.getextrema()      # ((215, 215), (0, 0), (0, 0), (0, 0))
  • getpalette():返回图像的调色板,返回一个list对象。如果没有调色板,则返回None
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.getpalette()      # None
  • getpixel(xy):返回给定位置的像素值,返回一个tuple
    • xy:位置,以(x,y)给出的坐标。
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.getpixel((500,500))       # (215, 0, 0, 0)
  • histogram(mask=None, extrema=None):返回图像的直方图。直方图以像素计数列表的形式返回,返回一个列表。
    • mask:掩码
    • extrema:极值
  • paste(im, box=None, mask=None):将im图像粘贴到此图像上面。无返回值
    • box:box可以是图像左上角的长度为2的元组(左,上)或长度为4的元组(左,上,右,下)
    • mask:掩码
import os
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img1 = Image.open(path1)

img = Image.new("RGBA",(1024,768),215)

img1.paste(img)
img1.show()
  • putdata(data, scale=1.0, offset=0.0):将像素数据复制到此图像上面。从图像左上角开始,直到图像或序列结束,无返回值。比例和偏移值用于调整序列值:pixel = value * scale + offset。
    • data:一个图像数据序列
    • scale:缩放比例值
    • offset:偏移量值
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
img_c = Image.new("RGBA",(1024,768),-100)

img.putdata(img_c.getdata())
img.show()
  • putpalette(data, rawmode=’RGB’):附加一个调色板到这个图像。图像的模式必须是P或者L。返回一个Image对象
    • data:调色板序列
    • rawmode:调色板的原始模式
from PIL import Image

img = Image.new("P",(1024,768),215)
img_c = Image.new("P",(1024,768),-100)

img_c.putpalette(img.getpalette())
img_c.show()
  • quantize(colors=256, method=None, kmeans=0, palette=None):将图像转换为具有指定数量的颜色的P模式图像,返回一个Image对象
    • colors:所需颜色的数量,<=256
    • method:0:中值切割,1:最大覆盖率,2:快速八叉树,3:libimagequant
    • kmeans:整数
    • palette:量化给定的调色板
from PIL import Image

img = Image.new("RGBA",(1024,768),215)

img_q = img.quantize(colors=256,method=2)
print img_q         # <PIL.Image.Image image mode=P size=1024x768 at 0x2BF7E80>
  • resize(size, resample=0, box=None):返回此图像的调整大小后的副本。返回一个Image对象
    • size:以像素为单位的长度为2的元组(宽度,高度)
    • resample:重采样滤波器。可以设置为:Image.NEARESTImage.BOXImage.BILINEARImage.HAMMINGImage.BICUBIC或者Image.LANCZOS。如果省略,或者图像模式为1或者P,则设置Image.NEAREST
    • box:一个浮点数组成的长度为4的元组,给出应该缩放的源图像的区域。值应该在(0,0,宽度,高度)的矩形内。
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
img_r = img.resize(size=(500,500))

print img_r         # <PIL.Image.Image image mode=RGBA size=500x500 at 0x37A6E80>
  • rotate(angle, resample=0, expand=0, ceter=None, translate=None):旋转图像,并返回旋转后的图像副本。返回Image对象
    • angle:角度,逆时针旋转
    • resample:重采样滤波器。可以是:Image.NEARESTImage.BILINEAR或者Image.BICUBIC。如果省略,或者图像模式为1或者P,则设置Image.NEAREST
    • expand:是否展开。如果为true,则展开输出图像以使其足够大以容纳整个旋转后的图像。如果为false或省略,使输出图像的大小与输入图像相同。
    • center:旋转中心,长度为2的元组(宽度,高度),原点是左上角,默认是图像的中心
    • translate:旋转后。一个长度为2的元组(宽度,高度)
import os
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img1 = Image.open(path1)

img_r = img1.rotate(45,Image.BICUBIC)
img_r.show()

可以看到,图像已经逆时针旋转了45度

  • save(fp, format=None, **params):保存图像到给定的文件名下。如果没有指定格式,则可以使用文件扩展名来确定要使用的格式。无返回值
    • fp:文件名或路径
    • format:可选的格式覆盖
import os
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img1 = Image.open(path1)

img_r = img1.rotate(45,Image.BICUBIC)
img_r.save(os.path.join(os.getcwd(),"rotate.png"))
  • seek(frame):在这个序列文件中寻找给定的帧。如果您在序列结束之外寻找方法,则会 引发EOFError异常。当序列文件被打开时,库会自动寻找0帧。无返回值

    • frame:帧号。从0开始
  • show(title=None, command=None):显示这个图像,此方法主要用于调试目的。无返回值

    • title:在可能的情况下,用于图像窗口的可选标题。
    • command:用于显示图像的命令
  • split():将图像分割成单独的波段。该方法从图像中返回一个单独的图像的元组。例如,拆分“RGB”图像会创建三个新图像,每个图像都包含原始波段(红色,绿色,蓝色)之一的副本。返回一个tuple
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img1 = Image.open(path1)

data = img1.split()
print data          # (<PIL.Image.Image image mode=L size=3500x3500 at 0x2DEC438>, <PIL.Image.Image image mode=L size=3500x3500 at 0x2DEC860>, <PIL.Image.Image image mode=L size=3500x3500 at 0x2DEC898>, <PIL.Image.Image image mode=L size=3500x3500 at 0x2DEC8D0>)
  • getchannel(channel):返回包含源图像的单个通道的图像。返回L模式的图像,返回一个Image对象
    • channel:返回什么频道的图像。可以是索引(“RGBA”的”R”通道为0)或通道名称(“RGBA”的alpha通道为”A”)
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img1 = Image.open(path1)

im = img1.getchannel(0)
或者:
im = img1.getchannel("R")
  • tell():获取当前的帧号。返回int
  • thumbnail(size, resample=3):将此图像制作成缩略图。该方法修改图像以包含其本身的缩略图版本,不大于给定尺寸。无返回值
    • size:大小
    • resample:重采样滤波器。可以是:Image.NEARESTImage.BILINEARImage.BICUBIC或者Image.LANCZOS。如果省略,则默认为Image.BICUBIC
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img1 = Image.open(path1)

img1.thumbnail(size=(500,500),resample=Image.BICUBIC)
print img1          # <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=500x500 at 0x311C3C8>
  • tobitmap(name=’image’):返回转换为X11位图的图像。此方法只使用于模式为1的图像,返回一个str
    • name:用于位图变量的前缀名称
from PIL import Image

img = Image.new("1",(1024,768),215)

data = img.tobitmap(name='abc')
print data

# 结果如下:
"""
#define abc_width 1024
#define abc_height 768
static char abc_bits[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
...
};
"""
  • tobytes(encoder_name=’raw’, *args):以图像作为字节对象返回。为一个str对象
  • transpose(method):旋转或翻转图像,返回旋转或翻转后的图像副本,一个Image对象
    • method:可以是:Image.FLIP_LEFT_RIGHTImage.FLIP_TOP_BOTTOMImage.ROTATE_90Image.ROTATE_180Image.ROTATE_270Image.TRANSPOSE或者Image.TRANSVERSE
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img1 = Image.open(path1)

im = img1.transpose(Image.FLIP_LEFT_RIGHT)
im.show()

可以看出图像已经翻转了

  • close():关闭文件指针

图像对象属性

  • filename:源文件的文件名或路径。只有通过open方法构建的图像对象才具有此属性
import os
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img = Image.open(path1)

print img.filename      # 、/aaa/bbb/ccc/23.png
  • format:源文件的图片格式。对于由库自身创建的图像,此属性值为None
import os
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img = Image.open(path1)

print img.format        # PNG

img = Image.new("RGBA",(1024,768),215)
print img.format        # None
  • mode:图像模式。这是一个字符串,指定图像使用的像素格式。
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.mode        # RGBA
  • size:图像大小,以像素为单位。大小以长度为2的元组(宽度,高度)给出。类型tuple
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.size        # (1024, 768)
  • width:图像宽度,以像素为单位。类型int
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.width        # 1024
  • height:图像高度,以像素为单位。类型int
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.height        # 768
  • palette:调色板表。如果模式为P,这应该是ImagePalette类的一个实例。否则为None
from PIL import Image

img = Image.new("RGBA",(1024,768),215)
print img.palette       # None

img = Image.new("P",(1024,768),215)
print img.palette       # <PIL.ImagePalette.ImagePalette object at 0x0000000002EF9828>
  • info:保存与图像相关的数据的字典。这个字典被文件处理程序用来传递从文件读取的各种非图像信息。
import os
from PIL import Image

path1 = os.path.join(os.getcwd(),"23.png")
img = Image.open(path1)
print img.info

# 结果如下:
'''
{
    'chromaticity': (0.31269, 0.32899, 0.63999, 0.33001, 0.3, 0.6, 0.15, 0.05999),
    'icc_profile': 'xxxx/...',
    'dpi': (300, 300)
}
'''

img = Image.new("RGBA",(1024,768),215)
print img.info          # {}

Pillow支持的模式表

模式 说明
1 1位像素,黑白,每字节一个像素存储
L 8位像素,黑白
P 8位像素,使用调色板映射到任何其他模式
RGB 3x8位像素,真彩色
RGBA 4×8位像素,带透明度掩模的真彩色
CMYK 4x8位像素,分色
YCbCr 3x8位像素,彩色视频格式
LAB 3×8位像素,L * a * b颜色空间
HSV 3x8位像素,色调,饱和度,值颜色空间
I 32位有符号整数像素
F 32位浮点像素

更多关于Image的操作:http://pillow.readthedocs.io/en/latest/reference/Image.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/y472360651/article/details/79287371

智能推荐

idea卸载与重装_idea卸载干净并重新安装-程序员宅基地

文章浏览阅读1.2w次,点赞12次,收藏79次。idea卸载与重装。_idea卸载干净并重新安装

安装Nodejs踩过的坑:npm安装报错npm ERR code EPERM npm ERR syscall mkdir npm ERR path DProgram Filesnod..)_>npm init vue@latest npm err! code eperm npm err! -程序员宅基地

文章浏览阅读870次,点赞3次,收藏5次。今天学vue到webpack,大无语了家人们,从第一步npm installl的安装开始,就逐渐陷入了npm的坑!首先,从官网下载node.js,链接Download | Node.js,根据自己的电脑配置选择安装版本(推荐LST稳定版本的),然后按照安装步骤操作就行,直到测试安装的时候,开始报错了:网上查找了许多博文之后找到了解决方法:1、删除C:Users用户下的.npmrc文件这里我的.npmrc是正常显示的,如果你的没有,看是不是因为将隐藏的项目勾选上了,然后去掉勾选。2、在命令行输入_>npm init vue@latest npm err! code eperm npm err! syscall open npm err! path

Java8流式操作-根据集合的某个属性值取交集,差集_java 根据某个属性判断两个集合中的差集-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏19次。这里是使用一个自定义类的集合和一个Integer类的集合做的一次栗子,两个封装类的操作,或者两个基本类型的集合操作都是类似的。public class CollectionTest { public static void main(String[] args) { List<Customer> list = new ArrayList<>(); Customer customer = new Customer(); cus_java 根据某个属性判断两个集合中的差集

JQuery:ajax后台返回list,前台用jquery遍历list-程序员宅基地

文章浏览阅读68次。JQuery:ajax后台返回list,前台用jquery遍历list

打造健康产业新业态 中国抗衰老促进会康养产业分会成立-程序员宅基地

文章浏览阅读516次。6月23日,中国抗衰老促进会康养产业分会成立大会在京举行。原国家卫生部副部长孙隆椿、原总后卫生部部长李深、中国抗衰老促进会法人理事长刘仁富,副理事长朱怡霖、北京师范大学系..._中国抗衰老促进会证书含金量

How to use JFlash_jflash checksum-程序员宅基地

文章浏览阅读360次。 There is a problem happen when download firmware to the LPC2214 with JFlash v3.42b, the unit will not be turned on when power is on. But the download will be ok when I use JFlash v4.02 and v4.08, t_jflash checksum

随便推点

ubantu安装教程及vmware_vmware 安装ubantu csdn-程序员宅基地

文章浏览阅读361次。VMware下载官网 我下载的是14版本 来源网站(https://www.douban.com/note/639107631/) 下载链接: https://download3.vmware.com/software/wkst/file/VMware-workstation-full-14.0.0-6661328.exe 安装密钥 VMware 14 Pro 永久许可证激活密钥..._vmware 安装ubantu csdn

入门Struts1第一讲——Struts1入门就这么简单-程序员宅基地

文章浏览阅读2.1w次,点赞74次,收藏185次。现在终于进入框架的学习中了,前面还有好几个框架等待着我们呢。我们先来学习Struts1框架,然后再过渡到Struts2框架的学习中。下面我们开始学习Struts1框架。Struts简介Struts是apache开发的一个web层的框架,它主要用于简化web层的开发,Struts针对web层的一些常用操作,例如:表单数据的封装、校验和数据的回显国际化开发文件上传异常处理等等…Struts都提_struts1

IntelliJ IDEA简单创建JavaSE项目的使用_爱迪尔怎么创建java se-程序员宅基地

文章浏览阅读708次。IntelliJ IDEA简单创建JavaSE项目的使用IntelliJ IDEA简单创建JavaSE项目的使用IntelliJ IDEA简单创建JavaSE项目的使用创建一个新的项目创建包和类创建一个新的项目1、打开IDEA,点击 Create New Project2、在Project SDK中选择下载好的JDK,根据路径选择,一般安装好JDK后IDEA会默认JDK的路径,所以一般可以不用管这里。然后Next。3、一般默认Next4、在红框中输入项目名称,在绿框中输入项目保存路径。一般_爱迪尔怎么创建java se

破解版matlab安装Higher Order Spectral Analysis Toolbox-亲测成功_hosa - higher order spectral analysis toolbox-程序员宅基地

文章浏览阅读2.5k次,点赞12次,收藏15次。破解版matlab安装Higher Order Spectral Analysis Toolbox-亲测成功1.下载所需toolbox,随意保存于某个文件夹!2.解压该压缩文件——继续解压hosa_d.exe文件——将hosa文件夹(及hosademo)copy到电脑安装matlab的toolbox文件夹中。并且,将hosa文件夹中的文件后缀“.M”改为“.m”3.打开matlab主页——设置路径——添加文件夹——将上述文件夹导入——保存——关闭。4.打开matlab主页——预设——常规——_hosa - higher order spectral analysis toolbox

Jwt入门教程( 一) | 原理和用法_jwt typ-程序员宅基地

文章浏览阅读3.7k次,点赞5次,收藏13次。JSON Web Token 入门教程前言:最近一直忙着Python的Jwt和Java的Jwt认证互转,以及无缝对接,所以想把这些记录一下。JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。一、跨域认证的问题互联网服务离不开用户认证。一般流程是下面这样。1、用户向服务器发送用户名和密码。2、服务器验证通过后,在当..._jwt typ

ThingsBoard——自定义规则节点_thingsboard 规则链ui-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏8次。一般的功能,可以使用现有的节点来完成。但如果有比较复杂,或有自己特殊业务需求的,可能就需要自定义了。按[官方教程](https://thingsboard.io/docs/user-guide/contribution/rule-node-development/)来基本就可以入门,如果需要深入,可以参考ThingsBoard自有节点的实现,见[源码](https://github.com/thingsboard/thingsboard)_thingsboard 规则链ui