Python Pillow图像处理实战:从基础操作到批量脚本
想处理图片但不想每次打开 Photoshop 来回点鼠标用 Python 的 Pillow 写几行脚本就能完成批量改尺寸、加水印、转格式、打滤镜这些活儿。Pillow 是 Python 生态里最常用的图像处理库也是对新手最友好、文档最齐全的一个。你不需要懂图像编码原理也不用管 JPEG、PNG 背后的压缩算法细节装好库、打开图片、调用方法结果就出来了。这篇文章我从零到一过一遍 Pillow 的核心用法穿插一些我实际踩过的坑适合刚接触图像处理的 Python 开发者也适合想用脚本解放双手的运营、设计和自媒体朋友参考。我最早用 Pillow 是在某次给一批商品图统一加水印当时赶时间把网络上一堆片段代码拼起来跑结果不是文字糊了就是图片被拉伸变形。后来花了半天把官方文档的 Image、ImageDraw、ImageFilter 几个模块系统性过了一遍才算真正摸清它的脾气。Pillow 能做的事比大部分人想象的多格式转换、缩略图、旋转裁剪、颜色增强、滤镜特效、文字绘制、像素级操作甚至做简单的 GIF 动图。它最大的优势是开箱即用依赖少安装后就能跑适合写自动化脚本和 Web 应用的后端图片处理。1. 为什么学 Pillow它到底解决什么问题1.1 图像处理需求的底色刚需场景大概有三个。第一是格式转换比如把一堆 PNG 转成 JPEG把 WebP 转成 PNG或者把 RGBA 带透明通道的图片转成 RGB 以便在某些老旧系统里显示第二是尺寸调整电商平台的商品图主图要求 800x800社交平台的头像要求 200x200批量改尺寸是高频操作第三是内容叠加给图片加文字、加 logo、加日期标记属于最常见的轻量级需求。这些需求用专业图像软件做当然没问题但一旦数量上来了比如几百张、几千张逐一打开再导出就很痛苦。Pillow 的本质是让你能通过代码批量、可重复地处理图片结果稳定且不会手抖出错。它不追求替代专业软件而是解决脚本化、自动化这一层的问题。1.2 Pillow 与 OpenCV、matplotlib 的定位差异很多初学者会困惑已经有了 Pillow为什么还要学 OpenCV这两个不是一回事。Pillow 是纯粹的图像处理库偏应用层读图片、改图片、存图片操作直观OpenCV 是计算机视觉库偏算法层做特征检测、人脸识别、目标跟踪这类事情更擅长。如果你要做的只是裁剪、加字、转换格式用 Pillow 就够了杀鸡不用牛刀。matplotlib 里的 imshow 也能显示图片但它的定位是数据可视化不是图像处理。Pillow 和 matplotlib 配合使用倒是常见先用 Pillow 处理图片再用 matplotlib 做对比展示或者把处理结果放到数据分析流程里。简单说Pillow 是动手改图的工具OpenCV 是让代码看懂图的工具matplotlib 是把图给人看的工具。选择之前先问自己到底要做什么。2. 环境准备与初始上手2.1 安装与验证安装没有什么特别的门槛直接用 pip 装就好pip install pillow如果是国内网络环境可以临时换用镜像源让下载更快pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple装完之后验证一下是否正常。我建议在交互式环境里跑这两行from PIL import Image print(Image.__version__)能输出版本号就说明安装成功。这里有个细节要注意导入语句写的是from PIL import Image不是from Pillow import Image。因为 Pillow 是 PILPython Imaging Library的延续分支包名保留了 PIL。早期有人以为装的是 Pillow导入时写 PIL 会心里别扭其实这是完全正常的官方就是这么设计的。我用过的版本里从 8.x 到 10.x 核心用法基本一致不用太纠结版本问题。当然如果用到比较新的特性比如 AVIF 支持需要保证版本别太老。2.2 核心概念Image 对象、坐标系、颜色模式Pillow 的一切操作几乎都围绕 Image 对象展开。打开一张图片得到的是一个 Image 实例这个对象里保存了尺寸、颜色模式、像素数据等信息。后续的裁剪、缩放、旋转、保存都是对这个对象“做处理”并得到新的对象或直接改内部数据。坐标系是初学者最容易绕晕的地方。Pillow 的坐标系原点在左上角x 轴向右y 轴向下。也就是说(0, 0) 是第一行第一列那个像素(width, height) 则是右下角最后一个像素。裁剪时传的元组是(left, upper, right, lower)表示左上角和右下角的坐标。注意right和lower是开区间也就是不包含这两个坐标本身的像素。这个细节很关键我见过不少人因为多裁剪了一行像素或者少算了一列导致结果偏差。颜色模式是另一个核心概念。最常见的模式有RGB红绿蓝三通道每通道 0~255不透明RGBA在 RGB 基础上加了 Alpha 透明度通道L灰度图单通道P调色板模式保存 GIF 这类索引色图片时会遇到CMYK印刷用的四色模式不同模式之间可以用convert()方法转换。比如把 RGBA 转成 RGB只需img.convert(RGB)。如果图片带透明背景转成 RGB 后透明部分会变成黑色这是非常常见的坑。解决思路是先把透明区域换成白色或指定颜色再转 RGB。我后面在常见问题章节会详细说处理方法。3. 日常用得最多的基础操作3.1 打开、读取与保存打开一张图非常简单from PIL import Image img Image.open(input.jpg) print(img.size) # (宽, 高) print(img.mode) # RGB print(img.format) # JPEGImage.open()不会立即把所有像素数据加载进内存它只是读取了文件头信息建立了一个图像对象。真正访问像素数据要等到调用load()或convert()等方法时才会触发。这个惰性加载机制在大量图片处理时能节约内存但也带来一个隐患文件对象被关闭后Image 对象可能无法再访问像素数据。举个例子如果你这样写with open(input.jpg, rb) as f: img Image.open(f)然后离开了 with 代码块再访问img在某些 Pillow 版本里就会报错。所以我在处理图片时如果后续还要用到会先调用img.load()把数据强制加载进来或者干脆直接传入文件路径而不是文件对象。保存图片用save()方法img.save(output.jpg, quality85)对 JPEG 来说quality参数控制压缩质量范围 1~95默认是 75。数值越大画质越好文件也越大。对 PNG 来说compress_level控制压缩级别。保存时 Pillow 会根据文件扩展名自动推断格式也可以显式指定format参数比如img.save(output.data, formatPNG)需要注意如果图片原本是 RGBA 模式直接保存为 JPEG 会报错因为 JPEG 不支持透明通道。解决办法是先convert(RGB)。3.2 裁剪、缩放、旋转和翻转裁剪用crop()传入一个四元组cropped img.crop((left, upper, right, lower))缩放用resize()传入目标尺寸的元组resized img.resize((200, 200))但如果原图是 1000x600你想缩到 200x200直接 resize 会把图片压变形。更专业的做法是先调用thumbnail()这个方法会自动保持宽高比并且在缩放过程中会做高质量的图像重采样。它的用法稍微特殊一点不是返回新的图片而是原地修改调用它的对象img.thumbnail((200, 200))这样img会变成原来的等比缩略图。如果原图是 800x600执行thumbnail((200, 200))后尺寸会变成 200x150。这个 API 设计跟resize()很不一样我第一次用的时候还愣了一下。旋转用rotate()rotated img.rotate(45, expandTrue, fillcolor(255, 255, 255))expandTrue表示旋转后自动扩展画布避免图片角落被裁剪掉fillcolor用来填充旋转后露出的背景区域。注意rotate()是逆时针旋转方向不对就调成负角度。翻转用transpose()flipped img.transpose(Image.FLIP_LEFT_RIGHT) # 左右翻转Pillow 的transpose()还支持FLIP_TOP_BOTTOM、ROTATE_90、ROTATE_180等。这里有个性能小技巧需要旋转 90 度、180 度时优先用transpose()而不是rotate()因为前者不会重新采样插值速度快且不会引入画质损失。3.3 颜色模式转换与像素操作模式转换用convert()gray img.convert(L) rgba_img img.convert(RGBA)像素级操作可以逐点读取也可以做区域统计。getpixel()和putpixel()是简单接口pixel img.getpixel((100, 50)) # 返回 (r, g, b) img.putpixel((100, 50), (255, 0, 0))但逐像素putpixel()非常慢处理一张大图要等很久。如果要做像素级的批量处理更高效的方式是配合point()或ImageEnhance模块或者直接操作numpy数组。Pillow 跟 numpy 结合很方便import numpy as np arr np.array(img) # 把 Image 转成 numpy 数组 arr arr[:, :, ::-1] # 举个例子RGB 转 BGR new_img Image.fromarray(arr)很多复杂的颜色变换走 numpy 比 Pillow 原生的逐像素操作快很多倍。4. 进阶能力滤镜、绘图与文字4.1 ImageFilter 滤镜Pillow 内置了 ImageFilter 模块提供模糊、锐化、轮廓查找、浮雕等常见滤镜。用法很简单from PIL import Image, ImageFilter blurred img.filter(ImageFilter.GaussianBlur(radius3)) sharpened img.filter(ImageFilter.SHARPEN) contour img.filter(ImageFilter.CONTOUR)GaussianBlur的radius参数控制模糊程度数值越大越模糊。如果要做图片背景虚化效果可以先放大模糊再叠加文字效果比直接用默认模糊好很多。ImageFilter.BLUR是简单的均值模糊速度很快但效果不如高斯模糊平滑。ImageFilter.EDGE_ENHANCE可以提升边缘对比度对于文字截图类图片比较有用。ImageFilter.FIND_EDGES可以用来提取轮廓在简单的图像识别流程中经常用来做预处理步骤。4.2 用 ImageDraw 画图ImageDraw 模块可以用来在图片上画线、画矩形、画椭圆、画多边形也可以写字。它最常见的用途就是给图片加标注框或者水印。基本用法是from PIL import Image, ImageDraw draw ImageDraw.Draw(img) draw.rectangle([(50, 50), (200, 200)], fill(255, 0, 0), outline(0, 255, 0), width3) draw.line([(0, 0), (100, 100)], fill(0, 0, 255), width2) draw.ellipse([(50, 50), (150, 150)], fill(255, 255, 0))这里的坐标传参方式有两种风格一种是[(x1, y1), (x2, y2)]一种是(x1, y1, x2, y2)看文档的时候不要被两种写法绕晕它们在效果上是等价的。画椭圆时如果传入的矩形框是正方形画出来的就是圆。这是一个简单易用的技巧。如果要画半透明形状需要先创建一个带透明通道的图层然后在这个图层上用 ImageDraw 绘制最后用Image.alpha_composite()合成到底图上。4.3 文字与水印给图片加文字是 Pillow 使用频率很高的功能。需要用到 ImageDraw 和 ImageFont 两个模块。Pillow 自带的默认字体是位图字体不支持中文写中文会直接报错或显示为方块。这是一定要记住的坑。正确做法是加载系统中的 TTF 字体文件。比如在常见系统上可以这样指定一个中文字体路径from PIL import ImageFont, ImageDraw font ImageFont.truetype(simhei.ttf, size36) draw ImageDraw.Draw(img) draw.text((10, 10), Hello 你好, fontfont, fill(255, 255, 255))如果没有现成字体可以找系统自带的字体文件在多数 Linux 发行版里类似路径为/usr/share/fonts/...在 Windows 系统上为C:/Windows/Fonts/...只要路径下的字体文件支持中文即可。某些服务器环境没有安装中文字体这时候需要手动上传一个或多个字体文件到项目中再通过相对路径加载。size参数是文字尺寸fill是文字颜色。text方法的anchor参数可以控制锚点对齐方式比如你希望文字中心点对齐某个坐标可以用anchormm。这个参数在很多版本里才得到更好的支持老项目里看不到这个参数如果遇到敲一下help(draw.text)确认当前版本支持的参数。半透明水印的做法from PIL import Image, ImageDraw, ImageFont watermark Image.new(RGBA, img.size, (0, 0, 0, 0)) draw ImageDraw.Draw(watermark) font ImageFont.truetype(simhei.ttf, 40) draw.text((img.width - 300, img.height - 100), 示例水印, fontfont, fill(255, 255, 255, 100)) result Image.alpha_composite(img.convert(RGBA), watermark)核心思路是先建一个透明图层在上面画带有透明度值的文字然后和原图做 alpha 合成。5. 综合实战批量图片处理脚本5.1 批量缩略图与压缩拿电商场景举例经常需要把上传的原始图片批量生成多尺寸缩略图。我先写一个最基础的文件遍历函数处理一个目录下所有 JPGimport os from PIL import Image input_dir ./images output_dir ./thumbs target_size (300, 300) quality 80 os.makedirs(output_dir, exist_okTrue) for filename in os.listdir(input_dir): if not filename.lower().endswith((.jpg, .jpeg)): continue filepath os.path.join(input_dir, filename) img Image.open(filepath) img.thumbnail(target_size) out_path os.path.join(output_dir, filename) img.save(out_path, JPEG, qualityquality) print(处理完成)thumbnail()会等比缩放所以最终尺寸是 300x225 或 225x300 这样的组合不会变形。但如果平台要求严格的正方形图可以做居中裁剪 缩放的组合操作def make_square(img, size300): w, h img.size side min(w, h) left (w - side) // 2 top (h - side) // 2 img img.crop((left, top, left side, top side)) img img.resize((size, size), Image.LANCZOS) return img这段代码先把图片从中间裁成正方形再缩放到目标尺寸。Image.LANCZOS是高质量的重采样滤波器适合缩小操作如果是放大图片效果不一定理想。5.2 批量加文字水印给一组图片加统一水印用脚本处理比人工操作省太多时间。水印位置我建议不要写死在角落里而是根据图片尺寸动态计算放在右下角并留出边距from PIL import Image, ImageDraw, ImageFont def add_watermark(img_path, out_path, text示例水印): img Image.open(img_path).convert(RGBA) txt_layer Image.new(RGBA, img.size, (0, 0, 0, 0)) font ImageFont.truetype(simhei.ttf, max(20, img.width // 25)) draw ImageDraw.Draw(txt_layer) # 先测量文字尺寸 bbox draw.textbbox((0, 0), text, fontfont) text_w bbox[2] - bbox[0] text_h bbox[3] - bbox[1] margin 30 x img.width - text_w - margin y img.height - text_h - margin draw.text((x, y), text, fontfont, fill(255, 255, 255, 120)) result Image.alpha_composite(img, txt_layer) result.convert(RGB).save(out_path, JPEG, quality88) add_watermark(a.jpg, a_watermarked.jpg)textbbox()是用来测量文字实际大小的关键方法不同字体渲染出来的尺寸不一样如果不测量直接硬编码坐标很容易出现文字超出图片边界的问题。透明度选 120 左右比较适合白色水印既不影响观看又能起到版权标识作用。5.3 图片拼接演示Pillow 也可以做简单的图片拼接比如把两张图并排放到一起from PIL import Image img1 Image.open(left.jpg) img2 Image.open(right.jpg) # 统一高度 height min(img1.height, img2.height) img1 img1.resize((int(img1.width * height / img1.height), height)) img2 img2.resize((int(img2.width * height / img2.height), height)) new_img Image.new(RGB, (img1.width img2.width, height), (255, 255, 255)) new_img.paste(img1, (0, 0)) new_img.paste(img2, (img1.width, 0)) new_img.save(combined.jpg)paste()方法的第二个参数是放置位置。如果两张图尺寸不一致直接拼接会比较难看所以先统一高度。要注意的是粘贴带有透明通道的图片时可以通过第三参数传入 mask 避免透明区域出现黑底这个细节在 RGBA 图片拼接时很重要。6. 常见问题与排查避坑记录6.1 疑难问题速查表我把实际使用中遇到过的、以及身边朋友问过最多的问题汇总成一个速查表方便直接查阅问题症状根本原因解决方案保存 JPEG 时报错 cannot write mode RGBAJPEG 不支持透明通道先调用convert(RGB)或先填充透明区域为白色图片旋转后内容被裁剪rotate()默认不扩展画布设置expandTrue缩放后图片变形resize()等比性不保证改用thumbnail()或手动按宽高比算目标尺寸中文文字显示为方块/乱码使用默认位图字体不支持中文加载系统或项目内的中文字体文件打开图片后报错 image file is truncated图片文件不完整或显卡端下载损坏手动补齐文件或使用ImageFile.LOAD_TRUNCATED_IMAGES True尝试加载可恢复部分处理几千张图片时内存占用过大open()未及时释放不用的图用完显式img.close()或用with Image.open(...) as img:管理上下文大图putpixel()处理极其慢逐像素 Python 调用开销大改用 numpy 数组操作或使用Image.point()批量映射批量处理时遇到格式不支持旧版本 Pillow 对少数格式如 WebP 动图支持不完整升级 Pillow 到最新版或先统一转换到中间格式图片在网络上传输后颜色变暗淡某些国产浏览器/App 压缩导致色彩配置解析问题转换为 sRGB 模式并重新保存必要时用 ImageEnhance.Color 增强饱和度6.2 我的几点实操心得第一模式和格式不要混为一谈。RGB、RGBA 是像素存储模式JPEG、PNG 是文件封装格式。模式决定图片能不能透明能不能无损保存格式决定文件大小和兼容范围。写代码之前先想清楚目标格式需要什么模式可以少踩很多坑。第二批量处理脚本一定要先处理单张测试。我以前写过一个批量处理 2000 张图片的脚本本以为万无一失跑完后发现其中一批图片是 CMYK 模式的输出结果颜色严重偏色。后来我在每张图片的处理开头加了一个convert(RGB)CS 类的问题彻底解决了。第三涉及中文路径时要格外小心。Windows 下某些旧版本 Pillow 对中文字符路径的文件名打开会报编码错误或者保存时乱码。我在项目里统一改为先使用os.chdir()进入目录再用相对路径处理。或者遇到编码相关问题时用Path对象而不是直接字符串拼路径。第四性能瓶颈不在 Pillow 本身而在循环体设计。如果你要循环处理一个列表里的图片尽量不要在循环内部重复加载字体文件、反复创建相同尺寸的图层这些初始化动作提到循环外面能明显提速。比如给 50 张图加水印字体加载只需一次font ImageFont.truetype(simhei.ttf, 40) for path in image_paths: # 循环里只做打开、绘制、保存第五Image.open()之后如果想要保留完整操作能力最好在同一上下文里完成所有处理再保存避免后来再访问时数据已经失效。特别是在写后端服务接口时处理好文件流生命周期非常重要否则会有莫名的空指针或 SystemError 报错。7. 一些更偏门但实用的扩展7.1 图片信息读取与 EXIF 处理除了像素数据图片文件里还包含元数据。用 Pillow 可以读取一些基本信息from PIL import Image from PIL.ExifTags import TAGS img Image.open(photo.jpg) exif_data img.getexif() for tag_id, value in exif_data.items(): tag TAGS.get(tag_id, tag_id) print(f{tag}: {value})这在处理从相机或手机导出的照片时非常有用。但要注意的是Pillow 在复制和重存图片时默认不会完整保留所有 EXIF 信息。如果你希望保留版权信息或拍摄参数需要在保存前手动把原图的 exif 传进去img.save(output.jpg, exifimg.info[exif])具体字段兼容性要看源文件和目标格式的匹配情况保存后最好拿工具打开确认一次。7.2 制作简单的 GIF 动图利用 Pillow 的save()支持多帧格式的特性可以把多张静态图合成 GIFfrom PIL import Image frames [] for filename in [frame1.png, frame2.png, frame3.png]: frame Image.open(filename).convert(P, paletteImage.ADAPTIVE) frames.append(frame) frames[0].save( output.gif, save_allTrue, append_imagesframes[1:], duration200, loop0, )duration是每帧间隔的毫秒数loop0表示无限循环。这个方法做表情包或简单产品展示动图很方便。不过要提醒Pillow 对 GIF 编码的压缩率不高帧数多时文件会偏大尽量避免做大尺寸长动画。7.3 减少图片文件大小的几个组合方案如果目标是减小图片体积而不是追求最高画质可以组合使用几个手段将图片转换为 JPEG 并降低quality到 60~75这是最直接的压缩方式将尺寸缩小到实际展示需要的大小这是最有效的瘦身手段如果要求透明背景可以改用 PNG-8 模式而不是默认的 PNG-32能显著减小文件适当降低颜色数使用quantize()方法进行调色板量化能大幅压缩 GIF 和 PNG 体积实际项目中存储空间不够时我一般优先做尺寸缩小然后降 JPEG 质量能减少 80% 的体积视觉损失非常小。官网要求高清大图的场景则不建议压到质量低于 80否则放大后细节会出现明显劣化。8. 内容还可以怎么扩展如果你已经把前面这些功能都玩明白了下一步可以考虑三个方向。方向一是配合 Web 框架做在线图片处理接口。在 Flask 或者 FastAPI 里写一个接收 Multipart 图片、调用 Pillow 处理、返回新图片的接口就是一个小型图床服务的基础。需要注意并发和内存控制避免一次接收超大图片。方向二是结合 numpy 和 scipy 做自定义的图像算法。Pillow 提供了图像 IO 和基本变换能力但特定的滤波、频域处理、颜色空间变换等不是它的强项。把图片转成 numpy 数组后用算法处理再转回 Pillow 显示和保存是图像处理脚本的常用套路。方向三是尝试 Pillow 的批量处理插件生态。Pillow 本身支持多类型的插件比如针对 WebP、PSD、MPO 等格式的扩展。如果你工作的业务场景里经常出现某些特殊格式查一下对应的插件说明能省去先转换到中间格式再处理的麻烦。这个库在大多数图像处理需求里都够用了关键是搞清楚自己的使用场景然后把它嵌到正确的流程里去。我经常在脚本里把 Pillow 和文件监听、定时任务结合让图片处理完全自动跑起来省下的时间可以做更多有价值的事。

