目录

  • 前言
  • 基本思路
  • 完整代码
  • 效果预览
  • 参考文献

前言

很早之前就听说外国有牛人在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文件,点开可以看到一副栩栩如生的蒙娜丽莎的图片。

把蒙娜丽莎搬到excel_参考文献

参考文献

1,用Python在Excel里画出蒙娜丽莎

2,用Python在Excel里画出蒙娜丽莎
https://zhuanlan.zhihu.com/p/101116342