Python库pillow较为全面的使用例子
*****************************************2023年08月15日09:15:15***************************************************
pillow裁剪
from PIL import Image # 假设你有一个PIL格式的图像对象 pillow_image # 假设 left、top 是左上角坐标,right、bottom 是右下角坐标 left = 100 top = 150 right = 300 bottom = 400 # 使用crop()方法对图像进行裁剪 cropped_image = pillow_image.crop((left, top, right, bottom)) # 显示裁剪后的图像 cropped_image.show()
******************************************************************
一,打开图片并查看图片基本信息(Image)
#coding=utf-8
from PIL import Image
#打开本地图片
image = Image.open("../input/2.jpg")
print(image) #<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2190x2964 at 0x1DB25E0F518>
#显示图片
# image.show()
#查看图片信息
print("文件名:" + image.filename) #文件名:../input/2.jpg
print("文件格式:" + image.format) #JPEG
print("文件色彩模式:" + image.mode) #RGB
print("文件名大小(尺寸):" + str(image.size)) #(2190, 2964)
print("文件信息:" + str(image.info))
二,图像通道分离与合并(Image)
#coding=utf-8
from PIL import Image
image1 = Image.open("../input/1.png")
image2 = Image.open("../input/3.jpg")
image2 = image2.resize(image1.size)
#分离图像的三通道信息
r1,g1,b1 = image1.split()
r2,g2,b2 = image2.split()
tmp = [r1,g2,b1]
#通道合并
img = Image.merge("RGB",tmp)
# img.show()
三,图像通道混合(Image)
#coding=utf-8
from PIL import Image
##透明度混合处理
# 0--原图1 1--原图2
# img1 = Image.open("../input/1.png").convert(mode = "RGB")
# img2 = Image.new("RGB",img1.size,"red")
# #混合两张图像
# Image.blend(img1,img2,alpha=0.5).show()
##遮罩混合
#composite(img1,img2,mask) 三张图像的大小要一致
img1 = Image.open("../input/1.png")
img2 = Image.open("../input/3.jpg")
img2 = img2.resize(img1.size)
#分离三通道
r,g,b = img2.split()
Image.composite(img2,img1,b).show()#2遮在1上
四,图像尺寸调整(Image)
#coding=utf-8
from PIL import Image
#指定图片大小
img_resize = image.resize((200,200),Image.NEAREST)
img_resize.save("../out/更改图片大小.jpg")
#动态更改图片大小,缩小一半
img_resize2 = image.resize((int(image.width/2),int(image.height/2)),Image.NEAREST)
img_resize2.save("../out/动态更改图片大小.jpg")
#图像缩放
#eval(image,fun) 将函数fun作用于image图像中的每一个像素点
#[例子]图像每个像素值*2,rgb值扩大2倍
# suofang_img = Image.eval(image,lambda i:i*2).show()
#原生缩放图像--直接作用于原图(返回一个不大于给定尺寸的不改变图像比例的IMAGE对象)
suofang1_img = image.copy()
suofang1_img.thumbnail((220,100))
# suofang1_img.show()
五,图像旋转(Image)
#coding=utf-8
from PIL import Image
image = Image.open("../input/1.png")
# #逆时针旋转60度
image.rotate(60).save("../out/正旋转60度.jpg")
# #顺时针旋转60度
image.rotate(-60).save("../out/反旋转60度.jpg")
# #旋转后拓展图片大小
image.rotate(60,Image.NEAREST,True).save("../out/拓展图片的逆60度.jpg")
六,图像格式转换(Image)
#图像格式转换
"""
L:灰度图像--黑白,灰色
RGB:真彩色图像--屏幕显示
CMTK:出版图像--需要外界光源照射才能看的图像
"""
##图像像素模式变换
#模式参考网址:https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-modes
# change_image = image.copy()
# #一位像素图
change_image.convert("1").save("../out/一位像素图.png",quality = 100)
# #八位灰度图
change_image.convert("L").save("../out/八位灰度图.png",quality = 100)
# #八位彩图
change_image.convert("P").save("../out/八位彩图图.png",quality = 100)
#显示格式转换
"""
PIL.Image.FLIP_LEFT_RIGHT 左右镜像
PIL.Image.FLIP_TOP_BOTTOM 上下镜像
PIL.Image.ROTATE_90 旋转90
PIL.Image.ROTATE_180 旋转180
PIL.Image.ROTATE_270 旋转270
PIL.Image.TRANSPOSE 颠倒顺序
"""
# image.transpose(Image.FLIP_LEFT_RIGHT).show()
# image.transpose(Image.FLIP_TOP_BOTTOM).show()
image.transpose(Image.TRANSPOSE).show()
七,图像数据剪切-复制-粘贴(Image)
#coding=utf-8
from PIL import Image
image = Image.open("../input/1.png")
"""
Image.crop(box = None)
box是一个四元组,代表左上右下四个坐标点
Image.paste(img,box = None,mask = None) 原图,粘贴区域,遮罩
box分为三种情况:
1.左上角对齐:(x1,y1)对齐左上角,其余部分被抛弃
2.固定粘贴区域:(x1,y1,x2,y2)
3.原图粘贴:None
"""
#复制图片
jianqie_img = image.copy()
zhantie_img = image.copy()
#剪切图片
region = jianqie_img.crop((5,10,1200,1200))
#粘贴图片
zhantie_img.paste(region,(30,30)) #左上角对齐
zhantie_img.show()
八,图像滤镜效果(Image,ImageFilter)
#coding=utf-8
from PIL import Image,ImageFilter
# image = Image.open("../input/1.png")
# temp = image.filter(ImageFilter.GaussianBlur)
# temp.show()
##滤镜效果参数多,用的时候现查即可
#[滤镜特效使用案例]
image = Image.open("../input/1.png")
w,h = image.size
#创建图像显示区域
img_output = Image.new("RGB",(2*w,h))
#左边放原图
img_output.paste(image,(0,0))
#创建滤镜列表
filts = []
filts.append(ImageFilter.EDGE_ENHANCE) #边缘强化滤镜
filts.append(ImageFilter.FIND_EDGES)#显示边缘滤镜
filts.append(ImageFilter.GaussianBlur) #高斯模糊滤镜
for fltr in filts:
r = image.filter(fltr)
img_output.paste(r,(w,0))
img_output.show()
九,图片通道合成(像素级)(Image,ImageChops)
#coding=utf-8
from PIL import Image,ImageChops
image1 = Image.open("../input/1.png")
image2 = Image.open("../input/3.jpg")
##像素加法运算 out = ((image1 + image2)/scale + offset)
ImageChops.add(image1,image2).show()
##像素减法运算 out = ((image1 - image2)/scale + offset)
ImageChops.subtract(image1,image2).show()
##变暗运算 out = min(image1,image2)
ImageChops.darker(image1,image2).show()
##变亮运算 out = max(image1,image2)
ImageChops.lighter(image1,image2).show()
##叠加运算 out = image1*image2/MAX
ImageChops.multiply(image1,image2).show()
##屏幕运算,先反色后叠加,相当于两台投影仪投一个地方效果 out = MAX-((MAX-image1)*(MAX-image2)/MAX)
ImageChops.screen(image1,image2).show()
##反色运算,底片效果 out = MAX-image
ImageChops.invert(image1).show()
##比较运算,两张图片像素差值结果图 out = abs(image1 - image2)
ImageChops.difference(image1,image2).show()
十,图片色彩,亮度,对比度,清晰度调整(Image,ImageEnhance)
#coding=utf-8
from PIL import Image,ImageEnhance
image1 = Image.open("../input/1.png")
w,h = image1.size
img_out = Image.new("RGB",(5*w,h))
img_out.paste(image1,(0,0))
##色彩调整 ImageEnhance.Color(image)
img_color = ImageEnhance.Color(image1)
imgb = img_color.enhance(1.5) #增强色彩
img_out.paste(imgb,(w,0))
##对比度调整 ImageEnhance.Constract(image)
img_cons = ImageEnhance.Contrast(image1)
imgc = img_cons.enhance(10)
img_out.paste(imgc,(2*w,0))
##亮度调整 ImageEnhance.Brightness(image)
img_bri = ImageEnhance.Brightness(image1)
imgd = img_bri.enhance(2)
img_out.paste(imgd,(3*w,0))
##清晰度调整,锐化/钝化 ImageEnhance.Sharpness(image)
#0~2 0--模糊对象 1--原图 2--锐化对象
img_sha = ImageEnhance.Sharpness(image1)
imge = img_sha.enhance(2)
img_out.paste(imge,(4*w,0))
# img_out.show()
十一,图片中二维图像绘制以及文字键入(Image,ImageDraw,ImageFont)
#coding=utf-8
from PIL import Image,ImageDraw,ImageFont
image1 = Image.open("../input/1.png")
"""
绘制时需要首先创建一个画笔对象
drawObject = ImageDraw.Draw(image)
常用绘制如下:
1.绘制直线:drawObject.line([x1,y1,x2,y2],fill=None,width=0,joint=None)
fill--线条颜色 width--线条宽度 joint--线的联合类型(用时查,可以为曲线)
2.绘制圆弧:drawObject.arc([x1,y1,x2,y2],start,end,fill=None,width=0)
start--起始角度 end--终止角度
3.绘制椭圆:drawObject.ellipse([x1,y1,x2,y2],fill=None,outline=None,width=0)
outline--表示只规定圆的颜色
4.绘制弦:drawObject.chord([x1,y1,x2,y2],start,end,fill=None,outline=None,width=0)
5.绘制扇形:drawObject.pieslice([x1,y1,x2,y2],start,end,fill=None,outline=None,width=0)
6.绘制多边形:drawObject.polygon([x1,y1,x2,y2....],fill=None,outline=None)
7.绘制矩形:drawObject.rectangle([x1,y1,x2,y2],fill=None,outline=None,width=0)
8.绘制文字:drawObject.text(position,text,fill=None,font=None,anchor=None,spacing=0
,align="left",direction=None,features=None,language=None)
poistion--二元组文字位置 spacing--行之间的像素数 align--对齐方式(left,center,right)
direction--文字方向(rtl-从右到左 ltr-从左到右 ttb-从上到下)
9.绘制点:drawObject.point(xy,fill=None)
"""
##使用案例
image = Image.new("RGB",(300,200),"white")
#画一个矩形
drawer = ImageDraw.Draw(image)
drawer.rectangle((50,50,150,150),outline="red",fill="blue")
#显示汉字
font = ImageFont.truetype("../input/simhei.ttf",30)
drawer.text((100,100),u"北京欢迎你",fill="green",font=font)
# image.show()
【应用一】制作不同透明度的图片
#coding=utf-8
from PIL import Image,ImageDraw,ImageFilter #画笔 滤镜
##读入图片为image对象
im_rgb = Image.open("../input/1.png")
##设置为半透明 推荐阿尔法通道,0-255
# im_rgba = im_rgb.copy()
# im_rgba.putalpha(128)
# im_rgba.save("../out/半透明图片.png")
##切出形状透明
im_a = Image.new("L",im_rgb.size,255) #八位的黑白图格式,初始化为跟原图大小一样的白底图,白色代表不透明,黑色代表透明
draw = ImageDraw.Draw(im_a) #生成一个画笔
draw.rectangle((200,100,300,200),fill = 0,outline = 0 ) #fill = 0为纯黑色
##到此生产的是一张白底然后在固定位置有一个透明方块的图
# draw.ellipse((200,100,300,200),fill=0)
# im_a.save("../out/")
im_rgba = im_rgb.copy()
im_rgba.putalpha(im_a) #将具有透明方块的底图作为阿尔法偏移给图,就会将固定位置填充为黑色方块
# im_rgba.save("../out/有透明方块的原图.png")
#高斯羽化 边界模糊
im_a_blur = im_a.filter(ImageFilter.GaussianBlur(10))
im_rgba.putalpha(im_a_blur)
im_rgba.save("../out/高斯羽化后且偏移的原图.png")
【应用二】特定颜色转换
#coding=utf-8
from PIL import Image,ImageDraw,ImageFont,ImageFilter
image = Image.open("../input/1.png")
drawer = ImageDraw.Draw(image)
def get_color(oldcolor):
"""
黄色(255,255,0)只需要将绿色通道设置为0即可
"""
# print(oldcolor)
if oldcolor[0]>60 and oldcolor[1]>60:
return (oldcolor[0],0,oldcolor[2])
else:
return oldcolor
for x in range(image.width):
for y in range(image.height):
drawer.point((x,y),fill=get_color(image.getpixel((x,y)))) #逐个像素遍历,效率较低
image.show()
【应用三】实现特定后缀文件的批处理
import os
import glob
files = glob.glob("/*.jpg")
for file in files:
img = Image.open(file)
img_resize = img.resize((int(img.width/2),int(img.height/2)))
ftitle,fext = os.path.splitext(file)
img_resize.save(ftitle + "_half" + fext)
【应用四】生成随机4字母验证码
#coding=utf-8
from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random
width = 100
height = 100
img = Image.new("RGB",(width,height),(255,255,255))
draw = ImageDraw.Draw(img)
def get_color():
return (random.randint(200,255),random.randint(200,255),random.randint(200,255))
def get_char():
return chr(random.randint(65,90))
for x in range(width):
for y in range(height):
draw.point((x,y),fill=get_color())
font = ImageFont.truetype("../input/simhei.ttf",36)
for i in range(4):
draw.text((10+i*20,50),get_char(),font=font,fill=(255,0,0))
#绘制干扰线
for i in range(2):
draw.line(((10,10),(80,80)),fill=(0,255,0),width = 3)
img.show()
【应用五】抓取全屏/指定区域 截图
#coding=utf-8
from PIL import ImageGrab
##全屏抓取 ImageGrab.grab()返回image对象
# ImageGrab.grab().save("../out/全屏抓取.jpg")
##指定范围抓取 (x,y,x+w,y+h) x,y是左上角坐标 x+w,y+h是右下角坐标 image rgb格式
img = ImageGrab.grab(bbox=(10,100,800,800))
img.save("../out/指定范围抓取.jpg")
【应用六】实现粘贴板图片数据导出
#coding=utf-8
from PIL import Image, ImageGrab
im = ImageGrab.grabclipboard()
if isinstance(im, Image.Image):
print("Image: size : %s, mode: %s" % (im.size, im.mode))
im.save("grab_grabclipboard.jpg")
elif im:
for filename in im:
try:
print("filename: %s" % filename)
im = Image.open(filename)
except IOError:
pass # ignore this file
else:
print("ImageList: size : %s, mode: %s" % (im.size, im.mode))
else:
print("clipboard is empty.")
【应用七】实现excel中表数据转为图片并导出
# -*- coding:utf-8 -*-
import re
import win32com.client as win32
from PIL import ImageGrab,Image
import time
from ctypes import windll
def clear():
if windll.user32.OpenClipboard(None): # 打开剪切板
windll.user32.EmptyClipboard() # 清空剪切板
windll.user32.CloseClipboard() # 关闭剪切板
def RGB(r,g,b):
bgr = (b, g, r)
strValue = '%02x%02x%02x' % bgr
# print(strValue)
iValue = int(strValue, 16)
return iValue
def savepic(path,sheet, data,name):
excel = win32.DispatchEx('Excel.Application')
try:
clear()
# excel = win32com.client.Dispatch()
# 后台运行, 不显示, 不警告
excel.Visible=False
excel.DisplayAlerts = False
wb = excel.Workbooks.Open(path)
ws = wb.WorkSheets(sheet)
print('打开excel',path)
ws.Range(data).Interior.Color = RGB(249,251,238)# 区域背景添加米黄色,背景颜色可以改变
ws.Range(data).ClearComments()
ws.Range(data).CopyPicture() # 选择复制区域
print('复制选择区',data)
time.sleep(1)
ws.Paste(ws.Range('A70')) # 变成图片,放到指定位置便于获取
print('数据变成图片')
time.sleep(1)
pic = ws.pictures[0] #获取到转换后的图片数据
time.sleep(1)
pic.Copy()
time.sleep(1)
img = ImageGrab.grabclipboard() #从粘贴板获取到图片数据
if img.mode == "P":
img = img.convert('RGB')
else:
pass
img.save(name) #将图片数据导出
im = Image.open(name)
p = Image.new('RGB', im.size, (255, 255, 255))
x, y = im.size
p.paste(im, (0, 0, x, y), im)
p.save(name)
pic.Delete()
print('保存图片',name)
clear() #清空粘贴板
except:
print('图片制作失败')
finally:
wb.Save()
wb.Close()
if __name__ == '__main__':
path = 'C:/Users/Administrator/Desktop/全业务/创新/通报工作2022-4-6/source_data/model.xlsx'
sheet = '获取数据'
data = "A2:C4"
picname = 'C:/Users/Administrator/Desktop/全业务/创新/通报工作2022-4-6/temp_data/res.png'
savepic(path=path, sheet=sheet, data=data, name=picname)
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/16399440.html,如有侵权联系删除
分类:
PIL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