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 相关文章推荐
django如何连接已存在数据的数据库
Aug 14 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
django组合搜索实现过程详解(附代码)
Aug 06 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
Apr 26 Python
Python实现CAN报文转换工具教程
May 05 Python
python递归函数用法详解
Oct 26 Python
使用PyCharm官方中文语言包汉化PyCharm
Nov 18 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
Python自然语言处理之切分算法详解
Apr 25 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 date()日期时间函数详解
2010/05/16 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
Vue动态获取width的方法
2018/08/22 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
Python map和reduce函数用法示例
2015/02/26 Python
python获取各操作系统硬件信息的方法
2015/06/03 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
2014年大班元旦活动方案
2014/02/26 职场文书
国际经济贸易专业自荐信
2014/06/13 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技