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/19from 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 Imagepicture = 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 Imagepicture = 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 ImagenewImage = 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 ImageColornewImage = Image.new('RGBA', (200, 200), 'green')
for x in range(50, 151):        # x轴区间在50-150for y in range(50, 100):    # y轴区间在50-99newImage.putpixel((x, y), (0, 255, 255, 255))
newImage.save('putpixel_test1.png')
for x in range(50, 150):        # x轴区间在50-149for y in range(90, 120):    # y轴区间在90-119newImage.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 Imagepicture = 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 Imagepicture = 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 Imagepic1 = 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 Imagepic = 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 ImageFilterimage = 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, ImageDrawnewImage = 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, ImageFontnewImage = 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 + wdown = 0continueelse:down = down + hprint("序号-值", 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')


参考:

  • https://www.likecs.com/show-203574770.html
  • https://blog.csdn.net/qq_36874480/article/details/123569375

python处理图像文件相关推荐

  1. python 速度 memmap_浅析Python 读取图像文件的性能对比

    浅析Python 读取图像文件的性能对比 发布时间:2020-08-30 16:31:06 来源:脚本之家 阅读:57 作者:BriFuture''s Blog 使用 Python 读取一个保存在本地 ...

  2. python 读入图像文件和输出图像文件

    目录 Matplotlib Python读入图像文件 模块 方法 功能 参数(Parameters) 返回值(Returns) Python输出图像文件 模块 方法 功能 参数(Parameters) ...

  3. Python处理图像文件的实用姿势

    那些人人称道的美丽,里面都有PS的痕迹. 人是视觉型动物,每个人都有自己的审美标准,那些共同的准则形成了社会潮流. 随着计算机技术升级,我们现在可以用手机随时拍出漂亮的照片. "PS&quo ...

  4. python实现图像文件等比例压缩

    图像文件压缩.使用PIL库对图像进行等比例压缩,无论压缩前文件大小如何,压缩后文件大小小于10KB. from PIL import Image#引入PIL库中的Image类 import os#引入 ...

  5. python显示图像文件要放在哪儿_opencv显示图像要把图像放在哪里

    非常简单,你用的是win7而不是xp,如果是在xp上上面的代码当然是可以的:貌似是因为你win7摄像头的缘故,还好像与vfw模式有关系吧,win7貌似没有vfw,楼主可以使用directshow模块来 ...

  6. python做图像处理快不快_Python 图像读写谁最快?不信就比一比

    图像处理,顾名思义,是对图像进行的各种转换.计算等处理.图像处理必不可少地需要读写图像文件. 图像文件的读取,就是将图像数据从磁盘中的文件内读入内存,之后按照图像解码标准解码,最后把图像各像素的值存储 ...

  7. python图片-Python图像处理

    图像处理 本章工作任务 u 任务1:了解Pillow库的基本操作 u 任务2:掌握图像格式转换 u 任务3:掌握改变图像尺寸 u 任务4:掌握剪裁图像 u 任务5:掌握滤镜处理 本章技能目标及重难点 ...

  8. 【Python进阶】实战Python图形文件操作基本编程

    欢迎来到专栏<Python进阶>.在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件.数据的处理,Python各种好用的库如NumPy.Scipy.Matplotl ...

  9. python方向键控制角色_用python和pygame游戏编程入门-控制角色移动

    在上一节中我们知道了事件,以及如何捕捉键盘事件进行响应,本届我们结合第一节何上一节的内容,做一个用键盘控制角色移动的功能,代码如下: #!/usr/bin/env python #指定图像文件名称 b ...

最新文章

  1. javascript——Array类型
  2. 我的RHCA之路随想
  3. Oracle学习:视图与索引
  4. usaco1.2.2 transform
  5. CodeForces - 1355E Restorer Distance(三分)
  6. alarm项目bug
  7. node.js ejs_如何在Node.js应用程序中使用EJS模板
  8. 最优二叉查找树(动态规划)——详解
  9. 揭秘新的供应链攻击:一研究员靠它成功入侵微软、苹果等 35 家科技公司
  10. idea 设置重复代码检测
  11. 我们称字母顺些和逆写都相同的单词或者短语为“回文”,编写一个Java程序判断输入的一行文本是否是回文。
  12. 汽车行业大数据解决方案的应用案例详细分析
  13. 初窥门径:认识C语言
  14. ABAP——smartform添加图片
  15. 解决Win2016提示 “发生身份验证错误 要求的函数不受支持“的问题
  16. 苹果删除照片不释放内存_别再胡乱清理垃圾了,只要删除这6个文件夹,瞬间释放20GB内存...
  17. oracle繁体字筛选,Oracle数据库字符集浅析
  18. python 工资条_当财务部的人会编程,会发生什么?Python实现自动化群发工资条...
  19. 刘利刚-什么是计算机图形学?
  20. 使用opencv进行USB摄像头参数配置

热门文章

  1. java教程设计_Java教学设计方案.doc
  2. 基于RFID技术在服装智慧门店中的应用-rfid服装盘点
  3. jenkins安装 插件插件失败 简单快捷安装办法
  4. 电器与计算机工程 英文,电气与电子工程专业英语
  5. 机器学习 4 个常用超参数调试方法!
  6. netlink简单介绍 (linux-3.14.2)
  7. 怎么查看当前DLL所需要依赖的其他DLL
  8. 《傲慢与偏见》读后感
  9. 【CAD二次开发】最完美EntityJig画polyline arc实例
  10. 盘点世界上最难的 5 种编程语言!网友看后惊讶道:竟不是C/C++?