python处理图像文件
- 安装pillow模块
pip install pillow
from PIL import ImageColor
1.pillow模块的RGBA
在pillow模块中,RGBA分别代表Red红色、Green绿色、Blue蓝色和Alpha透明度。这4个数值组成元组,范围都在0~255之间,Alpha的值越小,透明度越高。
1.1 getrgb()
getrgb()函数可以将颜色符号或字符串转成元组:
(r, g, b) = getrgb(color)
1.2 getcolor()
(r, g, b) = getcolor(color, “mode”) # 返回色彩元组
mode为”RGBA" --> 返回RGBA元组
mode为”RGB" --> 返回RGB元组
mode为其他 --> 返回整数值
# author:mlnt
# createdate:2022/8/19
from PIL import ImageColor
"""
1.getrgb()
getrgb()函数可以将颜色符号或字符串转成元组:
(r, g, b) = getrgb(color)
"""
print(ImageColor.getrgb('#0000ff')) # (0, 0, 255)
print(ImageColor.getrgb("rgb(0, 255, 255)")) # (0, 255, 255)
print(ImageColor.getrgb('blue')) # (0, 0, 255)
print(ImageColor.getrgb('rgb(0%, 50%, 100%)')) # (0, 128, 255)
# 2.getcolor()
# (r, g, b) = getcolor(color, "mode") # 返回色彩元组
"""
mode为”RGBA" --> 返回RGBA元组
mode为”RGB" --> 返回RGB元组
mode为其他 --> 返回整数值
"""
print(ImageColor.getcolor('#0000ff', 'RGB')) # (0, 0, 255)
print(ImageColor.getcolor("rgb(0, 255, 255)", 'RGBA')) # (0, 255, 255, 255)
print(ImageColor.getcolor('blue', 'RGB')) # (0, 0, 255)
print(ImageColor.getcolor('rgb(0%, 50%, 100%)', 'RGBA')) # (0, 128, 255, 255)
2. pillow模块的盒子元组
最左上角的像素的(x,y)是(0,0),x轴像素往右递增,y轴像素往下递增。
盒子元组的参数是(left,top,right,bottom):
left:盒子左上角的x轴坐标;
top:盒子左上角的y轴坐标;
right:盒子右下角的x轴坐标;
bottom:盒子右下角的y轴坐标
3. 图像的基本操作
- open():打开图片
- size属性:获取图片宽高
- filename属性:获取图片源文件名称
- format属性:获取图像文件格式(后缀)
- format_description属性:获取详细的文件格式描述
- save():存储文件,可将文件另存为其他图片格式
- new(mode, size, color=0):创建新的图像对象
# author:mlnt
# createdate:2022/8/19
from PIL import Image
# 1.打开图片
image = Image.open('gailun.jpeg') # 创建pillow对象
print(type(image)) # <class 'PIL.JpegImagePlugin.JpegImageFile'>
# 2.获取图像的大小属性
width, height = image.size # 获得图像的宽度和高度
print(f'width: {width}, height: {height}') # width: 682, height: 384
# 3.获取图像文件名
print(f'filename: {image.filename}') # filename: gailun.jpeg
# 4.获取图像的文件格式
print(f'扩展名: {image.format}') # 扩展名: JPEG
print(f'文件格式描述:{image.format_description}') # 文件格式描述:JPEG (ISO 10918)
# 5.存储文件
# 另存为png格式文件
image.save('gailun.png')
# 6.创建新的图像对象
"""
使用new()方法创建新的图像对象,语法格式:
new((mode, size, color=0)
mode:RGBA(建立png文件),RGB(创建jpg文件)
size的参数为元组
color预设为黑色
"""
picture = Image.new(mode="RGB", size=(100, 200), color='SteelBlue')
picture.save(fp='newPicture.jpg')
newPicture.jpg:
4. 图像的编辑
4.1 更改图像大小–resize()
resize((width, height), Image.BILINEAR)
Image.NEAREST:最低质量
Image.ANTIALIAS:最高质量
Image.BISCUBIC:三次方取样法
# author:mlnt
# createdate:2022/8/19
# 1.更改图像大小resize()
"""
resize((width, height), Image.BILINEAR)
Image.NEAREST:最低质量
Image.ANTIALIAS:最高质量
Image.BISCUBIC:三次方取样法
"""
from PIL import Image
# 打开图像
picture = Image.open('newPicture.jpg')
# 获取大小属性
width, height = picture.size
newPict1 = picture.resize((width * 2, height)) # 宽度为原来的2倍
newPict1.save('2width.jpg')
newPict2 = picture.resize((width, height * 2)) # 高度为原来的2倍
newPict2.save('2height.jpg')
4.2 图像旋转–rotate()
# author:mlnt
# createdate:2022/8/19
"""
rotate()方法可以逆时针旋转图像
如果旋转90度或270度:宽高变化,图像本身比率不变,多的部分以黑色图像替代。
旋转其他角度则图像维持不变。
"""
from PIL import Image
picture = Image.open('gailun.jpeg')
picture.rotate(90).save('r90.jpg') # 旋转90度
picture.rotate(180).save('r180.jpg') # 旋转180度
picture.rotate(270).save('r270.jpg') # 旋转270度
# 增加expand=True参数,将放大图像,让整个图像显示,多余部分用黑色填满
picture.rotate(270, expand=True).save('r270_ex.jpg') # 旋转270度
旋转90度
旋转180度
旋转270度
旋转270加放大
4.3 图像翻转–transpose()
使用**transpose()**方法可以让图像翻转:
- transpose(Image.Transpose.FLIP_LEFT_RIGHT):左右翻转
- transpose(Image.Transpose.FLIP_TOP_BOTTOM):上下翻转
# author:mlnt
# createdate:2022/8/19
"""
使用transpose()方法可以让图像翻转
transpose(Image.Transpose.FLIP_LEFT_RIGHT):左右翻转
transpose(Image.Transpose.FLIP_TOP_BOTTOM):上下翻转
"""
from PIL import Image
picture = Image.open('gailun.jpeg')
picture.transpose(Image.Transpose.FLIP_LEFT_RIGHT).save('FLIP_LEFT_RIGHT.jpg') # 左右翻转
picture.transpose(Image.Transpose.FLIP_TOP_BOTTOM).save('FLIP_TOP_BOTTOM.jpg') # 上下翻转
左右翻转:
上下翻转:
4.4 图像像素编辑
- getpixel()方法可以取得图像某一位置像素的色彩
# author:mlnt
# createdate:2022/8/19
"""
getpixel()方法可以取得图像某一位置像素的色彩
getpixel((x,y))
"""
from PIL import Image
newImage = Image.new('RGBA', (200, 200), 'green')
print(newImage.getpixel((100, 100))) # 打印中心点的色彩
newImage.save('newImage1.png')
# (0, 128, 0, 255)
- putpixel()方法可以在图像的某个位置填入色彩
# author:mlnt
# createdate:2022/8/19
"""
putpixel()方法可以在图像的某个位置填入色彩
putpixel((x,y),(r,g,b,a))
"""
from PIL import Image
from PIL import ImageColor
newImage = Image.new('RGBA', (200, 200), 'green')
for x in range(50, 151): # x轴区间在50-150
for y in range(50, 100): # y轴区间在50-99
newImage.putpixel((x, y), (0, 255, 255, 255))
newImage.save('putpixel_test1.png')
for x in range(50, 150): # x轴区间在50-149
for y in range(90, 120): # y轴区间在90-119
newImage.putpixel((x, y), ImageColor.getcolor('Yellow', 'RGBA'))
newImage.save('putpixel_test2.png')
4.5 裁切、复制与图像合成
- 裁切图像–crop()
# author:mlnt
# createdate:2022/8/19
"""
crop()方法裁剪图像
参数为元组,内容为区间坐标(左,上,右,下)
"""
from PIL import Image
picture = Image.open('yase.jpeg')
crop_pic = picture.crop((30, 20, 450, 360)) # 裁剪区间
crop_pic.save('crop_pic.jpg')
-
复制图像copy()
# author:mlnt # createdate:2022/8/19 """ copy()方法 """ from PIL import Image picture = Image.open('yase.jpeg') copy_pic = picture.copy() # 复制 copy_pic.save('copy_pic.jpg')
-
图像合成paste()
paste()方法实现图像合成:
底图图像.paste(插入图像,(x,y))
(x,y)为图像插入的位置
# author:mlnt
# createdate:2022/8/19
"""
paste()方法实现图像合成
底图图像.paste(插入图像,(x,y))
(x,y)为图像插入的位置
"""
from PIL import Image
pic1 = Image.open('gailun.jpeg')
pic2 = Image.open('yase.jpeg')
crop_pic = pic2.crop((120, 20, 436, 370)) # 裁剪区间
pic1.paste(crop_pic, (1, 40))
pic1.save('图像合成.jpg')
-
将裁剪图片填满图像区间
# author:mlnt # createdate:2022/8/19 from PIL import Image pic = Image.open('img.jpeg') crop_pic = pic.crop((20, 20, 80, 80)) # 裁剪区间 crop_width, crop_height = crop_pic.size # 获得裁切区间的宽高 width, height = 440, 440 # 新图像宽高 newImage = Image.new('RGB', (width, height), 'green') # 创建新图像 for x in range(10, width-20, crop_width): for y in range(10, height-20, crop_height): newImage.paste(crop_pic, (x, y)) # 合成 newImage.save('图像铺满.jpg')
4.6 图像添加滤镜
pillow模块内的ImageFilter模块中的filter()可以给图片加上滤镜效果。此方法的参数意义:
- BLUR:模糊;
- CONTOUR:轮廓;
- DETAIL:细节增强
- EDGE_ENHANCE:边缘增强;
- EDGE_ENHANCE_MORE:深度边缘增强;
- EMBOSS:浮雕效果;
- FIND_EDGES:边缘信息;
- SMOOTH:平滑效果;
- SMOOTH_MORE:深度平滑效果;
- SHARPEN:锐化效果。
# author:mlnt
# createdate:2022/8/20
"""
pillow模块内的ImageFilter模块中的filter()可以给图片加上滤镜效果。此方法的参数意义:
BLUR:模糊;
CONTOUR:轮廓;
DETAIL:细节增强
EDGE_ENHANCE:边缘增强;
EDGE_ENHANCE_MORE:深度边缘增强;
EMBOSS:浮雕效果;
FIND_EDGES:边缘信息;
SMOOTH:平滑效果;
SMOOTH_MORE:深度平滑效果;
SHARPEN:锐化效果。
"""
import PIL
from PIL import Image
from PIL import ImageFilter
image = Image.open('img.jpeg') # 创建pillow对象
# 更改图像大小
image = image.resize((80, 80), resample=PIL.Image.Resampling.BILINEAR)
# image.show()
# # 模糊
filter_img = image.filter(ImageFilter.BLUR)
# filter_img.show()
filter_img.save('img_BLUR.jpg')
# 轮廓
filter_img = image.filter(ImageFilter.CONTOUR)
filter_img.save('img_CONTOUR.jpg')
# 细节增强
# filter_img = image.filter(ImageFilter.DETAIL)
# filter_img.save('img_DETAIL.jpg')
# 边缘增强
filter_img = image.filter(ImageFilter.EDGE_ENHANCE)
filter_img.save('img_EDGE_ENHANCE.jpg')
# 深度边缘增强
filter_img = image.filter(ImageFilter.EDGE_ENHANCE_MORE)
filter_img.save('img_EDGE_ENHANCE_MORE.jpg')
# 浮雕效果
filter_img = image.filter(ImageFilter.EMBOSS)
filter_img.save('img_EMBOSS.jpg')
# 边缘信息
filter_img = image.filter(ImageFilter.FIND_EDGES)
filter_img.save('img_FIND_EDGES.jpg')
# 平滑效果
# filter_img = image.filter(ImageFilter.SMOOTH)
# filter_img.save('img_SMOOTH.jpg')
# 深度平滑效果
# filter_img = image.filter(ImageFilter.SMOOTH_MORE)
# filter_img.save('img_SMOOTH_MORE.jpg')
# 锐化效果
filter_img = image.filter(ImageFilter.SHARPEN)
filter_img.save('img_SHARPEN.jpg')
效果:
4.7 图像内绘制图案
pillow模块内有一个ImageDraw模块,利用此模块可以绘制:点(Points)、线(Lines)、矩形(Rectangles)、椭圆(Ellipses)、多边形(Polygons)
- 1.绘制点:point([(x1,y1),…(xn,yn)],fill),fill为设置的颜色
- 2.绘制线条:line([(x1,y1),…(xn,yn)], width, fill) ,width为宽度
- 3.ellipse()方法绘制圆或椭圆:
ellipse((left,top,right,bottom), fill, outline),outline为外框颜色 - 4.rectangle()方法绘制椭圆:rectangle((left,top,right,bottom), fill, outline)
- 5.polygon()方法绘制多边形:polygon([(x1,y1),…(xn,yn)], fill, outline)
# author:mlnt
# createdate:2022/8/19
"""
pillow模块内有一个ImageDraw模块,利用此模块可以绘制:
点(Points)、线(Lines)、矩形(Rectangles)、椭圆(Ellipses)、多边形(Polygons)
"""
from PIL import Image, ImageDraw
newImage = Image.new('RGBA', (300, 300), 'green')
drawObj = ImageDraw.Draw(newImage)
# 1.绘制点
# point([(x1,y1),...(xn,yn)],fill) fill为设置的颜色
for x in range(100, 200, 3):
for y in range(100, 200, 3):
drawObj.point([(x, y)], fill='orange')
# 2.绘制线条
# line([(x1,y1),...(xn,yn)], width,, fill) width为宽度
drawObj.line([(0, 0), (299, 0), (299, 299), (0, 299), (0, 0)], fill='blue')
for x in range(150, 300, 10):
drawObj.line([(x, 0), (300, x - 150)], fill='yellow')
for y in range(150, 300, 10):
drawObj.line([(0, y), (y - 150, 300)], fill='yellow')
# 绘制矩形
drawObj.rectangle((100, 200, 210, 240), outline='silver')
# 绘制圆和椭圆
drawObj.ellipse((20, 10, 280, 290), outline='black')
drawObj.ellipse((50, 50, 120, 120), outline='brown')
drawObj.ellipse((180, 180, 200, 200), outline='orange')
# 绘制多边形
drawObj.polygon([(150, 120), (100, 100), (120, 100), (150, 120)], fill='Aqua')
newImage.save('图案.png')
4.8 在图像内添加文字
text((x,y),text,fill,font)
使用其他字体,需调用ImageFont.truetype()方法选用字体,同时设定字号。
使用ImageFont.truetype()前需导入ImageFont模块:
ImageFont.truetype(字体路径,字号)
# author:mlnt
# createdate:2022/8/19
"""
text((x,y),text,fill,font)
使用其他字体,需调用ImageFont.truetype()方法选用字体,同时设定字号。
使用ImageFont.truetype()前需导入ImageFont模块
text(字体路径,字号)
"""
from PIL import Image, ImageDraw, ImageFont
newImage = Image.new('RGBA', (500, 300), 'green')
drawObj = ImageDraw.Draw(newImage)
strText = 'Hello world'
drawObj.text((50, 50), strText, fill='blue')
fontInfo = ImageFont.truetype(r'C:\Windows\Fonts\IMPRISHA.TTF', 24)
drawObj.text((50, 100), strText, fill='red', font=fontInfo)
strText_2 = '天朗气清,惠风和畅'
fontInfo = ImageFont.truetype(r'C:\Windows\Fonts\Muyao.TTF', 28)
drawObj.text((50, 180), strText_2, fill='orange', font=fontInfo)
strText_3 = '天朗气清,惠风和畅'
fontInfo = ImageFont.truetype(r'C:\Windows\STXINGKA.TTF', 28)
drawObj.text((50, 240), strText_2, fill='Brown', font=fontInfo)
# 竖排显示
strText_4 = '玄池嫣韵\n坦荡\n勤能补拙'
# 初始化参数
x = 360 # 横坐标(左右)
y = 20 # 纵坐标(上下)
right = 0 # 往右位移量
down = 0 # 往下位移量
w = 300 # 文字宽度
h = 300 # 文字高度
# 设置字体
font = ImageFont.truetype("C:\\Windows\\Fonts\\STXINGKA.TTF", 42)
for k, s2 in enumerate(strText_4):
if k == 0:
box = font.getbbox(s2)
w, h = box[2] - box[0], box[3] - box[1] # 获取第一个文字的宽和高
if s2 == "," or s2 == "\n": # 换行识别
right = right + w
down = 0
continue
else:
down = down + h
print("序号-值", k, s2)
print("宽-高", w, h)
print("位移", right, down)
print("坐标", x + right, y + down)
drawObj.text((x + right, y + down), s2, (255, 255, 0), font=font) # 设置位置坐标 文字 颜色 字体
newImage.show()
newImage.save('写字.png')