跳至主要內容

13-使用 Excel 画像素画

AI悦创原创Python 办公自动化Python 办公自动化大约 4 分钟...约 1068 字

1. Excel 和图片类似

Excel 文件,单元格支持编辑内容和设置背景色。

一张图片,都是由密密麻麻的像素组成,且每个像素都是一个 rgb 的颜色值。

那是否可以读取图片每个像素的颜色,填充到 Excel 中,就可以做到 Excel 中画图。

这么想,是可以的。理论上也是可行的,那接下来就开始写代码。

2. 打开文件和图片

第一步,导入所需库,分别是 xlsxwriter 和图片的 Image 库。使用 xlsxwriter 的理由,是 xls 内容有限,图片的像素可是很多的,所以最好是使用 xlsx 格式。

import xlsxwriter
from PIL import Image

如果,你没有安装则使用如下命令安装:

pip install Pillow

导入之后,准备图片,并读取图片的宽高,以及像素对象:

Code1
path = '1.png'
img = Image.open(path)
imgL = img.convert("P").convert("RGB")
pix = imgL.load()
w, h = imgL.size

使用 Image 读取图片对象,获取宽和高,以及 pix 这像素对象,通过 pix[1,1] 拿到具体的颜色 RGB 值,然后转换成 16 进制的颜色值,进行背景色的写入。

3. 准备一个特殊函数

现在打开一个 xlsx 文件,文件名任意,如下代码:

wb = xlsxwriter.Workbook('demo2.xlsx')
ws = wb.add_worksheet('sheet1')

然后找一个 RGB 转 16 进制的函数,因为 RGB 是 10 进制的,方式就是通过 hex 函数转换成 16 进制,然后加上 x 和 0,并全部大写,就可以了。如下函数:

def RGB_to_Hex(tmp):
    rgb = list(tmp)
    strs = '#'
    for i in rgb:
        num = int(i)
        strs += str(hex(num))[-2:].replace('x', '0').upper()
    return strs

为什么一定要 16 进制?因为 sheet 中,写入背景色时,颜色必须是 16 进制才可以。

4. 读取和写入

下面就是循环的逐个单元格设置背景色,且不需要写入内容。如下代码:

for i in range(w):
    for j in range(h):
        rgb = pix[i, j]
        color = RGB_to_Hex(rgb)
        style = wb.add_format({'bg_color': '{}'.format(color)})
        ws.write(j, i, '', style)
        ws.set_row(j, 1)
ws.set_column(0, w-1, 0.5)

wb.close()

欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!

公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度