python3图片处理之pillow库使用

安装

pip install pillow

引入

from PIL import Image, ImageFilter, ImageDraw, ImageFont, ImageOps, ImageEnhance
import os

img_dir = "../../files/"
img_gen_dir = os.path.join(img_dir, "gen/")
img_path = os.path.join(img_dir, "1.jpg")

新建Image对象

# 创建一个新的Image对象
img = Image.new(mode="RGB", size=(100, 100), color="#00FF00")

# 图片显示,调用操作系统自带的图片浏览器来打开图片
img.show()

打开图片

# 使用打开的方式创建一个Image对象
img = Image.open(img_path)

print(img)  # <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=690x517 at 0x1BC2F450880>
print(img.width, img.height)  # 690 517
print(img.size)  # (690, 517)
print(img.readonly)  # 1
print(img.format)  # JPEG 图片的格式
print(img.mode)  # RGB 图片的模式 取值RGB、RGBA、CMYK等
print(img.info)  # {'jfif': 257, 'jfif_version': (1, 1), 'dpi': (120, 120), 'jfif_unit': 1, 'jfif_density': (120, 120)} 辅助信息

print(img.getbands())  # ('R', 'G', 'B')
print(img.getbbox())  # (0, 0, 690, 517)

# 图像数据
data = img.getdata()
print(len(data))  # 356730
# 图像中的最小和最大值
print(img.getextrema())  # ((0, 127), (0, 127), (0, 127))

图片压缩保存

# 图片压缩保存
img.save(os.path.join(img_gen_dir, "flower-save.jpg"), optimize=True, quality=80)

图片格式转换

# 图片格式转换
img.save(os.path.join(img_gen_dir, "flower.bmp"), "bmp")

img_new = img.convert(mode="RGBA")
img_new.save(os.path.join(img_gen_dir, "flower-RGBA.png"))

缩略图

