如何用python在excel中画画(含GUI界面)

一.引言

最近看B站视频,有大佬徒手用excel一个格子一个格子填充,撸出了钢铁侠的图片,惊奇的同时,我思考,用python是否可以更快速的完成呢?


ps:由于最近重构了下代码,因此想看最新效果图以及GUI界面可直接前往文末


二.任务分解

既然原理是将excel的每一个单元格当作一个像素块,那我们是否可以通过opencv获取图片每个像素的RGB值,然后通过python对excel进行操作,给每个单元格填充相应的颜色。

三.准备工作

1.安装python中使用opencv需要的相关的库
进入cmd命令,输入:

pip install wheel
pip install numpy
pip install opencv-python

如果安装速度过慢可以尝试切到清华源安装

2.安装win32com库用于对excel表格进行操作
最初我是使用openpyxl写的但是它对填色方面做的并不是很友好,所以改用win32com库来操作
进入cmd命令,输入:

pip install pypiwin32

这边安装的坑挺多的,大家根据具体的问题百度吧

3.准备一个excel文件,并将其行高列高改为相同
Ctrl+a 全选表格
调整行列宽为相同,使得最终单元格呈正方形
在这里插入图片描述
修改效果如下:
在这里插入图片描述
4.准备一张图片
建议图片像素不要太高,建议一开始先选择(100×100即总像素为10000左右的图片)实验
图片大小可以直接通过windows自带的照片查看器修改
在这里插入图片描述

四.具体代码实现


import win32com.client
from win32com.client import DispatchEx
from ctypes.wintypes import RGB
import cv2
import numpy as np

#color_total用于存储RGB颜色
color_total=[]
#img_file为你要画的图片的名称,图片放在于.py同一个文件目录下 用绝对路径会报错(我也不知道为啥)
img_file='1.jpg'
#读取图片文件
img_a=cv2.imread(img_file)
 # cv2默认为BGR顺序,将顺序转为RGB
img_color=cv2.cvtColor(img_a, cv2.COLOR_BGR2RGB)
#返回height,width,以及通道数,因为不用所以省略掉
h, l, _ = img_a.shape 
#打印图片总行数和列数,即竖向有多少像素,横向有多少像素
print('行数%d,列数%d' % (h, l))
#将颜色数据添加到color_total中,颜色数据方面采集完成
for i in img_color:
    color_total.append(i)

#Win32#打开EXCEL
excel = win32com.client.DispatchEx('Excel.Application')
#要处理的excel文件路径#out.file是文件  绝对路径
WinBook = excel.Workbooks.Open('D:\\代码\\Python\\1.xlsx')
 #要处理的excel页
WinSheet = WinBook.Worksheets('Sheet1')
#设置单元格颜色
#excel中[1,1]代表的是第一行第一列的单元格,而数组中[0][0]代表的是第一行一列
#其中color_total[x-1][y-1][0]对应的是第x行第y列图像R的值 color_total[x-1][y-1][1]代表G color_total[x-1][y-1][2]代表B
for x in range(1,h):
    for y in range(1,l):
        WinSheet.Cells(x, y).Interior.Color = RGB(color_total[x-1][y-1][0],color_total[x-1][y-1][1],color_total[x-1][y-1][2]) 
        #打印正在进行描绘的像素的位置
        print(x,y)        
#保存
WinBook.save
#关闭
WinBook.close

五.过程中可能遇到的问题(必看)

1.绘制过慢问题
由于循环多以及excel处理的库不大聪明且颜色过多,粗略估算总像素为10000时(100×100),遍历大概需要1分钟,500×500需要半个小时,小伙伴们可以根据自己的需求设置图片大小
PS:最近我重新写了份代码,1000*700 大概只需 36s,见文章末

2.报错:不同的单元格格式太多
这主要是由于你图片的颜色过于丰富,且像素过多导致的。
Excel存储的单元格样式数量的上限为(Excel 2003上限是4000个,Excel2007以后是64000个),而咱们每在单元格填充一个不同的颜色就会算作一个样式,所以理论上咱们的总像素的颜色种类不能超过64000个。
当遇到这种问题时,将图片大小调小即可解决问题(虽然牺牲了像素)
所以咱们在制作的时候,在不出现明显马赛克的情况下,尽量不要让图片太大

六.效果展示

在制作《星空》的时候出现了“不同的单元格格式太多”的error
毕竟这色彩太丰富了(心里默默难受)
最初图片设置的是(400×244),由于颜色过多,报错了
不得已只能牺牲像素设置成 (300×183)
在这里插入图片描述

图片大小:300×300
在这里插入图片描述
图片大小:400×494
在这里插入图片描述

单身的小伙伴可以通过这个方法制作一个想要追求的女生的肖像画,并告诉她这是你耗时三个月一格一格填充制作的(良心有点痛),那女生必定感动到痛哭流涕~~

不单身的小伙伴也可如此
520给女朋友的肖像画、
PS:男朋友耗时三个月一格一格填充制作、

希望对你有帮助,谢谢!


最近重构了下代码,并写了个带GUI界面的
1000*700的图片生成excel像素画大概只需要36s
有兴趣的小伙伴可以看下excelPainter,欢迎Star

GUI界面如下:
在这里插入图片描述

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值