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中类的初始化特殊方法
Dec 01 Python
将字典转换为DataFrame并进行频次统计的方法
Apr 08 Python
Python Grid使用和布局详解
Jun 30 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
Python中按值来获取指定的键
Mar 04 Python
Django框架设置cookies与获取cookies操作详解
May 27 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
Django框架模板用法入门教程
Nov 04 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
如何完美的建立一个python项目
Oct 09 Python
python 对一幅灰度图像进行直方图均衡化
Oct 27 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 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制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
php实现点击可刷新验证码
2015/11/07 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
Vue组件选项props实例详解
2017/08/18 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
2019/10/20 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
彪马西班牙官网:PUMA西班牙
2019/06/18 全球购物
机械工程系毕业生求职信
2013/09/27 职场文书
幼师自荐信范文
2013/10/06 职场文书
小学生评语大全
2014/04/18 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
大学生求职自荐信
2015/03/24 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫
教你nginx跳转配置的四种方式
2022/07/07 Servers