目录
- 前言
- 基本思路
- 完整代码
- 效果预览
- 参考文献
前言
很早之前就听说外国有牛人在excel作画,当时觉得很神奇,一个是艺术创作,一个是表格制作软件,两者似乎风牛马不相及,直到后来接触到计算机视觉才知道,图片的每一个像素点都可以数值化,那么我们是不是可以这样去想,将构成图片的每一个像素点填充到excel的单元格中去,然后合理调整单元格长宽比便可以拼成一副画,就像我们小时候玩过的拼图游戏,这里是把像素搬到excel单元格中去;反过来想,用一张单元格足够小的excel表格将图片蒙上一层,犹如用 一张网去切割这张图片,图片被切割成一小块一小块 ,如果网格足够细,每一小块里面的颜色几乎只有一种,这样就可以用一个三元组(RGB)来刻画 ,这样一张图片就可以由一个很大的矩阵来刻画 ,矩阵中的每一个元素都是一个 RGB三元组。不管,从图片到excel还是从excel到图片,我们都可以构建一个一一映射关系,我们便可以依循这个理论在excel作画,下面就将达芬奇的名画蒙娜丽莎搬到excel上去。
基本思路
首先,本地要有一张蒙娜丽莎数字图片,读取这张图片每一个像素的色彩值,然后给excel里的每一个单元格涂上颜色,便拼成一个图片。
完整代码
# draw_excel.py
from PIL import Image
import openpyxl
from openpyxl.styles import fills
import os
MAX_WIDTH = 300
MAX_HEIGHT = 300
def resize(img):
w, h = img.size
if w > MAX_WIDTH:
h = MAX_WIDTH / w * h
w = MAX_WIDTH
if h > MAX_HEIGHT:
w = MAX_HEIGHT / h * w
h = MAX_HEIGHT
return img.resize((int(w), int(h)), Image.ANTIALIAS)
def int_to_16(num):
num1 = hex(num).replace('0x', '')
num2 = num1 if len(num1) > 1 else '0' + num1
return num2
def draw_jpg(img_path):
img_pic = resize(Image.open(img_path))
img_name = os.path.basename(img_path)
out_file = 'D:\\项目\\蒙娜丽莎\\' + img_name.split('.')[0] + '.xlsx'
if os.path.exists(out_file):
os.remove(out_file)
workbook = openpyxl.Workbook()
worksheet = workbook.active
width, height = img_pic.size
for w in range(1, width + 1):
for h in range(1, height + 1):
if img_pic.mode == 'RGB':
r, g, b = img_pic.getpixel((w - 1, h - 1))
elif img_pic.mode == 'RGBA':
r, g, b, a = img_pic.getpixel((w - 1, h - 1))
hex_rgb = int_to_16(r) + int_to_16(g) + int_to_16(b)
cell = worksheet.cell(column=w, row=h)
if h == 1:
_w = cell.column
_h = cell.col_idx
# 调整列宽
print(_w, _h)
# worksheet.column_dimensions[_w].width = 1
# 调整行高
worksheet.row_dimensions[h].height = 45
cell.fill = fills.PatternFill(fill_type="solid", fgColor=hex_rgb)
print('write in:', w, ' | all:', width + 1)
print('saving...')
workbook.save(out_file)
print('success!')
if __name__ == '__main__':
draw_jpg('mona-lisa.jpg')
效果预览
运行完,在同文件下生成一个名mono-lisa的 excel文件,点开可以看到一副栩栩如生的蒙娜丽莎的图片。
参考文献
1,用Python在Excel里画出蒙娜丽莎
2,用Python在Excel里画出蒙娜丽莎
https://zhuanlan.zhihu.com/p/101116342