Pillow图像处理

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))                                   # 保存到指定文件夹
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值