当前位置:首页>python>python#030:Pillow 严重被低估的图片处理库

python#030:Pillow 严重被低估的图片处理库

  • 2026-06-29 21:07:52
python#030:Pillow 严重被低估的图片处理库

图像处理别只会裁剪缩放,Pillow 的工程实践更值得学

你也许用过 Image.open().resize().save() 三板斧处理图片,觉得 Pillow 就是个”裁剪缩放工具”。但在真实项目里,批量加水印、格式自适应压缩、通道级像素操作、图像差异比对——这些需求几乎每周都会冒出来。如果每次都去搜 Stack Overflow,不如花 20 分钟把 Pillow 的工程级用法串一遍。

为什么这篇值得写?

Pillow(PIL Fork)是 Python 生态里下载量最高的图像处理库,PyPI 周下载量超过 4000 万。但它被严重低估了——很多人只用到了它 10% 的能力,剩下的 90% 能帮你解决这些真实问题:

  • 批量图片治理
    :自动加版权水印、统一尺寸、自适应压缩
  • 像素级操作
    :通道分离重组、蒙版合成、颜色空间转换
  • 图像质量管控
    :USM 锐化、对比度校正、边缘检测
  • 格式与兼容
    :30+ 格式读写、EXIF 元数据、PNG 文本块

这篇文章不会重写一遍官方教程,而是从工程实践出发,把 Pillow 里最容易被忽略但最值钱的能力拆清楚。

先看图:Pillow 能力速览

SVG(Scalable Vector Graphics,可缩放矢量图形)是一种用代码描述图形的格式。它无限放大不失真、体积小、易于修改,特别适合技术文章中的流程图、结构图和对比图。

Pillow 不是什么,和什么互补

先划清能力边界,避免拿 Pillow 干它不擅长的事。

互补工具一览

  • 需要深度学习推理 → PyTorch / TensorFlow 的 torchvision.transforms
  • 需要复杂排版 → reportlab(PDF)、matplotlib(科学图表)
  • 需要人脸检测/OCR → opencv-python + pytesseract
  • 需要 HEIF/AVIF → pillow-heif / pillow-avif-plugin

3 分钟上手:最小可懂版本

pip install Pillow
from PIL import Image

# 打开、查看属性、转换、保存
with Image.open("photo.jpg") as im:
    print(im.format)   # JPEG
    print(im.size)     # (1920, 1080)
    print(im.mode)     # RGB

    # 裁剪:左上角 200×200
    cropped = im.crop((0, 0, 200, 200))

    # 等比缩放到最大 300px
    thumbnail = im.copy()
    thumbnail.thumbnail((300, 300))

    # 灰度转换 + 保存
    gray = im.convert("L")
    gray.save("output.png")

三个关键点: 1. Image.open() 返回的是惰性对象,不会立刻把整张图读进内存 2. thumbnail() 是原地操作,不返回新对象 3. crop() 的 box 是 (left, upper, right, lower),不是 (x, y, w, h)

核心能力一:几何变换的正确姿势

resizecroprotate 看似简单,但工程里踩坑最多的也是它们。

resize vs thumbnail:别再搞混了

# resize:强制指定目标尺寸,不保持宽高比
resized = im.resize((800, 600), Image.Resampling.LANCZOS)

# thumbnail:保持宽高比,就地修改,不超过指定值
thumb = im.copy()
thumb.thumbnail((800, 800))  # 宽高都 ≤ 800

区别总结

resample 滤镜的选择

from PIL import Image

# 放大优先用 LANCZOS(质量最好)
up = im.resize((1920, 1080), Image.Resampling.LANCZOS)

# 缩小到图标尺寸可以用 BICUBIC
icon = im.resize((64, 64), Image.Resampling.BICUBIC)

# 像素风格可以用 NEAREST(最近邻,速度最快)
pixel_art = im.resize((48, 48), Image.Resampling.NEAREST)

重采样滤镜选择指南

rotate 和 transpose

# rotate:任意角度旋转(逆时针)
rotated = im.rotate(15, expand=True, fillcolor="
#FFFFFF")
# expand=True 会自动扩展画布,避免裁掉角落
# fillcolor 填充旋转后露出的空白区域

# transpose:90° 倍数旋转和翻转(更快,推荐)
flipped_h = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT)  # 水平翻转
flipped_v = im.transpose(Image.Transpose.FLIP_TOP_BOTTOM)  # 垂直翻转
rot_90  = im.transpose(Image.Transpose.ROTATE_90)           # 顺时针 90°
rot_180 = im.transpose(Image.Transpose.ROTATE_180)          # 180°

经验法则:90° 倍数旋转永远用 transpose,不要用 rotate——更快、像素更精确、不会引入插值误差。

核心能力二:通道操作与像素级控制

这是 Pillow 区别于”图片查看器”的关键能力。