# 缩略图
img_thumb = Image.open(img_path)
w, h = img_thumb.size
img_thumb.thumbnail((w // 5, h // 5))
img_thumb.save(os.path.join(img_gen_dir, "flower-thumbnail.jpg"))

图像几何变换

# 图片缩放
size = (200, 200)
img_resize = img.resize(size=size, resample=Image.Resampling.BILINEAR)
img_resize.save(os.path.join(img_gen_dir, "flower-resize.jpg"))  # 200*200

# 图片局部缩放
# resample:可选参数,指图像重采样滤波器,有四种过滤方式,
# BICUBIC(双立方插值法)、NEAREST(最近邻插值法)、BILINEAR(双线性插值法)、LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC。
img_resize = img.resize(size=size, resample=Image.Resampling.BILINEAR, box=(0, 0, 300, 300))
img_resize.save(os.path.join(img_gen_dir, "flower-resize-part.jpg"))  # 200*150

ImageOps.contain(img, size).save(os.path.join(img_gen_dir, "flower-resize-contain.jpg"))  # 200*150
ImageOps.fit(img, size).save(os.path.join(img_gen_dir, "flower-resize-fit.jpg"))  # 200*200
ImageOps.pad(img, size, color="#fff").save(os.path.join(img_gen_dir, "flower-resize-pad.jpg"))  # 200*200

 

# 图像翻转
# Image.FLIP_LEFT_RIGHT:左右水平翻转
# Image.FLIP_TOP_BOTTOM:上下垂直翻转
# Image.ROTATE_90:图像旋转 90 度
# Image.ROTATE_180:图像旋转 180 度
# Image.ROTATE_270:图像旋转 270 度
# Image.TRANSPOSE:图像转置
# Image.TRANSVERSE:图像横向翻转。
img_trans = img.transpose(Image.Transpose.TRANSVERSE)
img_trans.save(os.path.join(img_gen_dir, "flower-transpos.jpg"))


# 图像旋转
# expand:可选参数,表示是否对图像进行扩展,如果参数值为 True 则扩大输出图像,如果为 False 或者省略,则表示按原图像大小输出;
# translate:参数值为二元组,表示对旋转后的图像进行平移,以左上角为原点;
img_rotate = img.rotate(angle=45, resample=Image.Resampling.NEAREST, center=(100, 100), translate=(-50, 50), expand=True, fillcolor="#FF0000")
img_rotate.save(os.path.join(img_gen_dir, "flower-rotate.jpg"))

 

图像调整亮度、对比度、饱和度

# 图像调整亮度、对比度、饱和度
ImageEnhance.Brightness(img).enhance(1.5).save(os.path.join(img_gen_dir, "flower-brighted.jpg"))
ImageEnhance.Contrast(img).enhance(1.5).save(os.path.join(img_gen_dir, "flower-contrasted.jpg"))
ImageEnhance.Color(img).enhance(1.5).save(os.path.join(img_gen_dir, "flower-colored.jpg"))
 

裁剪图像

# 裁剪图像
box = [0, 0, 200, 200]
img_crop = img.crop(box)
img_crop.save(os.path.join(img_gen_dir, "flower-crop.jpg"))

图像分离、合并、混合、拷贝、粘贴

# 图像分离
r, g, b = img.split()
r.save(os.path.join(img_gen_dir, "flower-split-r.jpg"))
g.save(os.path.join(img_gen_dir, "flower-split-g.jpg"))
b.save(os.path.join(img_gen_dir, "flower-split-b.jpg"))


# 图像合并
img_merge = Image.merge(mode="RGB", bands=(g, b, r))
img_merge.save(os.path.join(img_gen_dir, "flower-merge-gbr.jpg"))


# 图像混合
img_blend = Image.blend(im1=img, im2=img_merge, alpha=0.5)
img_blend.save(os.path.join(img_gen_dir, "flower-blend.jpg"))


# 图像拷贝和粘贴
img_copy = img.copy()
img_crop = img_copy.crop((0, 0, 100, 100))
img_new = Image.new("L", (100, 100), 200)
img_copy.paste(img_crop, (100, 100, 200, 200), mask=img_new)
img_copy.save(os.path.join(img_gen_dir, "flower-copy.jpg"))

滤镜

# 滤镜
# 模糊滤镜
img_blur = img.filter(ImageFilter.BLUR)
img_blur.save(os.path.join(img_gen_dir, "flower-filter-blur.jpg"))
# 轮廓图
img_contour = img.filter(ImageFilter.CONTOUR)
img_contour.save(os.path.join(img_gen_dir, "flower-filter-contour.jpg"))
# 边缘检测
img_edge = img.filter(ImageFilter.FIND_EDGES)
img_edge.save(os.path.join(img_gen_dir, "flower-filter-edge.jpg"))
# 浮雕图
img_emboss = img.filter(ImageFilter.EMBOSS)
img_emboss.save(os.path.join(img_gen_dir, "flower-filter-emboss.jpg"))
# 平滑图
img_smooth = img.filter(ImageFilter.SMOOTH)
img_smooth.save(os.path.join(img_gen_dir, "flower-filter-smooth.jpg"))

添加文字水印、边框

# 添加文字水印
img_copy = img.copy()
draw = ImageDraw.Draw(img_copy)
font = ImageFont.truetype("arial.ttf", 30)
draw.text((10, 10), "Hello World!", font=font, fill=(255, 255, 0))
img_copy.save(os.path.join(img_gen_dir, "flower-watermark.jpg"))


# 添加边框
img_border = ImageOps.expand(img, border=10)
img_border.save(os.path.join(img_gen_dir, "flower-border.jpg"))
  

像素操作

# 修改像素
pixels = img.load()
for i in range(img.width):
    for j in range(img.height):
        r, g, b = pixels[i, j]
        pixels[i, j] = int(r * 0.5), int(g * 0.5), int(b * 0.5)
img.save(os.path.join(img_gen_dir, "flower-pixel.jpg"))


# 单个像素
img_new = Image.new("RGB", (100, 100), 0xFFFFFF)
print(img_new.getpixel((50, 50)))  # (255, 255, 255)
img_new.putpixel((50, 50), 0xFF0000)
img_new.save(os.path.join(img_gen_dir, "flower-pixel-single.jpg"))


# 处理图像中的每一个像素点
img_eval = Image.eval(img, lambda c: c * 0.8)
img_eval.save(os.path.join(img_gen_dir, "flower-pixel-eval.jpg"))
posted @ 2024-01-10 16:51  carol2014  阅读(28)  评论(0编辑  收藏  举报