相关新闻

大数据竞赛实战指南:从特征工程到模型融合的完整流程

大数据竞赛实战指南:从特征工程到模型融合的完整流程

1. 大数据竞赛到底在比什么第一次接触大数据竞赛的人,脑子里冒出来的问题通常是:这玩意儿跟平时做数据分析有什么区别?我做过几个完整的竞赛项目之后,最直观的感受是——竞赛的本质不是比谁模型调得好,而是比谁能在有限…

2026/10/13 21:56:43 阅读更多 →
PTA期末综合测试全解析:从结构体数组到避坑实战指南

PTA期末综合测试全解析:从结构体数组到避坑实战指南

期末综合测试这种东西,很多人觉得就是"一学期知识的期末大阅兵",背背书、刷刷题就能过。但真正在PTA平台上跑过“实验12. 期末综合测试”的同学应该都有体会:它跟你平时做的章节练习完全是两码事。平时练的是“刚学的知识点”&…

2026/10/13 21:55:42 阅读更多 →
PS5游戏存档管理工具技术解析

PS5游戏存档管理工具技术解析

我无法根据当前输入生成符合要求的博文。原因如下:项目标题“AnyPS5”缺乏明确指向性,未说明其性质(是工具、项目、社区、改装方案、模拟器相关、硬件改造、软件兼容层,还是其他类型);项目正文为空&#xf…

