【python 的各种模块】(9) 在python使用PIL( 即pillow模块 ) 修改图片

目录

1 导入PIL模块(pillow)

1.1 PIL的全称:Python Imaging Library

1.2 导入PIL模块

1.2.1 可用的导入形式

1.2.2 常用的导入形式

1.2.3 PIL下面的常用子模块

2 PIL.Image的方法 (读入,生成和显示图片)

2.1 用 PIL.Image.open() 可以读入图片

2.1.1 基础语法 PIL.Image.open(path)

2.1.2 PIL.Image.open() 方法是 模块的方法

2.1.3  PIL.Image.open(path)的返回值

2.1.4 img_obj 对象的具体格式

2.2 用PIL.Image.new()  生成新图片

2.3 PIL中图片的格式 和对象

2.3.1 type()可以看到图片的格式

2.3.2 其实 PIL.Image.open() 或 PIL.Image.new() 返回值就是 img_obj 对象

2.4 显示图片用前面的方法生成的 img_obj对象的show()方法即可。

2.5 上述内容的测试代码

3 PIL相关的设置

3.1 PIL的坐标轴

3.2 颜色模式

4 PIL中图片对象 img_obj的各种属性

4.1 用系统方法type()查看 img_obj的类型

4.2  img_obj对象的各种属性

5 img_obj对象的方法

5.1 显示图片  img_obj.show() 

5.2 复制,img_obj.copy()

5.3 保存,img_obj.save()

5.3.1 基础语法

5.3.2 如果需要把变量中的 img_obj 对象保存为图片文件,必须用到 img_obj.save()

5.4 裁剪 img_obj.crop()

5.4.1 语法

5.4.2 测试代码1

5.4.3 测试代码2

5.5 粘贴图片 img_obj.paste()

5.5.1 基础语法 img_obj.paste(img_obj_other, (posx, posy))

5.5.2 img_obj.paste() 的返回值为none

5.5.3 img_obj.paste() 的测试代码

5.5.4 #错误写法导致的报错 :AttributeError: 'NoneType' object has no attribute 'show'

5.6 img_obj.image.resize() 改变图片大小

(不是整体缩放,而是可能不成比例的强行乱修改)

5.7 旋转 img_obj.rotate()方法

5.8 用 img_obj.transpose() 进行图形翻转

5.9 用 img_obj.thumbnail() 进行图形整体缩放 (按比例缩放?)

5.9.1 基本功能

5.9.2 基本语法

5.9.3 基本语法

5.10 图片叠加方法 img_obj.blend()

5.10.1 基础语法 Image.blend(image1, image2, 透明度0-1)

5.10.2 测试代码

 5.10.3 两张图片大小必须相同

5.10.4 两张图片,都必须至少包含alpha通道

5.10.5 交换image.blend(image1, image2, 透明度0-1) 图片的顺序

5.10.5.1 一个有图形的和1个纯色图

5.10.5.2 我现在重新选择2个都不是纯色的图试试

5.10.6 其他效果

6 用PIL修改颜色

6.1 PIL修改图片的颜色,好像没有直接修改颜色的简单方法

6.2 可修改RGB通道,但不是RGB颜色

6.2.1 修改RGB通道的方法

6.2.2 关于 r,g,b 颜色通道 具体内容和类型

6.2.3 测试改变r,g,b 通道的类型的效果

6.3 转换图片的颜色模式 pic_obj.convert()

6.3.1  黑白模式(二值图像),img_obj.convert("1")

测试代码

6.3.2 灰度模式 pic_obj.convert("L")

测试代码

6.3.3 关于模式 .convert("P")

6.4 改变底色和合并

6.5 改变透明度 img_obj.putalpha()

6.5 修改pix颜色

6.6 修改颜色的亮度等 enhance

7 画图 PIL.ImageDraw

7.1 画图 PIL.ImageDraw.Draw(im)

7.2 添加水印 draw.text(text_position, text, fill=(255, 0, 255), font=font)

8 我的错误备注

8.1 有一类方法,不会改变原图对象的内容,但是返回值是改变后的对象,因为需要保存其返回值。

8.1  有一类方法直接改变原图对象,方法本身返回值为空none

8.1.1 返回值为空none的方法

8.1.2 具体例子


1 导入PIL模块(pillow)