颜色空间转换

from PIL import Image

im = Image.open("photo.jpg")

# RGB → 灰度
gray = im.convert("L")

# RGB → RGBA(加透明通道)
rgba = im.convert("RGBA")

# RGB → CMYK(印刷用)
cmyk = im.convert("CMYK")

# 带抖动的调色板量化(用于 GIF 等格式)
palletized = im.convert("P", palette=Image.Palette.ADAPTIVE, colors=256)

通道分离与重组

r, g, b = im.split()          # 分离三个通道(每个都是单通道 L 模式)
merged = Image.merge("RGB", (r, g, b))  # 重组

# 实战:只保留红色通道,其他置零
only_red = Image.merge("RGB", (r, Image.new("L", im.size, 0), Image.new("L", im.size, 0)))

# 实战:交换红蓝通道(类似一些老照片的色偏效果)
swapped = Image.merge("RGB", (b, g, r))

蒙版合成

from PIL import Image

background = Image.new("RGBA", (400, 400), "#1A1A2E")
foreground = Image.new("RGBA", (200, 200), "#E94560")

# 创建渐变蒙版(中心不透明,边缘透明)
mask = Image.new("L", (200, 200), 0)
mask_draw = ImageDraw.Draw(mask)
mask_draw.ellipse([0, 0, 200, 200], fill=255)

# composite:按蒙版合成两张图
result = Image.composite(foreground, background.crop((100, 100, 300, 300)), mask)
background.paste(result, (100, 100))

Image.composite() 是实现渐变边缘、羽化效果的利器,比直接 paste 精细得多。

核心能力三:ImageOps 和 ImageChops——被遗忘的两个模块

这两个模块不在 from PIL import Image 里,但工程价值极高。

ImageOps:批量处理必备

from PIL import Image, ImageOps

im = Image.open("photo.jpg")

# 等比缩放并居中填充(完美适配头像/封面尺寸)
padded = ImageOps.pad(im, (800, 800), color="#000000")

# 居中裁剪到指定尺寸(不管原图比例)
cropped = ImageOps.fit(im, (800, 800), Image.Resampling.LANCZOS)

# 灰度 + 自动对比度(比手动调参更稳健)
auto_contrast = ImageOps.autocontrast(ImageOps.grayscale(im))

# 反色
inverted = ImageOps.invert(ImageOps.grayscale(im))

# 展开(给图片加边框)
expanded = ImageOps.expand(im, border=20, fill="#FFFFFF")

pad vs fit 的区别

ImageChops:图像差异比对

from PIL import Image, ImageChops

before = Image.open("before.png")
after  = Image.open("after.png")

# 逐像素差值(高亮变化区域)
diff = ImageChops.difference(before, after)
diff.save("diff.png")

# 判断两张图是否完全相同
bbox = ImageChops.difference(before, after).getbbox()
if bbox is None:
    print("完全相同")
else:
    print(f"差异区域: {bbox}")

# 加法/减法混合
blended = ImageChops.add(before, after, scale=2.0, offset=0)

实际应用:UI 自动化测试中,截取页面截图与基线图做差异比对,getbbox() 返回 None 就代表渲染完全一致。

核心能力四:ImageFilter 和 ImageEnhance——图像质量管控

批量处理图片时,不同来源的图片质量参差不齐,需要统一校正。

内置滤镜

from PIL import Image, ImageFilter

im = Image.open("photo.jpg")

# 高斯模糊(可控半径)
blurred = im.filter(ImageFilter.GaussianBlur(radius=2))

# USM 锐化(比 SHARPEN 更精细)
sharpened = im.filter(ImageFilter.UnsharpMask(
    radius=2,      # 模糊半径
    percent=150,   # 锐化强度
    threshold=3    # 只锐化差异超过此阈值的像素
))

# 边缘检测
edges = im.filter(ImageFilter.FIND_EDGES)

# 浮雕效果
embossed = im.filter(ImageFilter.EMBOSS)

# 中值滤波(去椒盐噪点)
denoised = im.filter(ImageFilter.MedianFilter(size=3))

增强器:Contrast / Brightness / Color / Sharpness

from PIL import Image, ImageEnhance

im = Image.open("photo.jpg")

# 对比度增强(factor > 1 增强,< 1 减弱)
enhancer = ImageEnhance.Contrast(im)
contrasted = enhancer.enhance(1.3)

# 亮度调节
bright = ImageEnhance.Brightness(im).enhance(1.1)

# 饱和度调节
vivid = ImageEnhance.Color(im).enhance(1.2)

# 锐度调节
sharp = ImageEnhance.Sharpness(im).enhance(1.5)

# 链式组合:对比度 + 亮度 + 饱和度一步到位
final = ImageEnhance.Contrast(im).enhance(1.2)
final = ImageEnhance.Brightness(final).enhance(1.1)
final = ImageEnhance.Color(final).enhance(1.15)

