PIL生成棋盘纹理图片

 

实验十四 生成棋盘纹理图片

实验目的

  1. 熟悉Python扩展库pillow的安装方法。
  2. 熟悉Python扩展库pillow的简单使用。
  3. 理解棋盘网格纹理的生成原理。

实验内容

编写程序,绘制棋盘网格,要求棋盘的宽度和高度、交替的两种颜色以及网格数量都可以通过参数指定,并且两种颜色交替出现,水平方向和垂直方向上的网格数量相同。

特别的,棋盘为正方形,其宽高相等,棋盘边长与每边网格数量均为整数,颜色为RGB格式以元组的形式输入。

参考文章

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

源代码

  1. 绘制棋盘背景
    返回了一个Image对象,可以视为一个指定边长和背景色的正方形图片。
    def draw_image(width: int, color: tuple) -> Image: 
        # 定义颜色、大小
        size = (width, width)
        bgcolor = color
        # 创建空白图片和绘画对象
        imagetemp = Image.new("RGB", size, bgcolor)
        return imagetemp
  2. 绘制纵横线
    参数n表示每边方格的数量,因此纵横方向生成的线各有n-1条。
    draw.line表示在图片上画线。draw参数就代表着图片。
    def draw_line_y(draw, n, width, color):
        for i in range(n-1):
            for j in range(n-1):
                i = i + 1
                j = j + 1
                everage_line = width / n
                everage_line = everage_line * j
                start = (everage_line, 0)
                end = (everage_line, width)
                draw.line([start, end], fill=color, width=3)
     
    
    def draw_line_x(draw, n, width, color):
        for i in range(n-1):
            for j in range(n-1):
                i = i + 1
                j = j + 1
                everage_line = width / n
                everage_line = everage_line * i
                start = (0, everage_line)
                end = (width, everage_line)
                draw.line([start, end], fill=color, width=3)
     
  3. 绘制方格
    先根据边长和每边方格的个数确定方格尺寸length。
    先绘制第一行,隔一个方格涂一个色。
    接下来进行判断,每边方格数是否大于等于2:
    I.如果小于2(也就是1)说明只有一个方格,输出图片为一单色块。
    II.如果大于等于2,那么以不同的方式再绘制一行,以此实现交替的效果。
    接下来通过crop和paste即可实现对第一、二行的复制粘贴,实现效果。
    def draw_block(width, n, imagetemp, color):
        length = width / n
        for i in range(n//2+1):
            print(i)
            draw.rectangle(((2*i)*length,0,(2*i+1)*length , length), fill=color)
        if n >= 2:
            for i in range(n//2+1):
                draw.rectangle(((2*i+1)*length, length, 2*(i+1)*length, 2*length), fill = color)
        region = imagetemp.crop((0,0,width,length))
        region2 = imagetemp.crop((0,length,width,2*length))
        for i in range(2,n):
            if i % 2 == 1:
                imagetemp.paste(region2, (0, int((i*length))))
            else:
                imagetemp.paste(region, (0, int(i*length)))
  4. 总览
    import sys
    from PIL import Image, ImageDraw
     # 参考自http://zzvips.com/article/212257.html 
    
    def draw_image(width: int, color: tuple) -> Image: 
        # 定义颜色、大小
        size = (width, width)
        bgcolor = color
        # 创建空白图片和绘画对象
        imagetemp = Image.new("RGB", size, bgcolor)
        return imagetemp
    
    
    
    def draw_line_y(draw, n, width, color):
        for i in range(n-1):
            for j in range(n-1):
                i = i + 1
                j = j + 1
                everage_line = width / n
                everage_line = everage_line * j
                start = (everage_line, 0)
                end = (everage_line, width)
                draw.line([start, end], fill=color, width=3)
     
    
    def draw_line_x(draw, n, width, color):
        for i in range(n-1):
            for j in range(n-1):
                i = i + 1
                j = j + 1
                everage_line = width / n
                everage_line = everage_line * i
                start = (0, everage_line)
                end = (width, everage_line)
                draw.line([start, end], fill=color, width=3)
     
    
    
    def draw_block(width, n, imagetemp, color):
        length = width / n
        for i in range(n//2+1):
            draw.rectangle(((2*i)*length,0,(2*i+1)*length , length), fill=color)
        if n >= 2:
            for i in range(n//2+1):
                draw.rectangle(((2*i+1)*length, length, 2*(i+1)*length, 2*length), fill = color)
        region = imagetemp.crop((0,0,width,length))
        region2 = imagetemp.crop((0,length,width,2*length))
        for i in range(2,n):
            if i % 2 == 1:
                imagetemp.paste(region2, (0, int((i*length))))
            else:
                imagetemp.paste(region, (0, int(i*length)))
    
    
    if __name__ == '__main__':
        n = input("请输入每边的方格数:")
        if n.isdigit():
            n = int(n)
        else:
            print("请输入整数!")
            sys.exit()
        width = input("请输入每边的边长:")
        if width.isdigit():
            width = int(width)
        else:
            print("请输入整数!")
            sys.exit()
        color = eval(input("请输入背景颜色,示例:(255,255,255)"))
        imagetemp = draw_image(width, color)
        draw = ImageDraw.Draw(imagetemp)
        color = eval(input("请输入不同颜色,示例:(0,0,0)"))
        draw_line_x(draw, n, width, color)
        draw_line_y(draw, n, width, color)
        draw_block(width, n, imagetemp, color)
        imagetemp.show()

    效果图如下(下面的是VScode终端里的)

     

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值