2026/10/13 21:55:42 阅读更多 →

最新新闻

多Agent协作为什么容易互相“甩锅”?从任务分配到结果验证设计协作工作流

多Agent协作为什么容易互相“甩锅”?从任务分配到结果验证设计协作工作流

一、引言:多 Agent 系统里的"责任真空" 把单 Agent 拆成 Planner、Retriever、Coder、Reviewer、Executor 之后,很多团队会遇到一个反直觉的现象:**系统的单点能力提升了,端到端的成功率反而下降,而且失败后…

2026/10/13 23:44:36 阅读更多 →
HDFS读写链路深度拆解:从数据块到副本放置与故障恢复

HDFS读写链路深度拆解:从数据块到副本放置与故障恢复

1. 从一次数据写入说起:HDFS 不只是“能存”这么简单做大数据的人都知道,HDFS 是整个生态的地基。你辛辛苦苦搭好集群、调好参数,跑起 Spark、Flink、Hive,但数据落到最后,全部要进 HDFS。所以 HDFS 的水平直接决定了上…

2026/10/13 23:44:36 阅读更多 →
大模型调用成本越来越高怎么办?从Token统计到缓存复用,搭建LLM成本管理系统

大模型调用成本越来越高怎么办?从Token统计到缓存复用,搭建LLM成本管理系统

