# -*- coding: utf-8 -*-
'''
PIL库处理颜色 及 图片。分别对应库 ImageColor 和 Image
使用:
图像像素值大小操作: img.resize(()) 注意参数 像素大小是 元组类型()
图像像素值变换: img.point(lambda i : i*2) point()方法可以对图像的像素值进行变换
'''
from PIL import ImageColor #处理颜色
from PIL import Image #处理图片
# =============================================================================
# #颜色操作
# =============================================================================
#获取颜色 ImageColor.getcolor(,) 其中参数'RGBA'是模式
redR=ImageColor.getcolor('RED','RGB') #获取红色(不区分大小写)的RGB值 返回元祖
greeR=ImageColor.getcolor('green','RGBA') #获取绿色的RGBA值,返回元祖
blueR=ImageColor.getcolor('Blue','RGBA') #获取蓝色的RGBA值 返回元祖
blacekR=ImageColor.getcolor('Black','RGBA') #获取黑色色的RGBA值 返回元祖
chocolateR=ImageColor.getcolor('chocolate','RGBA') #获取巧克力色的RGBA值 返回元祖
cornflowerBlueR=ImageColor.getcolor('CornflowerBlue','RGBA') #获取菊蓝色的RGBA值 返回元祖
pinkR=ImageColor.getcolor('Pink','RGBA') #获取粉红色的RGBA值 返回元祖
#print(redR)
#在线计算颜色RGBA值 https://www.rapidtables.com/web/color/RGB_Color.html
# =============================================================================
# #图片操作(.new()新建,.open()打开,.save()保存)
# =============================================================================
#新建图片 Image.new('',(),'') 参数:(模式、像素元祖、背景颜色)
newImg=Image.new('RGBA',(100,200),'purple') #指定背景颜色为 紫色,并直接保存。
#newImg=Image.new('RGBA',(100,200)) #未指定背景色,则默认就是空白透明看不见。
newImg.save('saveNewImg.png') #保存图片 保存后才能显示,否则不。注意中间目录需要存在。
#打开图片 生成图片对象
reba1=Image.open('F:\\SpyderXIANGMUWENJIANJIA\\编程相关\\smtplib邮件相关\\reba1.jpg')
#取像素值
dxxs=reba1.size #对象像素值 注意返回元祖类型(宽、高)
#多重复值像素值
width,high=reba1.size #多重赋值 对象像素值
#取图片地址名称
dxwjmc=reba1.filename #对象文件地址 返回对象文件相对路径名称
#取图片格式
dxwjgs=reba1.format #对象文件格式
#取图片格式描述
dxwjgsms=reba1.format_description #对象格式描述 即jpg 或 png等
#print(dxwjgs)
#print(dxwjgsms)
reba1.save('reba1Save.png') #保存图片对象到文件名,相当于另存为。注意中间目录需要存在。
#剪切图片、复制图片、粘贴图片
reba1=Image.open('reba1.jpg') #打开图片
reba1_W,reba1_H=reba1.size #多重复值获得 reba2图片的宽、高
#剪贴
reba1Crop=reba1.crop((475,188,744,568)) #剪切图片.crop(()) 参数一组元祖像素值:前两个定位左上角,后两个定位右下角
reba1Crop_W,reba1Crop_H=reba1Crop.size #多重复制获得 剪切图片的宽、高。
reba1Crop.save('reba1Crop.png') #保存已剪贴部分的图片
#复制
reba1Copy=reba1.copy() #复制图片.copy()
#粘贴 .paste(,(),) 三个参数:粘贴模板图片、像素位置、张贴模板背景(适用于透明模板背景,指定背景为模板背景,不指定则透明模板背景默认显示成为黑色)
reba1Copy.paste(reba1Crop,(0,0)) #粘贴图片 在reba2Copy上粘贴reba2Crop,粘贴像素位置(0,0)
reba1Copy.paste(reba1Crop,(0,reba1Crop_H)) #粘贴图片 在像素(0,reba2Crop_H)的位置
#reba2Copy.paste(reba2Crop,(0,reba2Crop_H*2),reba2Crop) #第三参数指定粘贴模板背景 非透明模板背景则报错
reba1Copy.save('reba1CopyPaste.png') #保存图片 复制并粘贴后保存图片
#平铺操作 for循环粘贴实现平铺马赛克操作
for w in range(0,reba1_W,reba1Crop_W):
for h in range(0,reba1_H,reba1Crop_H):
reba1Copy.paste(reba1Crop,(w,h))
reba1Copy.save('reba1CopyMSK.png') #保存图片 已做平铺马赛克操作
#调整图片.resize(())、旋转图片.rotate()、镜像图片.transpose()
#调整图片大小操作 .resize(()) 注意参数 像素大小是 元组类型()
reba2=Image.open('F:\\SpyderXIANGMUWENJIANJIA\\编程相关\\smtplib邮件相关\\reba2.jpg')
reba2_W,reba2_H=reba2.size
#改变图片像素大小
reba2Resize=reba2.resize((int(reba2_W*2),int(reba2_H*2))) #注意像素大小是 元组类型
reba2Resize.save('reba2Resize.png') #保存图片 改变像素size大小后的图片
#旋转图片角度操作 .rotate() 参数为旋转度 可选参数expand用来指定扩展图片显示图片四边角
reba2.rotate(90).save('reba2Rotate90.png') #旋转90度 后 保存
reba2.rotate(180).save('reba2Rotate180.png') #旋转180度 后 保存
reba2.rotate(270).save('reba2Rotate270.png') #旋转270度 后 保存
reba2.rotate(350).save('reba2Rotate350.png') #旋转350度 后 保存
reba2.rotate(350,expand=True).save('reba2Rotate350Expand.png') #旋转350度、图片扩张到边角显示出来,后 保存。
#镜像反转图片操作
reba2.transpose(Image.FLIP_LEFT_RIGHT).save('reba2TransposeLR.png') #镜像左右翻转
reba2.transpose(Image.FLIP_TOP_BOTTOM).save('reba2TransposeTB.png') #镜像上下翻转
# =============================================================================
# #示例:
# #结合颜色和图片 来操作: 像素 和 画布画笔
# =============================================================================
#像素操作
#.getpixel(())获取像素 注意参数是 元组类型位置参数
#.putpixel((),())填充像素 注意参数是 元组位置 及 RGBA元组值。
from PIL import Image,ImageColor
newImg_P=Image.new('RGBA',(100,200),'purple') #新建图片,指定背景颜色为 紫色
#newImg=Image.new('RGBA',(100,200)) #未指定背景色,则默认就是空白透明看不见。
pixel_P=newImg_P.getpixel((0,0)) #获取指定位置像素值 RGB值,注意参数是元组类型
#print(pixel_P) #输出指定位置像素值 RGB值
newImg_P.save('SsetPixel.png')
#for循环赋值图片的 前一半的像素值
for x in range(100):
for y in range(100):
newImg_P.putpixel((x,y),(20,165,210)) #设置指定位置像素值 RGB值。注意参数是 元组位置 及 RGBA元组值。
newImg_P.save('SsetPixel_A.png') #保存图片 后才能显示,否则不存在于电脑。
#for循环赋值图片的 后一半的像素值
for x in range(100):
for y in range(100,200):
newImg_P.putpixel((x,y),ImageColor.getcolor('RED','RGBA'))
newImg_P.save('setPixel_B.png')
#画笔操作:画直线line、矩形rectangle、椭圆ellipse、多边形polygon、文字text
#注意:
#直线.line 的轨迹参数是[]列表内多个像素值元祖形式,
#矩形及椭圆 的轨迹参数 是前两个为左上角像素值 和 后两个为右下角像素值
#多边形.polygon 的轨迹参数是()元祖内多个相熟元祖形式
from PIL import Image,ImageDraw,ImageFont
newImg_D=Image.new('RGBA',(200,200),'white') #新建图片,指定背景白色
#newImg.save('SdrawImg.png')
draw=ImageDraw.Draw(newImg_D) #创建画笔,作用于参数图片
#画直线操作draw.line() 参数([],fill颜色,width线型) 其中列表参数是画笔轨迹。
draw.line([(0,0),(199,0),(199,199),(0,199),(100,100)],fill='green',width=10) #画直线操作
draw.rectangle((20,30,60,60),fill='blue',outline='black') #画矩形操作 颜色蓝色,外延线黑色
draw.ellipse((60,60,150,150),fill='pink') #画椭圆操作 颜色粉红色
draw.polygon(((10,100),(50,190),(170,130),(100,60)),fill='brown',outline='black') #画多边形操作
#for循环实现交叉画线段,效果在右上角形成网状
#给定两个像素点轨迹,即:每次循环就单独添加一条线段。
for i in range(100,200,1):
draw.line([(i,0),(200,i-100)],fill='purple')
# print(i)
#定义字体 复制字体地址名称 位于电脑 Windows: C:\Windows\Fonts; On OS X: /Library/Fonts
FONT=ImageFont.truetype('ygyxsziti2.0.ttf',12)
draw.text((150,150),'血皇敖天',fill='black',font=FONT) #如果没有定义字体,注意中文无法输出
newImg_D.save('SdrawImg.png')
PIL模块 像素、图像、画笔等操作相关
最新推荐文章于 2022-06-20 22:43:23 发布