编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • ScriptHub 脚本工具箱
  • Python

  • Shell-Bash

  • 工具脚本

    • 工具脚本速查
    • 哈希校验
    • Base64编码
    • AES加解密
    • RSA签名验签
    • JWT令牌
    • JSON与YAML
    • XML与CSV
    • 编码转义
    • 图片转换
      • 一、Pillow 基础
        • 1.1 格式转换
        • 1.2 尺寸调整与缩略图
        • 1.3 图片压缩
      • 二、批量处理
      • 三、高级操作
    • 文档转换
    • 批量重命名
    • 分割合并
    • 目录同步
    • 文件监控
    • 压缩归档
    • 文件去重
    • cURL速查
    • HTTP调试
    • 端口DNS
    • 抓包代理
  • ScriptHub
  • 工具脚本
杨充
2023-03-12
目录

图片转换

# 图片转换

Pillow(PIL) 格式互转 JPEG↔PNG↔WebP、压缩质量、尺寸调整、缩略图、批量转换目录。

# 一、Pillow 基础

pip install Pillow
1

# 1.1 格式转换

#!/usr/bin/env python3
from PIL import Image

# ---- 单个转换 ----
img = Image.open('photo.png')

# PNG → JPEG
img_rgb = img.convert('RGB')      # PNG 有透明通道,JPEG 需先转 RGB
img_rgb.save('photo.jpg', quality=85)

# PNG → WebP
img.save('photo.webp', quality=80)

# JPEG → PNG
img = Image.open('photo.jpg')
img.save('photo.png')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 1.2 尺寸调整与缩略图

#!/usr/bin/env python3
from PIL import Image

img = Image.open('photo.jpg')
print(f"原始尺寸: {img.size}")  # (4000, 3000)

# ---- 按宽度等比缩放 ----
w_percent = 800 / img.width
h_size = int(img.height * w_percent)
resized = img.resize((800, h_size), Image.LANCZOS)
resized.save('photo_800.jpg')

# ---- 缩略图(保持比例,裁剪到目标尺寸以内)----
img.thumbnail((300, 300))
img.save('thumb.jpg')

# ---- 裁剪——正方形头像 ----
min_dim = min(img.size)
left = (img.width - min_dim) // 2
top = (img.height - min_dim) // 2
img.crop((left, top, left + min_dim, top + min_dim)).save('avatar.jpg')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 1.3 图片压缩

#!/usr/bin/env python3
"""图片压缩——减小体积但保持可观画质"""
from PIL import Image
import os

def compress_image(input_path, output_path, max_size_kb=200, quality=85):
    """迭代压缩直到文件 < max_size_kb"""
    img = Image.open(input_path)
    if img.mode in ('RGBA', 'P'):
        img = img.convert('RGB')

    while quality > 10:
        img.save(output_path, 'JPEG', quality=quality, optimize=True)
        size_kb = os.path.getsize(output_path) / 1024
        if size_kb <= max_size_kb:
            break
        quality -= 5

    print(f"压缩完成: {os.path.getsize(input_path)/1024:.0f}KB → "
          f"{os.path.getsize(output_path)/1024:.0f}KB (quality={quality})")

# compress_image('large.jpg', 'compressed.jpg', max_size_kb=200)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 二、批量处理

#!/usr/bin/env python3
"""批量图片格式转换 + 缩放——递归处理整个目录"""
from PIL import Image
from pathlib import Path
import sys, os

def batch_convert(input_dir, output_dir, out_format='webp',
                  max_width=1200, quality=80):
    """递归转换目录下所有图片"""
    input_dir = Path(input_dir)
    output_dir = Path(output_dir)
    output_dir.mkdir(parents=True, exist_ok=True)

    extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.webp', '.tiff'}
    files = [f for f in input_dir.rglob('*') if f.suffix.lower() in extensions]

    for i, f in enumerate(files, 1):
        rel = f.relative_to(input_dir)
        out_path = output_dir / rel.with_suffix(f'.{out_format}')
        out_path.parent.mkdir(parents=True, exist_ok=True)

        img = Image.open(f)
        if img.mode in ('RGBA', 'P') and out_format in ('jpg', 'jpeg'):
            img = img.convert('RGB')

        # 等比缩放
        if img.width > max_width:
            ratio = max_width / img.width
            img = img.resize((max_width, int(img.height * ratio)),
                             Image.LANCZOS)

        img.save(out_path, quality=quality, optimize=True)
        print(f"[{i}/{len(files)}] {rel} → {out_path.relative_to(output_dir)}")

    print(f"✅ 批量转换完成: {len(files)} 个文件")

if __name__ == '__main__':
    batch_convert(sys.argv[1], sys.argv[2],
                  out_format=sys.argv[3] if len(sys.argv) > 3 else 'webp')
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

# 三、高级操作

#!/usr/bin/env python3
from PIL import Image, ImageFilter, ImageEnhance, ImageDraw, ImageFont
import os

# ---- 添加水印 ----
def add_watermark(input_path, output_path, text="© Copyright"):
    img = Image.open(input_path).convert('RGBA')
    overlay = Image.new('RGBA', img.size, (0,0,0,0))
    draw = ImageDraw.Draw(overlay)
    # 使用默认字体(或指定 ttf 路径)
    draw.text((20, img.height - 40), text, fill=(255,255,255,100))
    combined = Image.alpha_composite(img, overlay)
    combined.convert('RGB').save(output_path)

# ---- 模糊 / 锐化 / 亮度 ----
img = Image.open('photo.jpg')
img.filter(ImageFilter.GaussianBlur(5)).save('blur.jpg')
ImageEnhance.Contrast(img).enhance(1.5).save('contrast.jpg')
ImageEnhance.Brightness(img).enhance(1.2).save('bright.jpg')

# ---- 获取图片信息 ----
def image_info(path):
    img = Image.open(path)
    print(f"格式: {img.format}  尺寸: {img.size}  模式: {img.mode}")
    print(f"文件大小: {os.path.getsize(path)/1024:.1f}KB")
    print(f"DPI: {img.info.get('dpi', '未知')}")
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
#工具#格式
上次更新: 2026/06/17, 12:47:39
编码转义
文档转换

← 编码转义 文档转换→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式