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利用多进程将大量数据放入有限内存的教程
Apr 01 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
详解python中requirements.txt的一切
Mar 03 Python
Python计算两个日期相差天数的方法示例
May 23 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
Python变量访问权限控制详解
Jun 29 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
关于Django Models CharField 参数说明
Mar 31 Python
Python基于pandas爬取网页表格数据
May 11 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 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中对用户身份认证实现两种方法
2011/06/04 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
JavaScript 比较时间大小的代码
2010/04/24 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
bootstrap table列和表头对不齐的解决方法
2019/07/19 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
js制作提示框插件
2020/12/24 Javascript
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
美国羊皮公司:Overland
2018/01/15 全球购物
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
经贸日语专业个人求职信
2013/12/13 职场文书
职工趣味运动会方案
2014/02/10 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
园林系毕业生求职信
2014/06/23 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
redis限流的实际应用
2021/04/24 Redis