Posted in Python onFebruary 15, 2022
导语:
用 Python 读取图片的像素值,然后输出到 Excel 表格中,最终形成一幅像素画,也就是电子版的十字绣了。
基本思路
实现这个需求的基本思路是读取这张图片每一个像素的色彩值,然后给 excel 里的每一个单元格填充上颜色。既然要读取图片,那就需要用到 Pillow 库,操作 Excel 需要用到 openpyxl 库,先把这两个库安装好。
pip3 install openpyxl
pip3 install Pillow
色值转换
从图片读取的像素块色值是 RGB 值,而 openpyxl 向 Excel cell 内填充颜色是十六进制色值,因此咱们先写一个 RGB 和十六进制色值转换的一个函数。
def rgb_to_hex(rgb):
rgb = rgb.split(',')
color = ''
for i in RGB:
num = int(i)
color += str(hex(num))[-2:].replace('x', '0').upper()
return color
excel 的单元格默认是长方形,修改为正方形才不会使图片变形
if h == 1:
_w = cell.column
_h = cell.col_idx
# 调整列宽
worksheet.column_dimensions[_w].width = 1
# 调整行高
worksheet.row_dimensions[h].height = 6
这里用到了双重for循环,外层是`width`,里层是`height`,是一列一列的填充颜色,因此判断`if h == 1`,避免多次调整列宽。
图片转换
有了色值转换函数,接下来要做的操作就是逐行读取图片的 RGB 色值,之后将 RGB 色值转换为十六进制色值填充到 Excel 的 cell 中即可。
def img2excel(img_path, excel_path):
img_src = Image.open(img_path)
# 图片宽高
img_width = img_src.size[0]
img_height = img_src.size[1]
str_strlist = img_src.load()
wb = openpyxl.Workbook()
wb.save(excel_path)
wb = openpyxl.load_workbook(excel_path)
cell_width, cell_height = 1.0, 1.0
sheet = wb["Sheet"]
for w in range(img_width):
for h in range(img_height):
data = str_strlist[w, h]
color = str(data).replace("(", "").replace(")", "")
color = rgb_to_hex(color)
# 设置填充颜色为 color
fille = PatternFill("solid", fgColor=color)
sheet.cell(h + 1, w + 1).fill = fille
for i in range(1, sheet.max_row + 1):
sheet.row_dimensions[i].height = cell_height
for i in range(1, sheet.max_column + 1):
sheet.column_dimensions[get_column_letter(i)].width = cell_width
wb.save(excel_path)
img_src.close()
最后再来个入口函数,就大功告成啦~
if __name__ == '__main__':
img_path = '/Users/xyz/Documents/tmp/03.png'
excel_path = '/Users/xyz/Documents/tmp/3.xlsx'
img2excel(img_path, excel_path)
惊艳时刻
激动的心,颤抖的手,来看下最终效果咋样。
怎么样是不是觉得有那么一丝丝韵味呢...
总结
好啦今日代码分享就到这了,喜欢的记得收藏噢~
到此这篇关于Python 居然可以在 Excel 中画画你知道吗的文章就介绍到这了,更多相关Python Excel画画内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!
Python 居然可以在 Excel 中画画你知道吗
- Author -
迢迢x- Original Sources -
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@