RGBA解释:A代表第三个参数,透明度
RGBA 值是一组数字,指定顔色中的红、绿、蓝和 alpha(透明度)的值。
在 Pillow 中,RGBA 值表示为四个整数值的元组。例如,红色表示为(255,0,0,255)。
from PIL import Image #导入模块
Pillow 的模块名称是 PIL
备注(tkinter库中的Image会有冲突)2022.3.13发现,
解决方法
import PIL
PIL.Image.open( ) 使用
备注:
由于 Pillow 的创建者设计 Pillow 模块的方式,你必须使用 from PIL import Image 形式的 import 语句,而不是简单地 import PIL。
读取图片属性:
from PIL import Image
catT = Image.open('zophie.jpg') # 加载图片
print(catT.size) # 获得图片尺寸
width, height = catT.size # 用两个变量接收长 和高尺寸元组数值
print(width)
print(height)
# --------------------------------------------------------
print(catT.filename) # 获得图片名称
print(catT.format) # 获得图片的格式
print(catT.format_description) # 获取图片格式和描述
catT.save('zophie.png') # 保存图片png格式,相当于转换格式
创建图片:
from PIL import Image
im = Image.new('RGBA', (200, 200), 'red') # 创建图片,RGBA模式,图片尺寸,图片背景颜色red红色
im.save('1.png')
im2 = Image.new('RGBA', (220, 220)) # 创建图片,RGBA模式,图片尺寸,第三个参数没写,不可见的黑色,代表透明
im2.save('2.png') # 创建颜色是png格式才可以
1.图片裁剪:crop()函数
from PIL import Image
catT = Image.open('zophie.jpg') # 加载图片
Im = catT.crop((241, 26, 341, 126)) # 裁剪图像,第一个和第二个参数,X,Y起点坐标,第三和第四个裁剪终点坐标
Im.save('裁剪后图.png') # 裁剪保留原图,不变,创建新的裁剪后图
2.复制黏贴,将剪切图到复制图中 copy()复制图片函数; paste()输出黏贴函数,相当于贴水印
from PIL import Image
cat_y = Image.open('zophie.png') # 加载图片,赋值给cat_y
cat_c = cat_y.copy() # 复制图片,到参数cat_c
jianqie = cat_y.crop((241, 26, 341, 126)) # 剪切图片
print(jianqie.size) # 输出剪切图片尺寸
cat_c.paste(jianqie, (0, 0)) # 将剪切图黏贴到,复制的cat_c中,第一个坐标0,0,起始坐标
cat_c.paste(jianqie, (100, 200)) # 第二次复制剪切图
cat_c.save('复制后图.png') # 保存复制后图片为png图
3.图像调整大小:resize()函数
from PIL import Image
catIm = Image.open('zophie.png') # 加载图片,赋值给cat_y
width, height = catIm.size # 元组赋值法:用2个函数接收图像尺寸赋值
img = catIm.resize((int(width / 2), int(height / 2))) # 按比例将图片缩小一半除以2
img.save('调整大小1.png')
img = catIm.resize((width, height + 300)) # 只将高度增加300px
img.save('调整大小2.png')
备注:我们将 catIm.size 元组中的两个值赋给变量 width 和 height。使用 width和 height,
而不是 catIm.size[0]和 catIm.size[1],让接下来的代码更易读
备注:resize()方法的元组参数中只允许整数,这就是为什么需要用 int()调用对两个除以 2 的值取整
【图像缩小,防止失真:PIL带ANTIALIAS滤镜缩放结果,加入:Image.ANTIALIAS参数】
代码改造: img = img.resize((width, height),Image.ANTIALIAS)
4.图像旋转,和镜像翻转
from PIL import Image
catIm = Image.open('zophie.png') # 加载图片,赋值给cat_y
catIm.rotate(90).save('旋转1.png') # 逆时针,旋转90度,
catIm.rotate(180).save('旋转2.png') # 逆时针,旋转180度
catIm.rotate(270).save('旋转3.png') # 逆时针,旋转270度
# 画布撑大,expand=True
# 逆时针,旋转39度,添加expand参数接受图片框架被撑大,改变整体画布大小
catIm.rotate(39, expand=True).save('旋转1.png')
catIm.rotate(39).save('旋转1.png') # 逆时针,旋转39度,无expand参数,整体画布保持不变!
# 镜像翻转
catIm.transpose(Image.FLIP_LEFT_RIGHT).save('水平镜像翻转.png') # 水平镜像翻转
catIm.transpose(Image.FLIP_TOP_BOTTOM).save('垂直镜像翻转.png') # 垂直镜像翻转
5.更改单个像素getpixel()函数 和putpixel()函数
from PIL import Image
im = Image.new('RGBA', (100, 100))
print(im.getpixel((0, 0))) # 获取0,0坐标颜色值
for x in range(100): # 嵌套循环for range(100)是0-99范围内
for y in range(50):
print(x, y)
im.putpixel((x, y), (210, 210, 210)) # 给图片上色
from PIL import ImageColor # 导入ImageColor模块来获取颜色单词名称
for x in range(100):
for y in range(50, 100):
im.putpixel((x, y), ImageColor.getcolor('darkgray', 'RGBA'))
im.save('putPixel.png')
6.im.save( )相关参数
6.1.关于DPI参数
DPI值仅为计算机图像上的元数据。作用是给出了如何显示或打印图像的参数。简单而言:DPI设置是建议图像的缩放级别。修改DPI不会改变图像的内容。如果您想要较大的图像,则修改生成的图片大小,而不是从dpi方面解决。
draw = ImageDraw.Draw(im, 'CMYK') #绘制文件
im.save("D:/target.jpg", dpi=(300.0, 300.0)) #保存文件
6.2.Pillow Image.save 保存为jpg图片压缩
在使用Pillow中的Image.save()方法,使用默认参数保存jpg图片的过程中发现图片被压缩的很严重,导致原来很大的大小变成几十K。这是因为在保存为jpg的过程中,内部使用压缩算法对图片进行的压缩处理。
但是有些时候往往需要图片的大小不能变化太大或不能太小。所以在使用此方式时可以加入参数:
im.save(img_name, quality=95) # 推荐95最佳
quality参数: 保存图像的质量,值的范围从1(最差)到95(最佳)。 默认值为75,使用中应尽量避免高于95的值; 100会禁用部分JPEG压缩算法,并导致大文件图像质量几乎没有任何增益。
==im.save( )==方法还有一个可以配合quality使用的参数,能够大大增加图片大小
im.save(img_name, quality=95, subsampling=0)
可能的子采样值是0,1和2,对应于4:4:4,4:2:2和4:1:1(或4:2:0?)。经过实践将值设为0便可以满足图片大小增大的需求。
注意: 以上方法的参数只针对于保存为JPG/JPEG格式的图片的情况。
实战案例:
import os
from PIL import Image
global width, height
SIZE_800 = 800
os.makedirs('Logo水印后文件夹', exist_ok=True) # 用os新建文件夹
logoIm = Image.open('catlogo.png') # 登录水印图片
logoWidth, logoHeight = logoIm.size # 接收水印图尺寸并赋值
# for遍历当前文件夹中所有文件,用.表示当前文件夹
for wenjian in os.listdir('.'):
if not (wenjian.endswith('.png') or wenjian.endswith('.jpg')) or wenjian == 'catlogo.png':
continue # 跳过非图像文件和徽标文件本身
im = Image.open(wenjian) # filename为读取文件全名
print(im)
width, height = im.size
if width > SIZE_800 and height > SIZE_800: # 判断读取的图片是否大于800px
if width > height:
height = int((SIZE_800 / width) * height)
width = SIZE_800
else:
width = int((SIZE_800 / height) * width)
height = SIZE_800
print('Resizing %s...' % (wenjian))
im = im.resize((width, height)) # 调整图片大小
print('Adding logo to %s...' % (wenjian))
# 黏贴图片,黏贴水印 ,第一个参数,黏贴的水印第二个参数,黏贴的坐标位置,第三个参数,遮罩,透明图像
im.paste(logoIm, (width - logoWidth, height - logoHeight), logoIm)
im.save(os.path.join('Logo水印后文件夹', wenjian)) # 保存到指定文件夹