1.1 PIL的全称:Python Imaging Library

  • PIL的全称:Python Imaging Library
  • 所以你可以理解确实模块名不叫pillow,而叫PIL了
  • 但是在python中查找是否安装了pillow,却只能用pillow,如输入 pip show pillow
  • import PIL             #而不是 import pillow  
  • pip show pillow    # 而不是 pip show PIL

1.2 导入PIL模块

1.2.1 可用的导入形式

  • import PIL  
  • import PIL  
  • #注意,包名并不是 pillow 或Pillow,包名而不是as的别名,模块名就是PIL

1.2.2 常用的导入形式

  • from PIL import  Image
  • from PIL import  ImageDraw
  • # 注意大小写

1.2.3 PIL下面的常用子模块

  • Pillow库最常用的两个模块是Image和ImageDraw
  • 此外,这个库还提供了像ImageFont、ImageFile、ImageFilter、ImageGrab、ImageTk、ImageQt等模块,这些模块扩展了图像库的一些额外功能。
  1. Image模块主要封装了对图像的一些基本操作,比如:裁剪、复制、粘贴、旋转等这样一些操作。
  2. ImageDraw主要封装了在图像上绘制一些形状、文本的功能。

2 PIL.Image的方法 (读入,生成和显示图片)

2.1 用 PIL.Image.open() 可以读入图片

2.1.1 基础语法 PIL.Image.open(path)

用 PIL.Image.open() 可以读入图片

  • PIL.Image.open(path)
  • path是图片的路径:绝对/同目录下的相对路径
  • 注意大小写  PIL.Image.open()  不是 PIL.image.open()

path1=r"C:\Users\Administrator\Desktop\tp2.jpg"

pic1=PIL.Image.open(path1)

2.1.2 PIL.Image.open() 方法是 模块的方法

  • PIL模块
  • PLI.Image() 子模块
  • PLI.Image() 子模块的方法 PIL.Image.open() 可以打开 指定路径的图片文件
  • PIL.Image.open(path)

2.1.3  PIL.Image.open(path)的返回值

  • PIL.Image.open(path) 的返回值是一个 image对象,img_obj。
  • 但是注意,需要把open方法的返回值返回给一个变量保存。

2.1.4 img_obj 对象的具体格式

  • img_obj.open() 返回的image对象,具体可以用 type() 查看格式
  1. <class 'PIL.JpegImagePlugin.JpegImageFile'>
  2. <class 'PIL.Image.Image'>

2.2 用PIL.Image.new()  生成新图片

pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0))  

参数

  • size=(100,100)
  • mode="RGB"    #注意大小写,如果写成mode="rgb"会报错
  • color=(255,255,0)

2.3 PIL中图片的格式 和对象

2.3.1 type()可以看到图片的格式

读入的图片,就是图片本身的格式jpg 在PIL里对应的类型:'PIL.JpegImagePlugin.JpegImageFile'

  • <class 'PIL.JpegImagePlugin.JpegImageFile'>

PIL新生成的图片的格式默认是'PIL.Image.Image'

  • <class 'PIL.Image.Image'>

2.3.2 其实 PIL.Image.open() 或 PIL.Image.new() 返回值就是 img_obj 对象

  • <class 'PIL.Image.Image'>
  • PIL的对象就是 img_obj 对象

2.4 显示图片用前面的方法生成的 img_obj对象的show()方法即可。

  • img_obj.show()
  • 其中pic 指代已经在PIL中打开的文件
  • 而打开的方式不是显示在python的IDE中,而是在操作系统如windows中打开图片

pic1=PIL.Image.open(path1)
pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0))

pic1.show()
pic2.show()

2.5 上述内容的测试代码

import PIL  #注意,包名并不是 pillow 或Pillow,包名而不是as的别名就是PILpath1=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()

3 PIL相关的设置

3.1 PIL的坐标轴

  • pillow的坐标轴,是以 top为X轴,left为Y轴的坐标系。
  • 也就是看起来像“第4象限”
  • 很多表格,和作图软件都采用这种坐标系,比如EXCEL表本质也是这样的坐标系。
  • 一般使用该区域顶点坐标(左、顶)和范围坐标(右、底)表示一块矩形区域。

