Python实现PIL图像处理库绘制国际象棋棋盘


Posted in Python onJuly 16, 2021

网页上搜索 “python绘制国际象棋棋盘”,索引结果均为调用 turtle 库绘制棋盘结果;为了填充使用 python PIL 图像处理库绘制国际象棋棋盘的空白,今日分享此文。

1 PIL绘制国际象棋棋盘流程

1.1 思路秒懂

步骤1:创建空白图片和绘画对象

步骤2:绘制网格

步骤3:填充颜色

1.2 分块解析

步骤1:创建空白图片和绘画对象

imageTemp = Image.new("RGB", size, bgcolor)
draw = ImageDraw.Draw(imageTemp)     # 允许在imageTemp图片上画画

步骤2:绘制网格

绘制网格的关键是使用 Python PIL ImageDraw.Draw.line() 方法。

具体而言,本文采用分别绘制平均横直线和平均竖直线的方法。

下例为绘制平均竖直线:

for i in range(7):
    for j in range(7):
        i = i + 1
        j = j + 1
        everage_line = size[0] / 8
        everage_line = everage_line * j
        start = (everage_line, 0)
        end = (everage_line, size[1])
        draw.line([start, end], fill=(0, 0, 0), width=3)

:采用 for 循环遍历列
       因为 i,j 在分母,避免为0可能的报错,故+1
       计算每两条竖线之间的距离
       start起始值为“左”、“上”两值,end结束值为“右”,“下”两值
       循环绘制7条竖线将白底绘板均分为8份
       并设置绘制线条颜色及线条宽度等

Python实现PIL图像处理库绘制国际象棋棋盘

步骤3:填充颜色

值得注意的是,填充颜色要保证相邻两块颜色不一致。

填充颜色的关键是使用 Python PIL ImageDraw.Draw.rectangle() 方法。

具体做法是先填充第一、第二行,再将生成图像复制粘贴。

填充第一、第二行方格时要注意填充矩形的起始点和结束点值,保证相邻两块颜色不一致。

下例为填充第一行方格(间隔填充): 

draw.rectangle((0, 0, 50, 50), fill = (0, 0, 0))
draw.rectangle((100, 0, 150, 50), fill = (0, 0, 0))
draw.rectangle((200, 0, 250, 50), fill = (0, 0, 0))
draw.rectangle((300, 0, 350, 50), fill = (0, 0, 0))

填充好前两行方格后接下来就进入复制粘贴部分了;

对于第三第四行,就直接粘贴第一、二行图像就可以了:

region = imageTemp.crop((0,0,400,100))
imageTemp.paste(region, (0, 100))

对于第五到第八行,在进行一遍复制粘贴,这回复制的是前四行的图像结果:

region = imageTemp.crop((0,0,400,200))
imageTemp.paste(region, (0, 200))

2 完整代码

2.1 方法一

# coding=utf-8
from PIL import Image, ImageDraw
 
# 定义颜色、大小
size = (400, 400)
bgcolor = (255, 255, 255)
 
# 创建空白图片和绘画对象
imageTemp = Image.new("RGB", size, bgcolor)
draw = ImageDraw.Draw(imageTemp)
 
# 绘制平均竖直线
for i in range(7):
    for j in range(7):
        i = i + 1
        j = j + 1
        everage_line = size[0] / 8
        everage_line = everage_line * j
        start = (everage_line, 0)
        end = (everage_line, size[1])
        draw.line([start, end], fill=(0, 0, 0), width=3)
 
# 绘制平均横直线
for i in range(7):
    for j in range(7):
        i = i + 1
        j = j + 1
        everage_line = size[0] / 8
        everage_line = everage_line * i
        start = (0, everage_line)
        end = (size[0], everage_line)
        draw.line([start, end], fill=(0, 0, 0), width=3)
 