核心能力五:ImageDraw——不只是画矩形

ImageDraw 是 Pillow 里最容易被低估的模块,它可以直接在图像上绘制几何图形和文字,覆盖大多数标注、水印、装饰需求。

from PIL import Image, ImageDraw, ImageFont

im = Image.new("RGB", (600, 300), "#FAFAFA")
draw = ImageDraw.Draw(im)

# 矩形(支持圆角)
draw.rounded_rectangle(
    [20, 20, 280, 130], radius=12,
    outline="#3366CC", width=2, fill="#E8F0FE"
)

# 椭圆
draw.ellipse([320, 20, 580, 130], fill="#4CAF50", outline="#388E3C", width=2)

# 带箭头的线
draw.line([(20, 170), (580, 170)], fill="#333333", width=3)

# 文字(尽量加载 truetype 字体,默认字体很小且不美观)
try:
    font_large = ImageFont.truetype("arial.ttf", 28)
    font_small = ImageFont.truetype("arial.ttf", 18)
except OSError:
    font_large = ImageFont.load_default()
    font_small = font_large

draw.text((40, 40),  "Pillow 12.2", fill="#1A237E", font=font_large)
draw.text((40, 80),  "Engineering Guide", fill="#555555", font=font_small)
draw.text((370, 60), "●", fill="#FFFFFF", font=font_large)

im.save("annotated.png")

rounded_rectangle 是 Pillow 8.2+ 新增的,支持圆角矩形,做卡片式 UI 标注非常好用。

核心能力六:格式策略与保存选项

同样的图像内容,保存参数不同,文件体积可能差 5 倍。

from PIL import Image

im = Image.open("photo.jpg")

# JPEG:照片首选
im.save("web.jpg", quality=85, optimize=True, progressive=True)
# quality: 75-85 是质量和体积的最佳平衡点
# optimize: 启用 Huffman 编码优化,通常减少 5-10% 体积
# progressive: 渐进式加载,网页体验更好

# PNG:截图/图标/透明图
im.save("screenshot.png", optimize=True)
# RGBA 模式自动保存为带透明通道的 PNG
rgba = im.convert("RGBA")
rgba.save("transparent.png")

# WebP:兼顾质量和体积
im.save("web.webp", quality=80, lossless=False)
# lossless=True 时质量参数无效

# GIF:带调色板量化
gif = im.convert("P", palette=Image.Palette.ADAPTIVE, colors=256)
gif.save("animation.gif", save_all=True, append_images=[frame2, frame3], duration=200, loop=0)

格式选择速查

实战:批量图片处理流水线

把上面的能力串成一条完整的流水线——这正是 Pillow 在工程中真正的价值所在。

"""
批量图片处理流水线:统一尺寸 + 水印 + 自适应压缩 + 元数据清理
"""
import sys
from pathlib import Path
from PIL import Image, ImageDraw, ImageFont, ImageOps, ImageFilter

INPUT_DIR = Path("./photos")
OUTPUT_DIR = Path("./output")
TARGET_SIZE = (1200, 630)  # 社交媒体封面尺寸
WATERMARK_TEXT = "© Tech Series"

def create_watermark(width: int, height: int) -> Image.Image:
    """创建透明水印图层"""
    wm = Image.new("RGBA", (width, 100), (0, 0, 0, 0))
    draw = ImageDraw.Draw(wm)
    try:
        font = ImageFont.truetype("arial.ttf", 20)
    except OSError:
        font = ImageFont.load_default()
    # 文字居中
    bbox = draw.textbbox((0, 0), WATERMARK_TEXT, font=font)
    text_w = bbox[2] - bbox[0]
    x = (width - text_w) // 2
    draw.text((x, 20), WATERMARK_TEXT, fill=(255, 255, 255, 120), font=font)
    return wm

def process_one(src: Path, dst: Path) -> None:
    """处理单张图片"""
    with Image.open(src) as im:
        # 1. 确保是 RGB 模式(CMYK、RGBA 等统一转换)
        if im.mode != "RGB":
            im = im.convert("RGB")

        # 2. 居中裁剪到目标尺寸
        im = ImageOps.fit(im, TARGET_SIZE, Image.Resampling.LANCZOS)

        # 3. 自动对比度校正
        im = ImageOps.autocontrast(im, cutoff=2)

        # 4. 轻微 USM 锐化(补偿缩放带来的模糊)
        im = im.filter(ImageFilter.UnsharpMask(radius=1, percent=120, threshold=2))

        # 5. 加水印
        wm = create_watermark(TARGET_SIZE[0], TARGET_SIZE[1])
        rgba = im.convert("RGBA")
        rgba.paste(wm, (0, TARGET_SIZE[1] - 100), wm)
        im = rgba.convert("RGB")

        # 6. 保存为 WebP(如果原图是照片场景)或 JPEG
        suffix = src.suffix.lower()
        if suffix in (".png", ".gif"):
            im.save(dst.with_suffix(".webp"), quality=80)
        else:
            im.save(dst.with_suffix(".jpg"), quality=85, optimize=True, progressive=True)