如前面的代码生成的图片的左上角,右下角的点坐标可以由着size()决定

  • size=(100,100)
  • pos left top=(0,0)
  • pos righ bottom =(0,0)
import PILpic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0))  #注意大小写mode="rgb"报错
print(type(pic2))
pic2.show()

3.2 颜色模式

pic2=PIL.Image.new(size=(100,100),mode="RGB",color=(255,255,0)) 

PIL支持的图片的颜色mode有很多种:

  • RGB,red,green,blue 三色混合
  • RGBA,A是alpha通道,透明度
  • YCB  彩色电视机格式?
  • CMYK模式:
  1. C:Cyan = 青色,又称为‘天蓝色’或是‘湛蓝’;
  2. M:Magenta = 品红色,又称为‘洋红色’;
  3. Y:Yellow = 黄色;
  4. K:blacK=黑色
  • "1"模式
  • "L"模式
  • "P"模式

4 PIL中图片对象 img_obj的各种属性

4.1 用系统方法type()查看 img_obj的类型

查看image 属性的一些通用python方法

  • type(image)
  • print(type(pic1))
  • 读入的图片就是图片本身的格式,如JPG是 <class 'PIL.JpegImagePlugin.JpegImageFile'>
  • PIL新生成的图片的格式默认是<class 'PIL.Image.Image'>

4.2  img_obj对象的各种属性

比如要注意 

  • 比如对象的image.size 是属性,而不是方法,
  1. 正确的:image.size
  2. 错误的:image.size()

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

5 img_obj对象的方法

下面的方法都是基于 img_obj的方法

5.1 显示图片  img_obj.show() 

  • 用PIL.Image.open() 返回的 img_obj ,使用.show() 即可
  • image对象.show(),即可显示图片

5.2 复制,img_obj.copy()

  • img_obj.copy()
  • 复制图片,避免直接修改原图,在copy上做修改

5.3 保存,img_obj.save()

5.3.1 基础语法

  • img_obj.save()
  • img_obj.save(path)
  • img_obj.save(path,"PNG")

5.3.2 如果需要把变量中的 img_obj 对象保存为图片文件,必须用到 img_obj.save()

  • img_obj.save()

5.4 裁剪 img_obj.crop()

5.4.1 语法

  • img_crop = image.crop(box=(x1,y1,x2,y2))
  • 参数
  • box=(x1,y1,x2,y2)
  • (x1,y1,x2,y2)
  • box=(左上角的x坐标,左上角的y坐标,右下角的x坐标,右下角的y坐标)
  • 比如

5.4.2 测试代码1

import PILpic2=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()

5.4.3 测试代码2

  • 可见 crop的坐标
import PILpath1=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()

5.5 粘贴图片 img_obj.paste()

5.5.1 基础语法 img_obj.paste(img_obj_other, (posx, posy))

参数说明

  • img_obj.paste,其中img_obj 是要被粘贴的目标,底图
  • 参数 img_obj_other: 要粘贴的图片,粘贴在底图上
  • 参数(posx, posy):    要粘贴的图片在 底图坐标系内的坐标,需要是元组 (左上角X,左上角Y)
  • 但是要注意,只能粘贴在目标图片的范围之内,坐标不能超过底图的 size范围

5.5.2 img_obj.paste() 的返回值为none

  • img_obj.paste() 的返回值为none
  • 直接修改了img_obj
  • 因此不能 img_obj= img_obj.paste() =none
  • 想查看变化,直接img_obj.show() 即可

img_obj.paste()

img_obj.show()

5.5.3 img_obj.paste() 的测试代码

import PILpath1=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()

5.5.4 #错误写法导致的报错 :AttributeError: 'NoneType' object has no attribute 'show'

#错误写法  pic3=pic3.paste(pic5, (500, 50))
pic3=pic3.paste(pic5, (500, 50))

5.6 img_obj.image.resize() 改变图片大小

(不是整体缩放,而是可能不成比例的强行乱修改)

  • img_obj.image.resize()
  • img_obj.image.resize((width,height))
  • 参数是tuple()格式

写法1:

  • img_obj.image.resize((width,height))

写法2

  • size=(width,height)
  • img_obj.image.resize(size)
import PILpath1=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()

