Python 居然可以在 Excel 中画画你知道吗
作者:迢迢x 发布时间:2023-09-14 23:13:06
标签:Python,Excel,画画,绘图
导语:
用 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)
惊艳时刻
激动的心,颤抖的手,来看下最终效果咋样。
怎么样是不是觉得有那么一丝丝韵味呢...
来源:https://blog.csdn.net/a55656aq/article/details/122579220


猜你喜欢
- Python中yaml文件的读写(使用PyYAML库)。最近在搭建自动化测试项目过程中经常遇到yaml文件的读写,为了方便后续使用,决定记下
- ASP实例代码,利用SQL语句动态创建Access表。留作参考,对在线升级数据库有用处.<% nowtime = now()
- 1、设置web.config文件。以下为引用的内容:<system.web> ...... <globalization
- 指定的代码页特性无效。 codepage属性:是指出网页的代码页 如果制作的网页脚本与WEB服务端的默认代码页不同,则必须指明代码页: 代码
- 开发环境:Pycharm 2018.3 + Anaconda3(5.3.0) + Python 3.7.1 + Numpy 1.15.4在此
- 前言今天带大家爬取王者荣耀全套皮肤,废话不多说,直接开始~开发工具Python版本: 3.6.4相关模块:requests模块;urllib
- 安装redis服务1 下载redis cd /usr/local/ 进入安装目录 wget http://downl
- 本文实例讲述了nodejs简单实现TCP服务器端和客户端的聊天功能。分享给大家供大家参考,具体如下:服务器端var net = requir
- 如下所示:# -*- coding: utf-8 -*-# @Time : 2018/5/17 15:05# @Author :
- 这篇文章主要介绍了python多进程并发demo实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 一、心知天气API密钥获取首先,访问https://www.seniverse.com,进行登录或者注册操作,然后在控制台上创建一个免费版的
- 话不多说,小工具需求如下: 功能需求 -- 电脑开机后自动执行时间同步 非功能需求 -- 安装执行简单,无需安装额外环境一、代码实现基于以上
- 1. 索引及切片数组中的元素可以通过索引以及切片的手段进行访问或者修改,和列表的切片操作一样。下面直接使用代码进行实现,具体操作方式以及意义
- 代码如下:--创建测试表 DECLARE @Users TABLE ( ID INT IDENTITY(1,1), UserIn
- python实现日期判断和加减操作#====================================================
- 第一:pandas.read_csv读取本地csv文件为数据框形式data=pd.read_csv('G:\data_operati
- 安装wxpypip install -U wxpy登录微信# 导入模块from wxpy import *# 初始化机器人,扫码登陆bot
- <html><head><style>body{font-family:宋体;font-size:16p
- 许多网页开发者想从ASP.NET 页面传递一个值到另一个页面(比如从一个框架frame页面到一个弹窗页面)。看了代码就明白了。呵呵。(一)向
- 看代码吧~class ConvNet(nn.module): def __init__(self, num_cla