def main():
    OUTPUT_DIR.mkdir(exist_ok=True)
    photos = list(INPUT_DIR.glob("*.[jp][pn]g")) + list(INPUT_DIR.glob("*.webp"))
    if not photos:
        print("未找到图片文件")
        return
    for p in photos:
        dst = OUTPUT_DIR / p.name
        try:
            process_one(p, dst)
            print(f"✓ {p.name}")
        except Exception as e:
            print(f"✗ {p.name}: {e}")
    print(f"处理完成:{len(photos)} 张")

if __name__ == "__main__":
    main()

这条流水线覆盖了真实项目中最常见的需求:

  1. 模式统一
    :无论输入是 CMYK、RGBA 还是 P 模式,全部转 RGB
  2. 尺寸标准化
    ImageOps.fit 居中裁剪,不变形
  3. 质量校正
    autocontrast 补偿过暗/过亮的输入
  4. 锐化补偿
    :缩放后自动 USM 锐化
  5. 水印保护
    :透明文字水印,不遮挡主体
  6. 自适应输出
    :根据源格式选择 WebP 或 JPEG

生产环境 6 个常见坑

坑 1:Image.open() 是惰性加载

im = Image.open("photo.jpg")   # 此时只读取了文件头
im.size                        # 此时才真正加载像素数据
# 如果文件在 open 和实际读取之间被删除/修改,会抛异常

对策:需要确保文件稳定时,尽早触发加载(读取 .size 或 .load())。

坑 2:crop() 的坐标是绝对坐标,不是偏移量

# 错误:以为 (x, y, width, height)
wrong = im.crop((100, 100, 300, 200))  # 200×100 区域

# 正确:(left, upper, right, lower)
right = im.crop((100, 100, 400, 300))  # 300×200 区域

坑 3:RGBA paste 忘记传 mask

# 错误:RGBA 图像直接 paste,透明区域变成黑色
background.paste(foreground_rgba, (x, y))

# 正确:传 foreground 自身作为 mask
background.paste(foreground_rgba, (x, y), foreground_rgba)

坑 4:thumbnail() 是原地修改

thumb = im                    # thumb 和 im 指向同一对象
thumb.thumbnail((100, 100))   # im 也被修改了!

对策:先 .copy() 再调 thumbnail()

坑 5:大图内存爆炸

# 一张 10000×10000 RGB 图 ≈ 300MB 内存
# 如果同时处理 10 张,直接 3GB 起步

对策: - 用 Image.open() 的惰性加载特性,只保留文件句柄 - 处理完立刻 del 释放 - 超大图用 Image.tile 分块处理或 reduce() 先降采样

坑 6:JPEG 不支持透明通道

rgba = Image.new("RGBA", (100, 100), (255, 0, 0, 128))
rgba.save("test.jpg")  # 会自动丢弃 alpha 通道,不会报错

对策:保存 JPEG 前显式 .convert("RGB"),确保行为可控。

最适合什么场景?

Pillow 不是 Photoshop,但它是最轻量的 Python 图像自动化工具。这些场景它最合适:

本文重点回顾

延伸阅读

  • Pillow 官方文档 — 最新 12.2.0 版本
  • Pillow GitHub 仓库 — 源码与 Issues
  • ImageFilter 模块参考 — 全部滤镜列表
  • ImageOps 模块参考 — 实用操作集合

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 15:23:05 HTTP/2.0 GET : https://f.mffb.com.cn/a/491666.html
  2. 运行时间 : 0.127767s [ 吞吐率:7.83req/s ] 内存消耗:5,559.04kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=a2c627a5c75762303c4e917507843f44
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000498s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000787s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.019036s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000304s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000474s ]
  6. SELECT * FROM `set` [ RunTime:0.000189s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000589s ]
  8. SELECT * FROM `article` WHERE `id` = 491666 LIMIT 1 [ RunTime:0.003418s ]
  9. UPDATE `article` SET `lasttime` = 1783063385 WHERE `id` = 491666 [ RunTime:0.021989s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000367s ]
  11. SELECT * FROM `article` WHERE `id` < 491666 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001401s ]
  12. SELECT * FROM `article` WHERE `id` > 491666 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.007413s ]
  13. SELECT * FROM `article` WHERE `id` < 491666 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002691s ]
  14. SELECT * FROM `article` WHERE `id` < 491666 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001359s ]
  15. SELECT * FROM `article` WHERE `id` < 491666 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001200s ]
0.129371s