5.7 旋转 img_obj.rotate()方法

  • pic5=pic5.rotate(45)
  • 将自身旋转后再保存在自身变量里
  • 45是角度
  • expand=True 参数,会自动缩放图形的尺寸适应旋转后的形状。也就是扩大图形,使得图形可以完全放下,不会被截断。
  • 如果图形周围是空白的,就不会显示黑边,这在PS等里很常见很有用。
import PILpath1=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)

5.8 用 img_obj.transpose() 进行图形翻转

  • 图形可以进行左右翻转,上下翻转
  • pic3=pic3.transpose(Image.FLIP_LEFT_RIGHT)
  • pic3=pic3.transpose(Image.FLIP_TOP_BOTTOM)
import PILpath1=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()

5.9 用 img_obj.thumbnail() 进行图形整体缩放 (按比例缩放?)

5.9.1 基本功能

  • 缩放 thumbnail() 方法和 resize() 不同
  • img_obj.thumbnail() 进行缩放,是整体缩放,按比例缩放

5.9.2 基本语法

  • 参数是
  •  .thumbnail(size,resample)(创建缩略图)
  •  thumbnail((width,height))

  • 上面的代码可以创建一个指定大小(size)的缩略图,需要注意的是,thumbnail方法是原地操作,返回值是None。
  • 第一个参数是指定的缩略图的大小,
  • 第二个是采样的,有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法。默认是Image.BICUBIC。
     

5.9.3 基本语法

另外返回值的问题

#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 PILpath1=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()

5.10 图片叠加方法 img_obj.blend()

5.10.1 基础语法 Image.blend(image1, image2, 透明度0-1)

  • image1,主体图片
  • image2,要叠加上去的图片
  • 透明度0-1,可以是小数
  1. 其中0 表示全透明,1表示不透明
  2. 数字越大表示透明度越低。

5.10.2 测试代码

from PIL import Imagepath1=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)

 5.10.3 两张图片大小必须相同

  • 对象的size属性,image_obj.size
  • 没这个方法,image_obj.size()
  • 必须让两者size相同
  • 一般方法,先获得image_obj.size 属性,然后新建的图片直接用 img1.size大小

5.10.4 两张图片,都必须至少包含alpha通道

  • 教训,jpg 另存为为png很可能不行,必须本身就是png等包含alpha通道的图片格式才行!!
  • 否则会报错:ValueError: images do not match
  • 表面看pic1.png 也是PNG格式,但当时pic1.png我是用pic.jpg另存为的,并没有修改图片内容格式,windows的另存为图片格式是不靠谱的。

5.10.5 交换image.blend(image1, image2, 透明度0-1) 图片的顺序

  • 资源格式问题一定要注意
  • 必须的都是严格的png格式的资源,有RGBA的alpha通道
  • 否则出一些错误,浪费时间
  • 否则会容易报错:ValueError: images do not match
  • 表面看pic1.png 也是PNG格式,但当时pic1.png我是用pic.jpg另存为的,并没有修改图片内容格式,windows的另存为图片格式是不靠谱的。

5.10.5.1 一个有图形的和1个纯色图
  • 前面的2个图片直接交换次序,好像没有影响,可能因为一个是图片,一个是纯色图导致
  • 我现在重新选择2个新资源,2个png图片试试

5.10.5.2 我现在重新选择2个都不是纯色的图试试
  • 我现在重新选择2个新资源,都有图案
  • 分别互换2者在函数里的位置,作图,确实有差别
  • result1 = Image.blend(image1, image2, 0.2)
  • #都是把后者按透明度0.2,叠到前者上
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)

5.10.6 其他效果

6 用PIL修改颜色

6.1 PIL修改图片的颜色,好像没有直接修改颜色的简单方法

  • 本来想直接取图片颜色,比如 img_obj.color(rgb) 直接修改
  • 但是好像并没有这么方便的修改方法。
  • 下面是查到的各种修改颜色方法

6.2 可修改RGB通道,但不是RGB颜色

6.2.1 修改RGB通道的方法

  • 修改图片RGB颜色通道的方法
  • r,g,b=pic3.split()
  • pic4=PIL.Image.merge("RGB",(g,g,g))

6.2.2 关于 r,g,b 颜色通道 具体内容和类型

  • print(r)   : <PIL.Image.Image image mode=L size=864x486 at 0x1F0C02AD450>
  • print(type(r)) :<class 'PIL.Image.Image'>
  • 其实没搞明白,RGB通道和RGB颜色的区别,试过 pic4=PIL.Image.merge("RGB",(255,0,0)) 这种直接填rgb颜色就会报错
