Python 居然可以在 Excel 中画画你知道吗


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画画内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python基础入门之seed()方法的使用
May 15 Python
python利用lxml读写xml格式的文件
Aug 10 Python
Python使用arrow库优雅地处理时间数据详解
Oct 10 Python
Python及PyCharm下载与安装教程
Nov 18 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
Oct 11 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
Python进程池Pool应用实例分析
Nov 27 Python
Python线程协作threading.Condition实现过程解析
Mar 12 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
Keras 中Leaky ReLU等高级激活函数的用法
Jul 05 Python
python中的测试框架
Nov 13 Python
Python 恐龙跑跑小游戏实现流程
详解Python+OpenCV进行基础的图像操作
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 #Python
python 远程执行命令的详细代码
Feb 15 #Python
python 详解turtle画爱心代码
python分分钟绘制精美地图海报
基于PyQT5制作一个桌面摸鱼工具
Feb 15 #Python
You might like
destoon设置自定义搜索的方法
2014/06/21 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
浅谈javascript中的 “ && ” 和 “ || ”
2017/02/02 Javascript
javascript自执行函数
2017/02/10 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
layui复选框限制选择个数的方法
2019/09/18 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
python读取LMDB中图像的方法
2018/07/02 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
德国旅游网站:weg.de
2018/06/03 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
升旗仪式演讲稿
2014/05/08 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
防震减灾主题班会
2015/08/14 职场文书