如何使用python裁剪图片

如上图所示,这是一张包含了各类象棋棋子的图片。我们需要将其中每一个棋子都裁剪出来,此时可以利用python的 PIL库 实现。

一、 安装PIL库

如果此前没有安装过PIL库,在python3环境下,命令行输入 pip install pillow 即可安装完成。

二、构建思路

我们尝试一下,将左上角黑色的剪切下来并保存图片。

首先要打开画图,放大再放大,再勾选网格线,找到将这个棋子的左上角坐标右上角坐标。可以看到右下角的坐标大约是(50,50)。左上角是(0,0)。因为所有图片的坐标的初始点都在左上角。

from PIL import Image
img = Image.open('chess.png') ## 打开chess.png文件,并赋值给img
region = img.crop((0,0,50,50))## x1,y1表示要裁剪的位置的左上角坐标,x2,y2表示右下角。
region.save('举例.png') ## 将裁剪下来的图片保存到 举例.png

可以看到是裁剪成功了,需要注意的是,我们要将每一个棋子都裁剪下来,难道要一个一个地看坐标、修改程序中的坐标,然后一遍一遍地运行程序去裁剪图片吗?那不如直接用画图裁剪可能还快一点。我们再思考一下,会发现每一个棋子间的间隔是有规律的,那我们可不可以尝试用for循环去实现批量地裁剪呢?

三、完整代码

再次打开画图,可以发现规律。第一排黑色子左上角的的坐标是(0,0),x坐标每次加50,加七次,所以是(0,0)-(300,0);右下角同理可得(50,0)-(350,0);第二排则是(0,50)-(300,50)和(50,100)-(350,100)。明白了规律之后,直接开始敲代码

from PIL import Image
chessred = ['jj','ss','xx','mm','cc','pp','bb'] ##红棋命名,随便起的,不要相同就行
chessblack = ['j','s','x','m','c','p','b'] ##黑棋命名,随便起的,不要相同就行
img = Image.open('./chess.png') ## 打开chess.png,并赋值给img def cropimg():
for i,j,z in zip(range(0,350,50),chessblack,chessred):
region = img.crop((i,0,i+50,50))## 裁剪第一排黑棋棋子
region.save(f'./test/{j}.png')## 保存第一排黑棋棋子
region = img.crop((i,50,i+50,100))## 裁剪第二排红棋棋子
region.save(f'./test/{z}.png')## 保存第二排红棋棋子 cropimg()

打开文件夹,所有裁剪后的图片已经被保存。

如何用python裁剪图片的更多相关文章

  1. .mat转成.npy文件+Python(Pytorch)压缩裁剪图片

    需求:现有数据文件V1.mat,里面包含多个数据集,现需将里面的images数据集提取出来,然后进行压缩裁剪成指定大小 V1.mat数据集目录: 1.从mat文件中提取数据(使用Python) V1. ...

  2. 使用Python PIL库中的Image.thumbnail函数裁剪图片

    今天,是我来到博客园的第五天,发现自己还没有头像,想着上传ubuntu系统中我很喜欢的一个背景图片来当头像,但是因为图片过大,上传失败了.那么,我们如何使用python中强大的PIL库来进行图片裁剪呢 ...

  3. Python批量自动裁剪图片

    """用Pythonp批量裁剪图片""" from PIL import Image import matplotlib.pyplot as ...

  4. python裁剪base64编码的图片

    简介 今天遇到需要裁剪base64字符串的PNG图片,并返回base64格式字符串的任务,捣鼓半天. 裁剪代码如下: def deal_inspect_img(base64_str): "& ...

  5. python批量裁剪图片

    """用Pythonp批量裁剪图片""" from PIL import Imageimport matplotlib.pyplot as ...

  6. python接收图片变成缩略图

    python图像处理库:Pillow初级教程 Image类 Pillow中最重要的类就是Image,该类存在于同名的模块中.可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建 ...

  7. 如何用python下载一张图片

    如何用python下载一张图片 这里要用到的主要工具是requests这个工具,需要先安装这个库才能使用,该库衍生自urllib这个库,但是要比它更好用.多数人在做爬虫的时候选择它,是个不错的选择. ...

  8. 如何用python“优雅的”调用有道翻译?

    前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js“斗争”的过程! 当然,本文仅 ...

  9. 如何用Python从海量文本抽取主题?

    摘自https://www.jianshu.com/p/fdde9fc03f94 你在工作.学习中是否曾因信息过载叫苦不迭?有一种方法能够替你读海量文章,并将不同的主题和对应的关键词抽取出来,让你谈笑 ...

随机推荐

  1. .NET CORE 鉴权

    基础信息 1.什么是鉴权授权? 鉴权是验证用户是否拥有访问系统的权利,授权是判断用户是否有权限做一些其他操作. 2.传统的Session 和Cookie 主要用于无状态请求下的的用户身份识别,只不过S ...

  2. Java并发基础之AbstractQueuedSynchronizer(AQS)

    AbstractQueuedSynchronizer同步器是实现JUC核心基础组件,因为 定义了一套多线程访问共享资源的同步器框架.前面几篇文章中JUC同步工具中都利用AQS构建自身的阻塞类.AQS解 ...

  3. 正确理解jmeter线程组之Ramp-Up

    Ramp-Up表示多少时间内启动线程,比如线程数100,Ramp-Up设置为10,表示10秒内启动100线程,不一定是每秒启动10个线程: 下面我们来做几个测试 线程组设置:100线程,Ramp-Up ...

  4. Spring系列22:Spring AOP 概念与快速入门篇

    本文内容 Spring AOP含义和目标 AOP相关概念 声明式AOP快速入门 编程式创建代理对象 Spring AOP含义和目标 OOP: Object-oriented Programming 面 ...

  5. C# Debug和Trace:输出调试信息

    在 C# 语言中允许在程序运行时输出程序的调试信息,类似于使用 Console.WriteLine 的方式向控制台输出信息.所谓调试信息是程序员在程序运行时需要获取的程序运行的过程,以便程序员更好地解 ...

  6. 【C# TAP 异步编程】四、SynchronizationContext 同步上下文|ExecutionContext

    一.同步上下文(SynchronizationContext)概述 由来 多线程程序在.net框架出现之前就已经存在了.这些程序通常需要一个线程将一个工作单元传递给另一个线程.Windows程序以消息 ...

  7. 接口java.util.Map的四个实现类HashMap Hashtable LinkedHashMap TreeMap

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别 :java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMa ...

  8. 关于JS继承

    关于JS继承 关于继承这个概念,是由面向对象衍生出来的.而JS身为一种基于面向对象而设计的语言,它和正统的面向对象语言又是有差别的. 面向对象语言 身为面向对象语言需要对开发者提供四种能力: ①:封装 ...

  9. mysql集群--基于centos7

    1 MySQL主从备份 主机:192.168.43.8 从机:192.168.43.6 条件:主机和从机都安装了mysql,开启了二进制日志 安装mysql (mysql 和 mysql-server ...

  10. STL漫游之vector

    std::vector 源码分析 从源码视角观察 STL 设计,代码实现为 libstdc++(GCC 4.8.5). 由于只关注 vector 的实现,并且 vector 实现几乎全部在头文件中,可 ...