当前位置: 首页 > news >正文

如何使用Python批量裁剪图片?3种场景,代码直接拿去用

为什么要批量裁剪图片?

做电商要统一主图尺寸、社交媒体头像要裁成正方形、证件照需要固定比例……手动一张张裁,几十张就够你喝两杯咖啡了。

用Python + Pillow,几行代码就能批量搞定。这篇博客覆盖最常用的3个场景,每个都给可运行代码。


场景一:固定尺寸裁剪(左上角裁剪)

最简单粗暴的方式:把所有图片裁成统一的宽×高。

fromPILimportImageimportosdefcrop_fixed_size(input_dir,output_dir,width,height):os.makedirs(output_dir,exist_ok=True)forfilenameinos.listdir(input_dir):ifnotfilename.lower().endswith(('.jpg','.jpeg','.png','.bmp','.webp')):continueimg_path=os.path.join(input_dir,filename)img=Image.open(img_path)# 左上角裁剪cropped=img.crop((0,0,width,height))cropped.save(os.path.join(output_dir,filename))print(f"{filename}{width}x{height}")# 使用:裁成 800x600crop_fixed_size(r'D:\原图',r'D:\裁剪后',800,600)

⚠️ 如果原图比目标尺寸小,会报错。下面的"居中裁剪"可以解决这个问题。


场景二:居中裁剪成正方形(最常用)

社交媒体头像、商品主图,基本都要正方形。这个方法会自动居中裁剪,不会拉伸变形。

fromPILimportImageimportosdefcrop_center_square(input_dir,output_dir,size):os.makedirs(output_dir,exist_ok=True)forfilenameinos.listdir(input_dir):ifnotfilename.lower().endswith(('.jpg','.jpeg','.png','.bmp','.webp')):continueimg_path=os.path.join(input_dir,filename)img=Image.open(img_path)# 取最小边作为裁剪尺寸,保证不会切掉内容min_side=min(img.width,img.height)left=(img.width-min_side)//2top=(img.height-min_side)//2right=left+min_side bottom=top+min_side cropped=img.crop((left,top,right,bottom))# 再缩放到目标尺寸(可选)cropped=cropped.resize((size,size),Image.LANCZOS)cropped.save(os.path.join(output_dir,filename))print(f"{filename}{size}x{size}")# 使用:裁成 500x500 正方形crop_center_square(r'D:\照片',r'D:\头像',500)

效果对比

原图居中裁剪左上角裁剪
1200×800 横图✅ 保留中间主体❌ 只保留左上角
800×1200 竖图✅ 保留中间主体❌ 只保留左上角

场景三:按坐标批量裁剪(精确控制)

有些场景需要精确裁剪某个区域,比如证件照只取头部、截图只取特定区域。

fromPILimportImageimportosdefcrop_by_coordinates(input_dir,output_dir,coords):""" coords: (left, top, right, bottom) 例如:(100, 50, 400, 400) 表示从(100,50)到(400,400)的矩形区域 """os.makedirs(output_dir,exist_ok=True)left,top,right,bottom=coords crop_width=right-left crop_height=bottom-topforfilenameinos.listdir(input_dir):ifnotfilename.lower().endswith(('.jpg','.jpeg','.png','.bmp','.webp')):continueimg_path=os.path.join(input_dir,filename)img=Image.open(img_path)# 判断原图是否够大ifimg.width<rightorimg.height<bottom:print(f"⚠️{filename}尺寸不足,跳过")continuecropped=img.crop((left,top,right,bottom))cropped.save(os.path.join(output_dir,filename))print(f"{filename}→ 裁剪区域{coords}")# 使用:裁剪左上角 (100, 50) 到 (600, 550) 的区域crop_by_coordinates(r'D:\截图',r'D:\裁剪后',(100,50,600,550))

进阶:批量裁剪 + 加水印(一气呵成)

裁剪完直接加上水印,电商场景特别实用。