# 先涂两行方格
# 第一行间隔涂黑
draw.rectangle((0, 0, 50, 50), fill = (0, 0, 0))
draw.rectangle((100, 0, 150, 50), fill = (0, 0, 0))
draw.rectangle((200, 0, 250, 50), fill = (0, 0, 0))
draw.rectangle((300, 0, 350, 50), fill = (0, 0, 0))
# 第二行间隔涂黑
draw.rectangle((50, 50, 100, 100), fill = (0, 0, 0))
draw.rectangle((150, 50, 200, 100), fill = (0, 0, 0))
draw.rectangle((250, 50, 300, 100), fill = (0, 0, 0))
draw.rectangle((350, 50, 400, 100), fill = (0, 0, 0))
 
# 复制粘贴
# 操作第三行和第四行
region = imageTemp.crop((0,0,400,100))
imageTemp.paste(region, (0, 100))
# 操作第五行到第八行
region = imageTemp.crop((0,0,400,200))
imageTemp.paste(region, (0, 200))
 
# 显示
imageTemp.show()

2.2 方法二

from PIL import Image, ImageDraw
 
imageTemp = Image.new('RGB', (400, 400), 0)
draw = ImageDraw.Draw(imageTemp)
h,w = imageTemp.size
 
for x in range(7):
    for y in range(7):
        x = x + 1
        y = y + 1
        x_zuobiao = w/8
        x_zuobiao = x_zuobiao*x
        start = (x_zuobiao, 0)
        end = (x_zuobiao, h)
        draw.line([start, end], fill=(256, 256, 256), width=3)
 
for x in range(7):
    for y in range(7):
        x = x + 1
        y = y + 1
        y_zuobiao = h/8
        y_zuobiao = y_zuobiao * y
        start = (0, y_zuobiao)
        end = (w, y_zuobiao)
        draw.line([start, end], fill=(256, 256, 256), width=3)
 
x = 0
y = 0
z = 50
t = 50
for i in range(4):
    for i in range(2):
        for j in range(4):
            if(y<450):
                draw.rectangle((x, y, z, t), fill=(255, 255, 255))
                x = x + 100
                z = z + 100
        for i in range(4):
            x = x - 100
            z = z - 100
        x = x + 50
        y = y + 50
        z = z + 50
        t = t + 50
    x = x - 100
    z = z - 100
 
imageTemp.show()

2.3 方法三(精简版)

from PIL import Image, ImageDraw
 
imageTemp=Image.new('RGB',(400,400),0)
draw = ImageDraw.Draw(imageTemp)
h,w = imageTemp.size
 
x=0; y=0;z=50;t=50
for a in range(4):
    for i in range(2):
        for j in range(4):
            if(y<450):
                draw.rectangle((x, y, z, t), fill = (255, 255, 255))
                x=x+100
                z=z+100
        x = 0;z = 50;x=x+50;y=y+50;z=z+50;t=t+50
    x=0;z=50
 
imageTemp.show()

3 结果展示

Python实现PIL图像处理库绘制国际象棋棋盘

到此这篇关于Python实现PIL图像处理库绘制国际象棋棋盘的文章就介绍到这了,更多相关Python 国际象棋棋盘内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
基于python 字符编码的理解
Sep 02 Python
Python决策树之基于信息增益的特征选择示例
Jun 25 Python
python实现录音小程序
Oct 26 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
Python类继承和多态原理解析
Feb 05 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 #Python
Python多个MP4合成视频的实现方法
Jul 16 #Python
Python如何解决secure_filename对中文不支持问题
利用Matlab绘制各类特殊图形的实例代码
Flask response响应的具体使用
Python 快速验证代理IP是否有效的方法实现
Jul 15 #Python
Django路由层如何获取正确的url
Jul 15 #Python
You might like
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
jQuery ready函数滥用分析
2011/02/16 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中subprocess的简单使用示例
2015/07/28 Python
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
详解python中docx库的安装过程
2019/11/08 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
政风行风建设责任书
2014/07/23 职场文书
平遥古城导游词
2015/02/03 职场文书
出生证明格式
2015/06/15 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
Go语言的协程上下文的几个方法和用法
2022/04/11 Golang