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实现可以断点续传和并发的ftp程序
Sep 13 Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
python+influxdb+shell编写区域网络状况表
Jul 27 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
python set内置函数的具体使用
Jul 02 Python
python super用法及原理详解
Jan 20 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
python logging通过json文件配置的步骤
Apr 27 Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 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的安全
2006/10/09 PHP
在PHP中使用模板的方法
2008/05/24 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
Javascript实现的分页函数
2006/12/22 Javascript
JavaScript 中的事件教程
2007/04/05 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
Python采集腾讯新闻实例
2014/07/10 Python
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
塔吉特百货公司官网:Target
2017/04/27 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
什么是SCM(软件配置管理)
2014/08/16 面试题
承诺书格式范文
2014/06/03 职场文书
2014年实习生工作总结
2014/11/27 职场文书
保管员岗位职责
2015/02/14 职场文书