import PILpath1=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

6.2.3 测试改变r,g,b 通道的类型的效果

下面是测试代码和对应效果

  • RGB分别对应 red green  blue
  • 如果
  • pic4=PIL.Image.merge("RGB",(r,g,b))   表示原来的颜色
  • pic4=PIL.Image.merge("RGB",(b,g,r))   或(b,r,g) (g,b,r) 调整后会显示为其他颜色形式
  • pic4=PIL.Image.merge("RGB",(g,g,g))  或 (r,r,r) (b,b,b) 等
import PILpath1=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 PILpath1=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 PILpath1=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 PILpath1=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()

6.3 转换图片的颜色模式 pic_obj.convert()

PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。

  • 比如
  • pic3.convert("L")
  • pic3.convert("1")
  • img.convert("HSV")
  • img.convert("RGB")

6.3.1  黑白模式(二值图像),img_obj.convert("1")

  • 黑白模式,每一个像素只有黑或白两个颜色。
  • 为二值图像,非黑即白。
  • 每个像素用8个bit表示,0表示黑,255表示白。那颜色就是只分0,1--对应黑,白

测试代码
import PILpath1=r"C:\Users\snow\Desktop\pic1.jpg"
pic1=PIL.Image.open(path1)
pic3=pic1.copy()pic4=pic3.convert("1")
pic4.show()

6.3.2 灰度模式 pic_obj.convert("L")

  • convert("L") , 转变为L模式
  • 当像素点的 RGB 颜色分量相同时,组合出来的就是灰色。

