本章节用到python处理图像的模块为pillow
本章采用: pycharm + python3.10 + pillow模块
请自行下载该模块
pip install pillow
本章目录
pillow模块基本概念
1、getrgb()函数的基本概念和使用
函数演示
2、getcolor()函数的基本概念和使用
函数演示
一.图像的基本操作
1.开启图像对象
2.图像大小属性
3.取得图像对象文件名
4.取得图像对象的文件格式
5.存储文件
6.屏幕显示图片
7.建立新的图像对象
二 . 图像编辑
1.更改图像大小
2.图像旋转
3.图像翻转
4.图像像素的编辑
4.1 在图片的某处添色彩
5.剪裁,复制,与图像合成
5.1剪裁
5.2 复制
5.3 图像合成
6.图片滤镜
7.绘制图案
7.1 绘制点,绘制线条
7.2 绘制圆,椭圆,矩形,多边形
7.3 图像内填写文字
在pillow模块中RGBA分别代表红色(red),绿色(gree),蓝色(blue)和透明度(alpha)这四个与颜色有关的数值组成元组,每个数值是0~255。如果alpha的值为255,代表完全不透明,值越小透明度越高。其色彩使用方式与PS等其他图片处理软件相同。
该函数可以将颜色符号或字符串转为元组,这里可以使用英文名称,比如 ‘red’,色彩数值,如 #00ff00,以及rgb函数,如rgb(255,0,0)。rgb函数也可以使用百分比代表颜色,例如rgb(0%,100%,0%)。这个函数在使用时,如果字符串无法被解析判别,将造成ValueErro的异常,使用格式如下:
(r,g,b) = getrgb(color)
from PIL import ImageColor as ic # 注意在程序设计中不需导入的是PTL模块,主要原因是兼容旧版 Python Image Library
# 使用 getrgb方法返回色彩的元组
print("通过颜色代码返回", ic.getrgb("#0000ff"))
print("如果rgb颜色数值返回", ic.getrgb("rgb(255,0,0)"))
print("通过百分比返回", ic.getrgb("rgb(0%,100%,0%)"))
print("通过英文单词返回", ic.getrgb("Red"))
print("通过小写英文单词返回", ic.getrgb("red"))
# 运行结果:
该函数基本功能上与getrgb函数相同,书写格式如下:
(r,g,b) = getcolor(color,"mode") #返回色彩元组
(r,g,b,a) = getcolor(color,"mode") # 返回色彩元组
“mode”若是填写RGBA则返回RGBA的元组,RGB则时RGB元组
# 不懂RGB 和RGBA的请跳转
RGB(颜色系统)_百度百科 (baidu.com)
RGBA_百度百科 (baidu.com)
from PIL import ImageColor as ic # 注意在程序设计中不需导入的是PTL模块,主要原因是兼容旧版 Python Image Library
print("RGB元组:", ic.getcolor("#0000ff", "RGB"))
print("RGB元组:", ic.getcolor("rgb(255,0,0)", "RGB"))
print("RGB元组:", ic.getcolor("Red", "RGB"))
print("RGBA元组:", ic.getcolor("#0000ff", "RGBA"))
print("RGBA元组:", ic.getcolor("rgb(255,0,0)", "RGBA"))
print("RGBA元组:", ic.getcolor("red", "RGBA"))
# 运行结果
可以用open()方法开启一个图像,参数是放置欲开启的图像文件
可以使用size属性获得图像大小,这个属性可回传图像的宽(width)和高(height)
# 例如
from PIL import Image
# 建立pillow对象
image = Image.open("image/image.png")
print("列出对象类型", type(image))
width, height = image.size
print("图片宽度=", width)
print("图片高度=", height)
# 运行结果
filename函数可以获取当前图片名称
from PIL import Image
# 建立pillow对象
image = Image.open("image/image.png")
print("图像名称", image.filename)
可以使用formart属性获得图片文件扩展名,此外,可以使用format_description属性获得更详细的文件格式描述
#例如
from PIL import Image
# 建立pillow对象
image = Image.open("image/image.png")
print("列出对象扩展名称", image.format)
print("列出对象详细扩展名称", image.format_description)
# 运行结果
可以使用save()函数存储文件,甚至可以将 jpg 格式转换成 png 格式,如果 png 转 jpg是不行的
#例如
from PIL import Image
# 建立pillow对象
image = Image.open("image/image.jpg")
image.save("image.png") # 储存并转为png格式
# 运行结果
可以使用show()方法直接显示图片,在windows操作系统下可以使用此方法调用windows相片查看器显示图片
#例如
from PIL import Image
# 建立pillow对象
image = Image.open("image/image.jpg")
image.show() # 显示图片
# 运行结果
可以使用new()方法建立新的图像对象
语法格式:
new(mode,size,color=0)
# mode:可以有多种设定,一般用“RGBA”建立PNG图片,"RGB"建立jpg图片
# size: 该参数是一个元组,可以设定新图像的宽度和高度。
# color: 预设是黑色,不过我们可以建立不同的颜色
# 例如
from PIL import Image
# 创建图片
create_image = Image.new("RGBA", (1920, 1080), "yellow")
create_image.save("test.png")
create_image.show()
# 运行结果
Pillow模块提供的resize()方法可以调整图像大小
语法:
resize((widtg,heigh),Image.BILINEAR)
# (widtg,heigh): 宽高,元组的形式
# 参数二(BILINEAR)图像质量方法,也可以设定NEAREST最低质量,ANTIALIAS最高质量或者BISCUBIC三次方取样法,一般可以省略
# 例如
from PIL import Image
# 建立pillow对象
image = Image.open("image/image.jpg") # 打开图片
width, height = image.size # 将大小提取为参数
print(f"原图大小"
f"宽:{width}"
f"高:{height}")
new_image = image.resize((width * 2, height * 2)) # 将原图的宽高提升为原来的二倍
new_image_save = new_image.save("new_image.png") # 保存图片并且为png格式
image1 = Image.open("new_image.png") # 打开新图片
width, height = image1.size # 提取新图片大小
print(f"改后大小"
f"宽:{width}"
f"高:{height}")
# 运行结果
rotate()方法可以逆时针旋转图片,该方法有第二个参数 expand=True 代表旋转并放大,默认是不放大
# 例如
from PIL import Image
# 建立pillow对象
# 旋转前
image = Image.open("image/image.jpg") # 打开图片
w, h = image.size
print(f"旋转前"
f"宽:{w}"
f"高:{h}")
image.show()
# 旋转后
image.rotate(90).save("90度图片.png") # 逆时针转向90度
# image.rotate(90, expand=True).save("90度图片.png") # 逆时针转向90度并放大
new_image = Image.open("90度图片.png")
new_image.show()
w, h = new_image.size
print(f"旋转后"
f"宽:{w}"
f"高:{h}")
# 运行结果
# 未加 expand 参数效果
# 加了 expand 参数的效果 ,加了以后宽高参数会发生调转
transpose()函数可以让图片翻转
语法:
transpose(Image.ELIP_LEFT_RIGHT) # 图片左右翻转
transpose(Image.ELIP_TOP_BOTTOM) # 图片上下翻转
# 例如:
from PIL import Image
image = Image.open("image/image.jpg") # 打开图片
image.transpose(Image.FLIP_LEFT_RIGHT).show() # 左右翻转
image.transpose(Image.FLIP_TOP_BOTTOM).show() # 上下翻转
# 运行结果
getpixe()方法可以取得图像某一位置像素的色彩
语法:
getpixe((x,y)) # 参数是元组,x 和 y 代表像素位置
# 例如
from PIL import Image
# 取图片某一点的颜色值
image = Image.open("image/image.jpg") # 打开图片
print(image.getpixel((123, 123))) # 打印位于x,y 轴123px的色彩
# 运行结果
putpixel()方法可以在图片的某一处位置填入色彩
语法如下:
putpixel((x,y),(r,g,b,a)) # 2 个参数分别代表位置与颜色
# 例如
# 想玩的同学,可以尝试用 随机数模块 random 实现动一下一个颜色哈~~花里胡哨的~哈哈
from PIL import Image
from PIL import ImageColor
image = Image.open("image/image.jpg") # 打开图片
# 利用循环添加颜色点
for x in range(1, 1200):
for y in range(1, 1200):
image.putpixel((x, y), (0, 234, 123, 255)) # 通过X,Y 坐标添加 颜色
image.save("1.png") # 保存图片
Image.open("1.png").show() # 查看图片
# 与上方同理
for x in range(1, 999):
for y in range(1, 999):
image.putpixel((x, y), ImageColor.getcolor("red", "RGBA")) # 通过getcolor 添加颜色
image.save("1.png")
Image.open("1.png").show()
# 运行结果
通过 crop()的方法可以实现图片剪裁
#例如
from PIL import Image
image = Image.open("image/image.jpg") # 打开图片
image1 = image.crop((120, 240, 480, 960)) # 剪裁位置分别代表 (左,上,右,下)
image1.show()
元组里的元素分别是:(左:距离图片左边界距离,上: 距离图片上边界距离,右:距离图片左边的距离,下:距离图片上边界距离)
# 运行结果
通过copy()函数即可复制,这一快为了保证不破坏原图内容,复制一个副本然后再执行代码
#例如
from PIL import Image
image = Image.open("image/image.jpg") # 打开图片
copy_image = image.copy() # 复制图片
copy_image.save("3.png") # 保存
通过paste()函数就可以合成图像
语法:
底层图片.paste(插入图像,(x,y))
# 例如
from PIL import Image
image = Image.open("image/image.jpg") # 打开图片
image1 = image.copy() # 复制图片
image2 = image1.crop((1075, 256, 1445, 552)) # 剪裁图片 左 1075 右 256 上 1445 下 552
crop_width, crop_height = image2.size # 获取剪裁后图片的 宽 高
print("剪裁图片后的宽高", crop_width, crop_height)
# 新建图片
width, height = 1920, 1080
new_image = Image.new("RGBA", (width, height), "Blue") # 建立 宽高 1920 * 1080 的蓝色背景
for x in range(40, width - 40, crop_width): # 定位x坐标 以剪切的图片宽度为准,走步长
for y in range(40, height - 40, crop_height): # 定位y 坐标 以剪切的图片高度为准,走步长
new_image.paste(image2, (x, y)) # 将加剪切图片合成到我们建立的背景下
new_image.show() # 查看图片
# 运行结果
Pillow模块内有ImageFilter模块,在该模块当中有filter()函数可以为图片加上滤镜效果
filter()方法参数
BLUR: 模糊
CONTOUR: 轮廓
DETAIL: 细节增强
EDGE_ENGANCE: 边缘增强
EDGE_ENHANCE_MORE: 深度边缘增强
EMBOSS: 浮雕效果
FIND_EDGES: 边缘信息
SMOOTH: 平滑效果
SMOOTH_MORE: 深度平滑效果
SHARPEN: 锐利化效果
#例如:
from PIL import Image
from PIL import ImageFilter
image = Image.open("image/image.jpg") # 打开图片
image_ps = image.filter(ImageFilter.BLUR) # 模糊效果
image_ps.show()
image_ps_1 = image.filter(ImageFilter.CONTOUR) # 轮廓效果
image_ps_1.show()
image_ps_2 = image.filter(ImageFilter.EMBOSS) # 浮雕效果
image_ps_2.show()
image_ps_3 = image.filter(ImageFilter.FIND_EDGES) # 边缘化效果
image_ps_3.show()
#运行结果:
Pillow模块内有一个ImageDraw的模块,可以利用该模块绘制点(Points),线(Lines),矩形(Rectangles),椭圆(Ellipses),多边形(Polygons)。
ImageDraw的模块下 point()方法可以绘制点
语法:
point([(x1,y1),(x2,y2),......(xn,yn)],fill) # fill设定颜色
# 第一个参数是元组组成的列表,x和y是绘制点坐标
# fill可以是RGBA()或者是直接指定颜色
ImageDraw的模块下 line()函数可以绘制线
语法:
line([(x1,y1),(x2,y2),......(xn,yn)],width,fill) # width为宽度,预设为 1
# 第一个与绘制线差不多,当有两个点的时候会自动连成线,fill可以是RGBA()或指定颜色
# 例如:
from PIL import Image, ImageDraw
new_image = Image.new('RGBA', (300, 300), "azure") # 建立300*300青色图像
draw_image = ImageDraw.Draw(new_image)
new_image.save("1.png")
# 绘制点
for x in range(100, 200, 3): # 定位x坐标,范围和点的间隔
for y in range(100, 200, 3): # 定位 y 坐标,范围和点的间隔
draw_image.point([x, y], fill='red')
new_image.show()
# 绘制线条
draw_image.line([(0, 0), (299, 0), (299, 299), (0, 299), (0, 0)], fill="Black")
new_image.show()
# 绘制右上角
for x in range(150, 300, 10):
draw_image.line([(x, 0), (300, x - 150)], fill="yellow")
new_image.show()
# 绘制左下角
for y in range(150, 300, 10):
draw_image.line([(0, y), (y-150, 300)], fill="green")
new_image.show()
#运行结果
ImageDraw的模块下 ellipse()方法可以绘制圆或椭圆
语法:
ellipse((left,top,right,boottom),fill,outline)
# (left,top,right,boottom):代表左上角与右下角坐标位置
# fill: 颜色
# outline: 可选是否加上
ImageDraw的模块下 rectangle()方法可以绘制矩形
语法:
rectangle((left,top,right,boottom),fill,outline) # 与绘制椭圆的注释一个意思
ImageDraw的模块下 polygon()方法可以绘制多边形
语法:
polygon([(x1,y1),(x2,y2),......(xn,yn)],fill,outline)
# 第一个参数 [(x,y)] 表示绘制多边形的点坐标,在此须填上多边形各端点的坐标
# fill 颜色
# outline 可选是否加上
# 例如:
from PIL import Image, ImageDraw
new_image = Image.new('RGBA', (300, 300), "azure") # 建立300*300青色图像
draw_image = ImageDraw.Draw(new_image)
draw_image.rectangle((0, 0, 299, 299), outline="Blue") # 绘制图像外框线
# new_image.show()
draw_image.ellipse((30, 65, 130, 100), outline="red") # 绘制椭圆
# new_image.show()
draw_image.ellipse((65, 65, 95, 95), outline="green") # 绘制圆
# new_image.show()
draw_image.polygon([(150, 120), (180, 180), (120, 180), (150, 120)], fill="Aqua") # 绘制三角形
# new_image.show()
draw_image.rectangle((100, 210, 200, 240), fill="Black") # 绘制矩形
new_image.show()
#运行结果
ImageDraw的模块下 text()函数可以填写中英文
语法:
text((x,y),text,fill,font) # text参数代表要写的文字
# font: 选择默认方式填写可以忽略该参数。
# 如果想填写其他字体 选定字号,需要调用ImageFont.truetype()方法 # 需要提前导入该函数
# 该方法语法如下
# text(字体路径,字号)
# 例如:
from PIL import Image, ImageDraw, ImageFont
new_image = Image.new('RGBA', (300, 300), "aqua") # 建立300*300青色图像
draw_image = ImageDraw.Draw(new_image)
Text = "Thanks for watching my blog !"
draw_image.text((70, 70), Text, fill="Black") # 使用默认字体
# 选取系统字体
chinese_text = "感谢观看我的博客!"
font_info = ImageFont.truetype('C:\Windows\Fonts\msyh.ttc', 25) # 选取本地汉字存放路径,win10默认就是这个路径下
draw_image.text((50, 180), chinese_text, fill="Red", font=font_info) # 定位并选择文字和颜色,还有字体位置字号
new_image.show()
# 运行结果: