如何用python在excel中画画

一.引言

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

二.任务分解

既然原理是将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.绘制过慢问题
因为是两层嵌套for循环,所以会很慢,建议图片大小先事先进行修改,粗略估算总像素为10000时(100×100),遍历大概需要1分钟,500×500需要半个小时,小伙伴们可以根据自己的需求设置图片大小

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

六.效果展示

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

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

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

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

希望对你有帮助,谢谢!

猜你喜欢

转载自blog.csdn.net/shaxiu0213/article/details/106262694