fromPILimportImage,ImageDraw,ImageFontimportosdefcrop_and_watermark(input_dir,output_dir,size,watermark_text):os.makedirs(output_dir,exist_ok=True)forfilenameinos.listdir(input_dir):ifnotfilename.lower().endswith(('.jpg','.jpeg','.png')):continueimg_path=os.path.join(input_dir,filename)img=Image.open(img_path)# 居中裁剪min_side=min(img.width,img.height)left=(img.width-min_side)//2top=(img.height-min_side)//2cropped=img.crop((left,top,left+min_side,top+min_side))cropped=cropped.resize((size,size),Image.LANCZOS)# 加水印draw=ImageDraw.Draw(cropped)font=ImageFont.truetype("simhei.ttf",int(size*0.08))# Windows自带黑体text_bbox=draw.textbbox((0,0),watermark_text,font=font)text_width=text_bbox[2]-text_bbox[0]x=(size-text_width)//2y=size-int(size*0.1)draw.text((x,y),watermark_text,fill=(255,255,255,128),font=font)cropped.save(os.path.join(output_dir,filename),quality=95)print(f"{filename}→ 裁剪+水印完成")# 使用crop_and_watermark(r'D:\商品图',r'D:\成品',800,'店铺名称')

💡 如果是Mac/Linux,字体路径改成/System/Library/Fonts/Supplemental/Arial Unicode.ttf或安装中文字体。


常见问题速查

问题解决方案
图片有透明通道,保存后变黑底cropped.convert('RGB')转成RGB再保存
裁剪后图片模糊resize()Image.LANCZOS而不是默认的Image.BILINEAR
批量处理速度慢考虑用concurrent.futures.ThreadPoolExecutor多线程处理
需要保留EXIF信息piexif库,或pillow-heif处理HEIC格式

总结

批量裁剪图片的核心就三步:

  1. 打开图片Image.open()
  2. 裁剪区域img.crop((左, 上, 右, 下))
  3. 保存结果img.save()

上面的代码覆盖了固定尺寸、居中正方形、精确坐标三种最常见需求,复制过去改一下路径就能跑。

如果你需要更复杂的操作(比如按人脸自动裁剪、批量加圆角),评论区说,我接着写。

http://www.gsyq.cn/news/1564807.html

相关文章:

  • LangGraph实战:从环境踩坑到状态机搭建的AI Agent开发指南
  • 告别网盘限速:9大平台直链下载助手的终极指南
  • 在线最大独立集算法:随机化与几何表示如何解决动态资源分配难题
  • 移动端GUI自动化框架SkillDroid:从技能编译到鲁棒重放
  • Ruby数据类型实战指南:Integers、Floats与Booleans避坑解析
  • 基于深度学习YOLOv8的药物识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 2026泰州漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 专家模型特征工程:提升机器学习分类性能与可解释性的实践指南
  • Ubuntu 20.04 + Zabbix 6.0 深度监控 Docker 实战指南
  • emWin核心控件实战:IMAGE、KNOB、LISTBOX开发与避坑指南
  • 泉州莆抖抖可以信任吗 十大实力测评零套路不踩坑 - myqiye
  • 3个技巧让网盘下载效率翻倍:开源直链助手完整指南
  • QuAD框架:基于质量感知校准的AI生成图像检测技术解析
  • 2026泉州漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 基于PP-FP树与核心度索引的双层图社区发现算法解析
  • DigitalOcean OpenAPI Spec:云API契约化实践指南
  • 开源DEX-Mouse:低成本IMU与弯曲传感器实现手部动作捕捉
  • TWR-MPC8309工业网关开发实战:从硬件解析到协议卸载引擎应用
  • COBWEBTM:基于增量学习的终身主题建模方法解析与实战
  • Audiomass 技术揭秘:构建无需安装的 Web 端多轨音频编辑器
  • 西安车站用防静电地面清洁液靠谱生产商口碑榜,价格透明零套路 - myqiye
  • 嵌入式GUI开发实战:emWin显示驱动配置详解与避坑指南
  • LlamaIndex中文实战:PDF切分、混合索引与生产避坑指南
  • AI Skills实战指南:用GLM-4.7自动生成n8n工作流
  • AI助手内容安全规范与技术合规实践指南
  • 吴文俊-李特特征列方法在Lean 4中的形式化验证实践
  • Agentic RAG实战:用AI Agent重构企业级知识服务
  • 亮铁激光加工靠谱商家真实横评 2026选定再拍不交智商税 - myqiye
  • 信息物理系统韧性构建:从系统级属性到人机协同的实践解析
  • JWST揭示原恒星冰层化学演化机制