大家好,今天要教大家一个超实用的技能 —— 使用Pillow库来批量处理图片。无论是调整图片大小、添加水印,还是批量格式转换,都能轻松搞定!让我们一起进入图片处理的奇妙世界吧!

一、准备工作

首先安装Pillow库:

1

pip install Pillow

小贴士:Pillow是PIL(Python Imaging Library)的一个分支,但功能更强大、维护更活跃。

二、基础图片操作

让我们从最基本的图片操作开始:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

from PIL import Image, ImageDraw, ImageFont

import os

def basic_image_ops(image_path):

    """

    基础图片操作示例

    """

    # 打开图片

    img = Image.open(image_path)

     

    # 获取图片信息

    print(f"图片大小:{img.size}")

    print(f"图片格式:{img.format}")

    print(f"图片模式:{img.mode}")

     

    # 调整大小

    resized_img = img.resize((800, 600))

     

    # 旋转图片

    rotated_img = img.rotate(45, expand=True)

     

    # 裁剪图片

    cropped_img = img.crop((100, 100, 500, 500))  # (左, 上, 右, 下)

     

    # 保存处理后的图片

    resized_img.save('resized.jpg')

    rotated_img.save('rotated.jpg')

    cropped_img.save('cropped.jpg')

# 使用示例

basic_image_ops('example.jpg')

三、批量调整图片大小

在电商工作中,经常需要把产品图片统一调整为特定尺寸:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

def batch_resize_images(input_folder, output_folder, size=(800, 600)):

    """

    批量调整图片大小

    :param input_folder: 输入文件夹路径

    :param output_folder: 输出文件夹路径

    :param size: 目标尺寸(宽,高)

    """

    # 确保输出文件夹存在

    if not os.path.exists(output_folder):

        os.makedirs(output_folder)

     

    # 支持的图片格式

    supported_formats = {'.jpg', '.jpeg', '.png', '.bmp'}

     

    success_count = 0

    fail_count = 0

     

    for filename in os.listdir(input_folder):

        if any(filename.lower().endswith(fmt) for fmt in supported_formats):

            try:

                # 打开图片

                image_path = os.path.join(input_folder, filename)

                img = Image.open(image_path)

                 

                # 保持纵横比调整大小

                img.thumbnail(size, Image.Resampling.LANCZOS)

                 

                # 保存处理后的图片

                output_path = os.path.join(output_folder, filename)

                img.save(output_path, quality=95)

                 

                success_count += 1

                print(f"成功处理:{filename}")

                 

            except Exception as e:

                fail_count += 1

                print(f"处理失败 - {filename}: {str(e)}")

     

    print(f"\n处理完成!成功:{success_count},失败:{fail_count}")

# 使用示例

batch_resize_images('input_images', 'output_images', (1024, 768))

四、添加水印

保护图片版权,给图片添加水印:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

def add_watermark(image_path, watermark_text, output_path):

    """

    给图片添加文字水印

    """

    # 打开图片

    img = Image.open(image_path)

     

    # 创建绘图对象

    draw = ImageDraw.Draw(img)

     

    # 加载字体(请确保字体文件存在)

    try:

        font = ImageFont.truetype('arial.ttf', 36)

    except:

        font = ImageFont.load_default()

     

    # 计算水印位置(右下角)

    text_width = draw.textlength(watermark_text, font=font)

    text_height = 36

    x = img.width - text_width - 20

    y = img.height - text_height - 20

     

    # 添加半透明文字

    draw.text(

        (x, y),

        watermark_text,

        fill=(255, 255, 255, 128),  # 白色,半透明

        font=font

    )

     

    # 保存图片

    img.save(output_path)

# 批量添加水印

def batch_add_watermark(input_folder, output_folder, watermark_text):

    """

    批量给图片添加水印

    """

    if not os.path.exists(output_folder):

        os.makedirs(output_folder)

         

    for filename in os.listdir(input_folder):

        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):

            input_path = os.path.join(input_folder, filename)

            output_path = os.path.join(output_folder, f"watermarked_{filename}")

            add_watermark(input_path, watermark_text, output_path)

五、高级技巧

1. 图片格式转换

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

def convert_format(input_path, output_format):

    """

    转换图片格式

    :param input_path: 输入图片路径

    :param output_format: 目标格式(如'PNG')

    """

    img = Image.open(input_path)

     

    # 如果是PNG,保持透明通道

    if output_format.upper() == 'PNG':

        if img.mode in ('RGBA', 'LA'):

            output_path = input_path.rsplit('.', 1)[0] + '.png'

            img.save(output_path, output_format)

            return

     

    # 转换为RGB模式(去除透明通道)

    rgb_img = img.convert('RGB')

    output_path = input_path.rsplit('.', 1)[0] + '.' + output_format.lower()

    rgb_img.save(output_path, output_format)

2. 图片优化

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

def optimize_image(input_path, output_path, max_size_kb=500):

    """

    优化图片大小,控制在指定KB以内

    """

    img = Image.open(input_path)

    quality = 95

     

    while True:

        img.save(output_path, quality=quality)

        size_kb = os.path.getsize(output_path) / 1024

         

        if size_kb <= max_size_kb or quality <= 5:

            break

             

        quality -= 5

    print(f"优化完成:{size_kb:.2f}KB,质量:{quality}")

练习小任务

尝试实现以下功能:

  • 给图片添加图片水印
  • 批量为图片添加边框
  • 制作图片缩略图画廊
  • 图片色彩增强

实用技巧

  • 处理大量图片时注意内存使用
  • 保持原图备份
  • 注意图片质量和文件大小的平衡
  • 使用多线程提高处理速度

小结

今天我们学习了:

  • 基础图片操作
  • 批量调整图片大小
  • 添加水印
  • 格式转换和优化

掌握了这些技能,你就能轻松处理各种图片任务了!记住,实践出真知,多动手试试不同的参数和效果!


 

更多推荐