赞
踩
目录
1.1 PIL的全称:Python Imaging Library
2.1.1 基础语法 PIL.Image.open(path)
2.1.2 PIL.Image.open() 方法是 模块的方法
2.1.3 PIL.Image.open(path)的返回值
2.3.2 其实 PIL.Image.open() 或 PIL.Image.new() 返回值就是 img_obj 对象
2.4 显示图片用前面的方法生成的 img_obj对象的show()方法即可。
5.3.2 如果需要把变量中的 img_obj 对象保存为图片文件,必须用到 img_obj.save()
5.5.1 基础语法 img_obj.paste(img_obj_other, (posx, posy))
5.5.2 img_obj.paste() 的返回值为none
5.5.4 #错误写法导致的报错 :AttributeError: 'NoneType' object has no attribute 'show'
5.6 img_obj.image.resize() 改变图片大小
5.8 用 img_obj.transpose() 进行图形翻转
5.9 用 img_obj.thumbnail() 进行图形整体缩放 (按比例缩放?)
5.10.1 基础语法 Image.blend(image1, image2, 透明度0-1)
5.10.5 交换image.blend(image1, image2, 透明度0-1) 图片的顺序
6.1 PIL修改图片的颜色,好像没有直接修改颜色的简单方法
6.3 转换图片的颜色模式 pic_obj.convert()
6.3.1 黑白模式(二值图像),img_obj.convert("1")
6.3.2 灰度模式 pic_obj.convert("L")
7.2 添加水印 draw.text(text_position, text, fill=(255, 0, 255), font=font)
8.1 有一类方法,不会改变原图对象的内容,但是返回值是改变后的对象,因为需要保存其返回值。
8.1 有一类方法直接改变原图对象,方法本身返回值为空none
- import PIL #而不是 import pillow
- pip show pillow # 而不是 pip show PIL
- import PIL
- #注意,包名并不是 pillow 或Pillow,包名而不是as的别名,模块名就是PIL
用 PIL.Image.open() 可以读入图片
path1=r"C:\Users\Administrator\Desktop\tp2.jpg"
pic1=PIL.Image.open(path1)
pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0))
参数
- size=(100,100)
- mode="RGB" #注意大小写,如果写成mode="rgb"会报错
- color=(255,255,0)
读入的图片,就是图片本身的格式jpg 在PIL里对应的类型:'PIL.JpegImagePlugin.JpegImageFile'
PIL新生成的图片的格式默认是'PIL.Image.Image'
pic1=PIL.Image.open(path1)
pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0))pic1.show()
pic2.show()
- import PIL #注意,包名并不是 pillow 或Pillow,包名而不是as的别名就是PIL
-
- path1=r"C:\Users\Administrator\Desktop\tp2.jpg"
- pic1=PIL.Image.open(path1)
- pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0)) #注意大小写mode="rgb"报错
-
- print(type(path1))
- print(type(pic1))
- print(type(pic2))
-
- pic1.show()
- pic2.show()
如前面的代码生成的图片的左上角,右下角的点坐标可以由着size()决定
- import PIL
-
- pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0)) #注意大小写mode="rgb"报错
- print(type(pic2))
- pic2.show()
pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0))
PIL支持的图片的颜色mode有很多种:
查看image 属性的一些通用python方法
- type(image)
- print(type(pic1))
比如要注意
img_obj对象本身的各种属性
- 字典信息: image.info
- 宽度(px): image.width
- 高度(px): image.height
- 尺寸(px): image.size
- 颜色模式: image.mode
- 格式(扩展名): image.format
- 只读:image.readonly #1为只读
- from PIL import Image
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1 = Image.open(path1)
- pic1.show()
-
- print("pic图片数据类型",type(pic1))
- print('字典信息: ', pic1.info)
- print('宽度(px): ', pic1.width)
- print('高度(px): ', pic1.height)
- print('尺寸(px): ', pic1.size)
- print('颜色模式: ', pic1.mode)
- print('格式(扩展名): ', pic1.format)
- print('只读(1为只读): ', pic1.readonly)
pic图片数据类型 <class 'PIL.JpegImagePlugin.JpegImageFile'> 字典信息: {'jfif': 257, 'jfif_version': (1, 1), 'dpi': (120, 120), 'jfif_unit': 1, 'jfif_density': (120, 120)} 宽度(px): 64 高度(px): 64 尺寸(px): (64, 64) 颜色模式: RGB 格式(扩展名): JPEG 只读(1为只读): 0
下面的方法都是基于 img_obj的方法
- import PIL
-
- pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0)) #注意大小写mode="rgb"报错
- pic3=pic2.copy()
- pic4=pic3.crop(box=(0,0,50,50))
- pic4.show()
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.png"
- pic1=Image.open(path1)
- pic2=pic1.copy()
-
- print(pic2.size)
- width, height= pic2.size
- new_width = width*0.5
- new_height = height*0.5
- box1 = (new_width-100, new_height-100, new_width+100, new_height+100)
-
-
- pic10=pic2.crop(box=(0,0,200,200))
- pic20=pic2.crop(box=(100,100,300,300))
- pic30=pic2.crop(box1)
-
- pic10.save(r"C:\Users\snow\Desktop\pic10.jpg")
- pic20.save(r"C:\Users\snow\Desktop\pic20.jpg")
- pic30.save(r"C:\Users\snow\Desktop\pic30.jpg")
-
- pic10.show()
- pic20.show()
- pic30.show()
参数说明
img_obj.paste()
img_obj.show()
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0)) #注意大小写mode="rgb"报错
-
- pic3=pic1.copy()
- pic4=pic2.copy()
- pic5=pic4.crop(box=(0,0,50,50))
- #错误写法 pic3=pic3.paste(pic5, (500, 50))
- pic3.paste(pic5, (500, 50))
-
- pic3.show()
#错误写法 pic3=pic3.paste(pic5, (500, 50))
pic3=pic3.paste(pic5, (500, 50))
写法1:
- img_obj.image.resize((width,height))
写法2
- size=(width,height)
- img_obj.image.resize(size)
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0)) #注意大小写mode="rgb"报错
-
- pic3=pic1.copy()
- pic4=pic2.copy()
- pic5=pic4.crop(box=(0,0,50,50))
- w,h=pic4.size
- pic5=pic5.resize((int(2*w),int(2*h)))
- pic3.paste(pic5, (500, 50))
-
- pic3.show()
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0)) #注意大小写mode="rgb"报错
-
- pic3=pic1.copy()
- pic4=pic2.copy()
- pic5=pic4.crop(box=(0,0,50,50))
- w,h=pic4.size
- pic5=pic5.resize((int(2*w),int(2*h)))
- pic5=pic5.rotate(45)
- #pic5=pic5.rotate(45,expand=True)
- pic3.paste(pic5, (500, 50))
-
- pic3.show()
pic5=pic5.rotate(45,expand=True)
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0)) #注意大小写mode="rgb"报错
-
- pic3=pic1.copy()
- pic3=pic3.transpose(Image.FLIP_LEFT_RIGHT)
- pic4=pic2.copy()
- pic5=pic4.crop(box=(0,0,50,50))
- w,h=pic4.size
- pic5=pic5.resize((int(2*w),int(2*h)))
- pic5=pic5.rotate(45,expand=True)
- pic3.paste(pic5, (500, 50))
-
- pic3.show()
另外返回值的问题
#img_obj.thumbnail()方法和其他方法不一样,返回值none,直接修改原图!
- # pic11=pic10.thumbnail((50, 50)) #错误,thumbnail() 返回none,不要试图用这个方法的返回值。
- #正确写法
- pic10=pic1.copy()
- pic10.thumbnail((250, 250)) #已经直接修改源文件p10了
- pic3.paste(pic10, (0,0))
- pic3.show()
- import PIL
-
- path1=r"C:\Users\Administrator\Desktop\pic1.jpg"
-
- #打开和创建
- pic1=PIL.Image.open(path1)
- pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0)) #注意大小写mode="rgb"报错
- pic1.show()
-
- #复制和翻转
- pic3=pic1.copy()
- pic3=pic3.transpose(PIL.Image.FLIP_LEFT_RIGHT)
- pic3.show()
-
- #复制+裁剪+粘贴
- pic4=pic2.copy()
- pic4=pic4.crop(box=(0,0,50,50))
- w,h=pic4.size
- pic4=pic4.resize((int(2*w),int(2*h)))
- pic4=pic4.rotate(45,expand=True)
-
- pic3.paste(pic4, (500, 50))
- pic3.show()
-
-
- # 放大缩略+粘贴
-
- #img_obj.thumbnail()方法和其他方法不一样,返回值none,直接修改原图!
- # pic11=pic10.thumbnail((50, 50)) #错误,thumbnail() 返回none,不要试图用这个方法的返回值。
- pic10=pic1.copy()
- pic10.thumbnail((250, 250))
- pic3.paste(pic10, (0,0))
- pic3.show()
- from PIL import Image
-
- path1=r"C:\Users\snow\Desktop\pic3.png"
- path2=r"C:\Users\snow\Desktop\pic2.png"
-
- # 打开第一张图片
- image1 = Image.open(path1)
- # 创建与第一张图片相同大小、模式为RGBA(包含Alpha通道)的空白图片
- image2 = Image.new("RGBA", image1.size, (0, 0, 255, 255))
-
- # 将第二张图片按照指定的透明度合成到第一张图片上
- result = Image.blend(image1, image2, 0.5)
-
- # 保存结果图片
- image1.show()
- image2.show()
- result.show()
- result.save(path2)
- 否则会容易报错:ValueError: images do not match
- 表面看pic1.png 也是PNG格式,但当时pic1.png我是用pic.jpg另存为的,并没有修改图片内容格式,windows的另存为图片格式是不靠谱的。
- from PIL import Image
- path1=r"C:\Users\snow\Desktop\pic20.png"
- path2=r"C:\Users\snow\Desktop\pic21.png"
- # 打开第一张图片
- image1 = Image.open(path1)
- image2 = Image.open(path2)
- #必须要要返还值 image2.resize(image1.size)
- image2=image2.resize(image1.size)
-
- print(image1.size)
- print(image2.size)
-
- # 将第二张图片按照指定的透明度合成到第一张图片上
- result1 = Image.blend(image1, image2, 0.2) #把后者按透明度0.2,叠到前者上
- result2 = Image.blend(image2, image1, 0.2)
-
-
- # 保存结果图片
- result1.show()
- result2.show()
- #result.save(path2)
- 修改图片RGB颜色通道的方法
- r,g,b=pic3.split()
- pic4=PIL.Image.merge("RGB",(g,g,g))
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic3=pic1.copy()
-
- r,g,b=pic3.split()
- pic4=PIL.Image.merge("RGB",(r,b,g))
-
- print(r)
- print(g)
- print(b)
-
- print(type(r))
- print(type(g))
- print(type(b))
-
- r
- g
- b
下面是测试代码和对应效果
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic3=pic1.copy()
-
- r,g,b=pic3.split()
- pic4=PIL.Image.merge("RGB",(b,g,r))
- pic4.show()
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic3=pic1.copy()
-
- r,g,b=pic3.split()
- pic4=PIL.Image.merge("RGB",(g,r,b))
- pic4.show()
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic3=pic1.copy()
-
- r,g,b=pic3.split()
- pic4=PIL.Image.merge("RGB",(r,b,g))
- pic4.show()
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic3=pic1.copy()
-
- r,g,b=pic3.split()
- pic4=PIL.Image.merge("RGB",(g,g,g))
- pic4.show()
PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic3=pic1.copy()
-
- pic4=pic3.convert("1")
- pic4.show()
当像素点的 RGB 颜色分量相同时,组合出来的就是灰色。
前面实验RGB通道时,也发现RGB通道,3个都填相同的通道就会显示灰色,但是灰度有差别("RGB",(b,b,b)) ("RGB",(r,r,r)) ("RGB",(g,g,g))
但是三者灰度还是有差别
- r,g,b=pic3.split()
- pic4=PIL.Image.merge("RGB",(b,b,b))
- pic4=PIL.Image.merge("RGB",(r,r,r))
- pic4=PIL.Image.merge("RGB",(g,g,g))
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic3=pic1.copy()
-
- pic4=pic3.convert("L")
- pic4.show()
- import PIL
-
- path1=r"C:\Users\snow\Desktop\pic1.jpg"
- pic1=PIL.Image.open(path1)
- pic3=pic1.copy()
-
- pic4=pic3.convert("P")
- pic4.show()
pic1=pic1.convert("RGBA")
alpha=pic1.split()[3]
alpha=alpha.point(lambda i:i-200) #alpha越小越透明0~255之间
pic1.putalpha(alpha)
- from PIL import Image
-
- path1=r"C:\Users\snow\Desktop\pic1.png"
- pic1=Image.open(path1)
- pic1.show()
-
- pic1=pic1.convert("RGBA")
- alpha=pic1.split()[3]
- alpha=alpha.point(lambda i:i-200) #alpha越小越透明0~255之间
- pic1.putalpha(alpha)
-
- pic1.show()
im = Image.new('RGBA', (200, 200), 'white')
# 创建一个画图实例
draw = ImageDraw.Draw(im)
- from PIL import Image, ImageDraw, ImageFont
-
- path1=r"C:\Users\Administrator\Desktop\pic1.jpg"
- path2=r"C:\Users\Administrator\Desktop\pic2.jpg"
- # 打开图像文件
- image = Image.open(path1)
-
- # 创建绘图对象
- draw = ImageDraw.Draw(image)
-
- # 添加水印文本
- text = "Watermark"
- font = ImageFont.truetype("arial.ttf", 36)
- text_size = draw.textlength(text, font) #textsize()废弃了
- text_position = (100, 100)
- draw.text(text_position, text, fill=(255, 0, 255), font=font)
-
- # 保存带水印的图像
- image.save(path2)
-
- #再次显示
- image1 = Image.open(path2)
- image1.show()
正确写法+错误用法
- image2.resize(image1.size)
- Image.open(path1)
正确写法+正确用法
- image2=image2.resize(image1.size)
- image1 = Image.open(path1)
- pic3=pic3.transpose(Image.FLIP_LEFT_RIGHT)
img_obj.save()方法
img_obj.thumbnail()方法返回值none,但是直接修改原图!
#错误写法
- # pic10=pic10.thumbnail((50, 50)) ,会报错
#正确写法
- pic10.thumbnail((250, 250))
- #上面这句已经直接修改源文件p10了,下面直接用p10就已经是修改后的了
- pic3.paste(pic10, (0,0))
pic3.paste()
#错误写法
- pic3=pic3.paste(pic5, (500, 50))
- #看起来把pic3进行paste()后的内容重新赋值给了pic3,实际上pic3被赋值为none了
- pic3.show()
- #报错 AttributeError: 'NoneType' object has no attribute 'show'
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。