当像素点的 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)) 

  • L 模式: 生成灰度图片
  • 为灰度图像,每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
  • 转换公式L = R * 299/1000 + G * 587/1000 + B * 114/1000 进行换算。
  • 灰色系有 256 阶梯,从 0~255。
  • 0 表示黑色,255 表示白色,从0到255 颜色由黑逐渐转向白。
  • (#000) 黑色,(#111、 # 222、 #333) ……逐渐到 (#FFF) 白色。
  • 灰度图片要比黑白图片的颜色层次丰富。
  1. 灰度的颜色从0到255
  2. 黑白的颜色从0到1

测试代码
import PILpath1=r"C:\Users\snow\Desktop\pic1.jpg"
pic1=PIL.Image.open(path1)
pic3=pic1.copy()pic4=pic3.convert("L")
pic4.show()

6.3.3 关于模式 .convert("P")

import PILpath1=r"C:\Users\snow\Desktop\pic1.jpg"
pic1=PIL.Image.open(path1)
pic3=pic1.copy()pic4=pic3.convert("P")
pic4.show()

6.4 改变底色和合并

  • 网上有介绍用removebg 真垃圾
  • pip install removebg  # 这个垃圾还需要API 验证码,真麻烦

6.5 改变透明度 img_obj.putalpha()

  • 修改alpha值即可改变透明度
  • 前提是,图片本身支持RGBA格式,一般需要是PNG格式
  • RGBA,R/G/B/A分别对应[0,1,2,3] ,因此split()[3]就是A,而split()[:3] 就是指RGB
  • RGBA,R/G/B/A分别都是0-255取值,透明度也是越小越透明
  • 而RGB,分别0-255,比如red 为0饱和度为0/255=0%,255即红色饱和度为255/255=1=100%

  • alpha=pic1.split()[3] 
  • alpha=alpha.point(lambda i:i-200)    #每个值都减去200,降低透明度

pic1=pic1.convert("RGBA")
alpha=pic1.split()[3]
alpha=alpha.point(lambda i:i-200) #alpha越小越透明0~255之间
pic1.putalpha(alpha)

from PIL import Imagepath1=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()

6.5 修改pix颜色

6.6 修改颜色的亮度等 enhance

7 画图 PIL.ImageDraw

7.1 画图 PIL.ImageDraw.Draw(im)

im = Image.new('RGBA', (200, 200), 'white')

# 创建一个画图实例

draw = ImageDraw.Draw(im)

7.2 添加水印 draw.text(text_position, text, fill=(255, 0, 255), font=font)

  • draw.text(text_position, text, fill=(255, 0, 255), font=font)
  • draw.text()
  • 其实就是用文字叠在再图片上
from PIL import Image, ImageDraw, ImageFontpath1=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()

8 我的错误备注

8.1 有一类方法,不会改变原图对象的内容,但是返回值是改变后的对象,因为需要保存其返回值。

  • PIL.Image.open(path1)
  • img_obj.resize()  # resize()函数不改变原图大小,但是可以将返回值赋给新图片
  • img_obj.transpose()

正确写法+错误用法

  • image2.resize(image1.size)
  • Image.open(path1)

正确写法+正确用法

  • image2=image2.resize(image1.size)
  • image1 = Image.open(path1)
  • pic3=pic3.transpose(Image.FLIP_LEFT_RIGHT)

8.1  有一类方法直接改变原图对象,方法本身返回值为空none

8.1.1 返回值为空none的方法

  • img_obj.save()  方法,直接保存了img_obj对象,方法返回none
  • img_obj.thumbnail() 方法,直接修改了img_obj对象,方法返回none
  • img_obj.paste()方法,直接修改了img_obj这个被粘贴对象,方法返回none

8.1.2 具体例子

img_obj.save()方法

  • img_obj.image.resize().save()
  • pic3.transpose(Image.FLIP_LEFT_RIGHT).save()

img_obj.thumbnail()方法返回值none,但是直接修改原图!

  • 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'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯AcWing学习笔记 8-2数论的学习(下)

蓝桥杯 我的AcWing 题目及图片来自蓝桥杯C AB组辅导课 数论&#xff08;下&#xff09; 蓝桥杯省赛中考的数论不是很多&#xff0c;这里讲几个蓝桥杯常考的知识点。 约数个数定理 我们如何去求一个数的约数个数呢&#xff1f; N N N分解质因数的结果&#xff1a; N P 1 α…

HTML+CSS-02

阿里巴巴矢量图标库的使用 阿里巴巴网址矢量图标库网址 https://www.iconfont.cn/ 如何使用 选择需要的icon图标加入购物车下载代码 在将解压后的文件夹复制到项目中进入demo_index.html中打开就可以看到示例的三种用法 三种引入方法 Unicode 引用 Unicode 是字体在网页端…

vscode(visual studio code) 免密登陆服务器

1.生成密钥 首先&#xff0c;在本地&#xff0c;打开命令输入框&#xff1a; WinR–>弹出输入框&#xff0c;输入cmd,打开命令框。 然后&#xff0c;在命令框&#xff0c;输入 ssh-keygen -t rsa -C "love"按两次回车键&#xff0c;问你是否重写&#xff0c;选择…

人工智能SCI二区期刊Applied Intelligence高被引录用论文合集,含2024最新

今天给着急发论文的同学推荐一本期刊&#xff1a;《APPLIED INTELLIGENCE》。 该刊由SPRINGER出版商于1991年创刊&#xff0c;刊期Bimonthly&#xff0c;专注于人工智能和神经网络的研究&#xff0c;重点关注有关创新智能系统的方法论及其在解决现实生活复杂问题的研究进展&am…

Springboot中使用Filter过滤器

1、概述 springboot工程中使用Filter过滤器与其他地方使用基本相同&#xff0c;只是注入的方式不同。 2、创建Filter过滤器 实现Filter接口&#xff0c;重写doFilter方法 filterChain.doFilter(servletRequest,servletResponse);表示放行 public class MyFilter implement…

Rocketmq rust版本-开篇

我是蚂蚁背大象(Apache EventMesh PMC&Committer)&#xff0c;文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm&#xff0c;文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com Rust重构Rocketmq,大家好我是mxsm(Apache EventMesh PMC&Comm…

基于SSM的网上订餐管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

go语言初探(一)

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后&#xff0c;结果如下&#xff1a; 1、golang表达式中&#xff0c;加&#xff1b;和不加&#xff1b;都可以 2、函数的{和函数名一…

五、Model与View

一、Model/View结构 数据&#xff1a;如数据库的一个数据表或者SQL查询结果&#xff0c;如内存中的数据类对象&#xff0c;或者磁盘文件结构等Model&#xff1a;与数据通信&#xff0c;并作为视图组件提供数据接口View&#xff1a;屏幕界面组件&#xff0c;视图从数据模型获得…

软件工程:黑盒测试等价分类法相关知识和多实例分析

目录 一、黑盒测试和等价分类法 1. 黑盒测试 2. 等价分类法 二、黑盒测试等价分类法实例分析 1. 工厂招工年龄测试 2. 规定电话号码测试 3. 八位微机测试 4. 三角形判断测试 一、黑盒测试和等价分类法 1. 黑盒测试 黑盒测试就是根据被测试程序功能来进行测试&#xf…

Arduino快速上手esp32方案开发

一、什么是ESP32&#xff1f; ESP32是Espressif Systems推出的一款高性能、低功耗的Wi-Fi和蓝牙双模系统级芯片&#xff08;SoC&#xff09;&#xff0c;广泛应用于物联网、智能家居、可穿戴设备等领域。它基于极低功耗的Tensilica Xtensa LX6微处理器&#xff0c;并集成了丰富…

【现代密码学】笔记4--消息认证码与抗碰撞哈希函数《introduction to modern cryphtography》

【现代密码学】笔记4--消息认证码与抗碰撞哈希函数《introduction to modern cryphtography》 写在最前面4 消息认证码与抗碰撞哈希函数MAC概念回顾&#xff08;是的&#xff0c;我忘记这些缩写是什么了。。&#xff09;MAC的定义适应性CMA&#xff08;Chosen Message Attack&a…

SpringBoot教程(十五) | SpringBoot集成RabbitMq

SpringBoot教程(十五) | SpringBoot集成RabbitMq RabbitMq是我们在开发过程中经常会使用的一种消息队列。今天我们来研究研究rabbitMq的使用。 rabbitMq的官网&#xff1a; rabbitmq.com/ rabbitMq的安装这里先略过&#xff0c;因为我尝试了几次都失败了&#xff0c;后面等我…

边缘型人格障碍测试

边缘性人格障碍属于常见多发的人格障碍类型&#xff0c;在2015年美国的相关调查显示&#xff0c;边缘型人格障碍的患病率在初级医疗环境中为6%&#xff0c;在精神科住院病人中则达到20%。 边缘性人格障碍治疗难度高&#xff0c;对于个人造成的危害大。应该及早了解边缘性人格障…

软件测试|Git:fatal: refusing to merge unrelated histories错误分析与解决

问题介绍 在使用Git时&#xff0c;有时我们可能会遇到以下错误消息&#xff1a; fatal: refusing to merge unrelated histories这个错误通常发生在尝试合并两个不相关的Git仓库历史时。在本文中&#xff0c;我们将详细解释为什么会出现这个错误以及如何解决它。 问题分析 …

DataFunSummit:2023年云原生大数据峰会:核心内容与学习收获(附大会核心PPT下载)

随着数字化转型的深入推进&#xff0c;大数据技术已经成为企业获取竞争优势的关键因素之一。本次峰会汇聚了业界顶尖的大数据专家、企业领袖和技术精英&#xff0c;共同探讨云原生大数据领域的最新技术和趋势。本文将深入分析峰会的核心内容&#xff0c;并探讨参会者从中能学到…

Python字符串验证与正则表达式【第23篇—python基础】

文章目录 引言方法1&#xff1a;使用 isalpha() 方法方法2&#xff1a;使用正则表达式方法3&#xff1a;遍历字符检查应用场景示例与比较优化与扩展方法4&#xff1a;考虑空格和其他字符应用场景扩展 示例与比较优化与扩展方法4&#xff1a;考虑空格和其他字符方法5&#xff1a…

【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C考前速过系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

Docker容器(二)安装与初体验wordpress

一、安装 1.1关闭SeLinux SeLinux&#xff08;Security-Enhanced Linux&#xff09;是一种基于Linux内核的安全模块&#xff0c;旨在提供更严格的访问控制和安全策略。它通过强制实施安全策略来限制系统资源的访问&#xff0c;从而保护系统免受恶意软件和未经授权的访问。 在…

2023国赛 陕西省省级二等奖得主 数学建模学习资源推荐

美国最为权威的数学建模参考书Mathematical Modeling 在前言部分对数学建模有一个比较通俗易懂的解释&#xff1a; Mathematical modeling is the link between mathematics and the rest of the world. You ask a question. You think a bit, and then you refine the questi…