一、引言:Token 账单正在成为新的"云成本黑洞" 过去两年,大部分团队把 LLM 当作一个"调用即付费"的外部 API:模型能力在涨、单价在跌,似乎不需要精打细算。但真实账单往往给出相反的结论——单 token 价格下降…

2026/10/13 23:44:36 阅读更多 →
Linux CFS调度器原理与实战调优指南

Linux CFS调度器原理与实战调优指南

1. 什么是CFS调度器:一个让CPU时间分配更公平的底层引擎CFS Scheduler,全称Completely Fair Scheduler(完全公平调度器),是Linux内核自2.6.23版本起默认启用的进程调度核心模块。它不是某个用户可见的图形工具&#xf…

2026/10/13 23:44:36 阅读更多 →
HDFS进阶核心:高可用、元数据、联邦与纠删码实践

HDFS进阶核心:高可用、元数据、联邦与纠删码实践

1. HDFS进阶内容概览这应该是HDFS系列的第四篇了。前三篇聊了集群搭建、Shell操作、客户端读写,基本把日常运维和开发常用的东西过了一遍,但很多人在这个阶段都会遇到同一个问题:单NameNode不够用的时候怎么办,或者集群规模上去了…

2026/10/13 23:44:36 阅读更多 →
GitHub热门项目趋势解析:从榜单看开源技术新风向

GitHub热门项目趋势解析:从榜单看开源技术新风向

如果你和我一样,每天早上的第一件事不是看天气,而是点开 GitHub Trending,那你应该能体会那种感觉——明明昨晚睡前刚刷过一遍,今天一早又变天了。GitHub 热门项目排行榜,或者说 Trending,已经不只是一个简…

2026/10/13 23:43:35 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →