python之图像操作
颜色和RGBA值
计算机程序通常将图像中的颜色表示为RGBA。其值表示的是一组数字,指定颜色中的红、绿、蓝和透明度的值,这些值从0到255的整数。
红色表示(255,0,0,255),在模块pillow中RGBA的值表示4个整数值的元组,这种颜色之中红色的值最大,没有绿和蓝。并且透明值最大,表示的是完全不透明。
绿色(0,255,0,255),蓝色(0,0,255,255),白色是各种颜色的组合(255,255,255,255),黑色(0,0,0,255),绿色(0,128,0,255),灰色(128,128,128,255),黄色(255,255,0,255)。
在pillow模块提供函数imagecolor.getcolor()#接收一个字符串作为第一个参数,字符串RGBA作为第二个参数
from PIL import ImageColor
ImageColor.getcolor('red','RGBA')#获取颜色的RGBA的值
坐标和box元组
图像的像素使用x和y坐标指定,分别指定像素在图像中的水平和垂直位置,x坐标从右到左逐渐增加,y向下走组件增加,原点使用(0,0)
需多的pillow函数需要创建一个矩形的元祖参数,所以pillow需要四个整坐标的原组,表示图像中的一个区域。顺序分为别是:
- 左:该矩形最左边的x坐标
- 顶:改矩形最左边的y坐标
- 右:表示该矩形最右边一个像素的x坐标,此整数必须比左边的整数大
- 底:该矩形的底边下面一个像素的y坐标,此整数必须比顶边的整数大
图像操作:
fro PIL import Image
catIm=Image.open()#传入图片的路径,也可以是当前路径,直接传入图片名。
catIm.size #包含图片的高度和宽度的像素数
width,height=catPhoto.size#取得高度与宽度
catIm.filename#表示原始文件的文件名
catIm.format#取得文件的格式
catIm.save()#保存文件
im=image.new('RGBA',(100,200),'red')#创建一个image对象,100宽像素,200宽像素,带有红色背景
#注意在没有选择的时候默认是黑色。
croppedIm=catIm.crop((100,100,100,100))#传入元组矩形就是要裁剪的区域,包括左列和顶行的像素但是不包括右列和底行的像素
catCopyIm=catIm.copy()#复制图像
paste()方法调用image图像#第一个参数是一个人'源'image对象,第二参数包含x和y坐标元组,指明源image对象粘贴到image对象时左上角的位置。
catIm.rotate(90).save('1.png')#使用rotate方法旋转。器参数是一个整数是旋转的度数,第二个参数是一个可选参数,expend关键字参数,Ture则会放大图像
catIm.rotate(6,expand=True).save('1.png')
catIm.transpose(Image,FILE_TOPBOTTOM).save('2.png')#像rotate一样会创建一个新的image对象。transpose()方法会得到函数的图像的'镜像翻转
#单个像素的颜色可以通过getpixel和putpixel方法取得和设置,他们都接收一个元组,表示像素的x和y坐标。putpixel方法接受一个元组,作为该像素的颜色。
项目实例
添加徽标
- 载入徽标图像
- 循环遍历工作目标中的所有.png和.jpg文件
- 检查图片是否宽于或者高于300像素
- 如果是,将宽度或高度中的较大的一个减小为300像素,并且按比例缩小的另一个维度
- 在角上添加标徽的头像
- 将改变的图像存入另一个文件夹
代码: - 打开图片文件作为image对象
- 循环遍历os.listdir('.')返回字符串
- 通过size属性获取图像的高度和宽度
- 计算调整后的图像的性高度和宽度
- 调用resize()方法来调整图像的大小
- 调用paste()方法来粘贴徽标
- 调用save()方法保存更改,使用原来的文件名。
import PIL import Image
file_size=300
logo_filename='catlogo.png'
logoIm=Image.open(file_size)
logoWidth,logoHeight=logoIm.size
for filename in os.listdir('.')
if not (filename.endwith(.png) or filename.endwith(.jpg)) or filename == logo_filename:
im=Image.open(filename)
width,height=im.size
if width > file_size and height > file_size
if width > height:
height=int((file_size/width)*height)
width=file_size
else:
width=int((file_size/height)*width)
height=file_size
print('resizing %s...'%(filename))
im=im.resize((width,height))
print('adding logo to %s...' %(filename))
im.paste(logoIm,(width-logoWith,height-logoHeight),logoIm)
im.save(os.path.join('withLogo',filenname))
在图像上绘画
form PIL import Image ImageDrow
im=Image.new('RABA',(200,200),'white')#建立一个新图像
draw=ImageDrow(im)
点:point(xy,fill)#方法绘制单个像素。xy参数表示要绘画的点的列表,该列表表示的是x和y的坐标元组的列表如[(x,y),(x,y)...],fill参数是点的颜色
直线:line(xy,fill,width)#方法绘制一条直线或者一些列的线,xy要么是一个元组列表要么是一个整数列表[x1,y1,x2,y2,...],要么是一个元组列表[(x,y),(x1,y1)],fill参数是颜色是RGBA元组或者颜色名称,width参数是线的宽度,如果为指定则使用缺省参数1
正方形:rectangle(xy,fill,outline)方法绘制一个矩形。xy参数四一个元组矩形,,形式为:(left,top,right,bottom),fill是颜色的可选参数,outline参数是矩形轮廓的颜色。可选的outline参数是矩型轮廓的颜色
椭圆:ellipse(xy,fill,outline)方法绘制一个椭圆,如果椭圆的高度宽度一样该方法就会绘制一个圆,xy参数是一个矩形元组(left,top,right,bottom),表示正好包含该椭圆的矩形。
多边形:polygon(xy,fill,outline)方法绘制任意的多边型。xy参数是一个元组列表,或者是一个整数列表,表示多边形的连接点,fill同样是内部的颜色,outline是多边形的轮廓颜色。
绘制实例:
form PIL import ImagrDrow,Image
im=Imagr.new('RGDA',(200,200),'white')
draw=ImageDraw.Draw(im)
draw.line[(0,0),(199,0),(199,199),(0,199),(0.0),fill='black']
draw.rectangle((20,30,60,60),fill='bule')
draw.ellipse((120,30,160,60),fill='red')
draw.polygon(((57,87),(79,62),(94,62),(120,90),(103,113)),fill='brown')
for i in range(100,200,10)
draw.line([(i,0),(200,i-100)],fill='green')
im.save('drawing.png')
绘制文本
imageDraw对象还有text方法,用于绘制图像上的文本,text()方法含有四个参数,xy,text,fill,和font
- xy参数是俩个整数的元组,指定文本区域的左上角
- test参数是想写入的文本字符串
- 可选参数fill是文本的颜色
- 可选参数front是一个imagefront对象,用于设置文本的颜色字体和大小。
项目例子:
from PIL import Image,ImageDraw,ImageFont
import os
im= Image.new('RGBA',(200,200),'white')
draw=ImageDraw.Draw(im)
draw.txt((20,150),'hello',fill='purple')
fontsFolder='FONT_FOLDER'#e.g.'/Library/Fonts'
arialFont=ImageFont.truetype(os.path.join(fontsFolder,'arial.ttf'),32)
draw.text((100,150),'Howdy',fill='gray',font=arialFont)
im.save('text.png')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构