娱乐时间 —— 用python将图片转为excel十字绘

最近看蛮多朋友在玩,要么只能画比较简单的,要么非常花时间。想了下本质上就是把excel对应的单元格涂色,如果能知道哪些格子要上什么颜色,用编程来实现图片转为excel十字绘应该是很方便的。
图片的每一个像素点都可以数值化,那么将构成图片的每一个像素点填充到excel的单元格中去,然后合理调整单元格长宽比便可以拼成一副画。反过来想,用一张单元格足够小的excel表格将图片蒙上一层,犹如用 一张网去切割这张图片,图片被切割成一小块一小块 ,如果网格足够细,每一小块里面的颜色几乎只有一种,这样就可以用一个三元组(RGB)来刻画 ,这样一张图片就可以由一个很大的矩阵来刻画 ,矩阵中的每一个元素都是一个 RGB三元组。不管从图片到excel还是从excel到图片,我们都可以构建一个一一映射关系,我们便可以依循这个理论在excel作画。
网上搜索了下用python就可以实现,主要是以下两个模块:
  • Pillow(PIL,Python Imaging Library):强大的图形处理库
  • openpyxl:用于操作excel的模板,之前也用到过

代码主要来自:程序员如何 10 分钟用 Python 画出蒙娜丽莎? - 知乎

直接运行会有报错,需要稍微修改:

  • 获取列信息:新版本修改了属性名,用原文的会报错
# 修正前
column = col[0].column
# 修正後
column = col[0].column_letter
  • 调整列宽部分:原文的1会让图片变得奇扁无比,测试设为8大小会比较合适
 worksheet.column_dimensions[_w].width = 8
  • 调整单元格大小:相对来说400更清晰
MAX_WIDTH = 400
MAX_HEIGHT = 400

修改后代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#@Time  : 2023/09/10
#@Author: Hehuyi_In
#@File  : picture_to_excel.pyfrom PIL import Image
import openpyxl
from openpyxl.styles import fills
import osMAX_WIDTH = 400
MAX_HEIGHT = 400# excel的单元格默认是长方形,修改为正方形才不会使图片变形
# 调整excel每个单元格大小,避免图片过大,excel无法打开
# 过小电子画会过于模糊,太大excel可能无法打开
def resize(img):w, h = img.sizeif w > MAX_WIDTH:h = MAX_WIDTH / w * hw = MAX_WIDTHif h > MAX_HEIGHT:w = MAX_HEIGHT / h * wh = MAX_HEIGHTreturn img.resize((int(w), int(h)), Image.ANTIALIAS)# 整型转16进制
# getpixel()获取的颜色值是rgb十进制的,但fills.PatternFill 里的fgColor`参数接收到的颜色值是十六进制的值,因此需要转换
def int_to_16(num):num1 = hex(num).replace('0x', '')# 位数只有一位时在前面补零num2 = num1 if len(num1) > 1 else '0' + num1return num2# 绘图函数
def draw_jpg(img_path):# 打开图片img_pic = resize(Image.open(img_path))img_name = os.path.basename(img_path)# 输出的excel名,若已存在则删除out_file = img_name.split('.')[0] + '.xlsx'if os.path.exists(out_file):os.remove(out_file)# 新建一个excel文件workbook = openpyxl.Workbook()# 激活一个工作表(sheet)worksheet = workbook.activewidth, height = img_pic.size# 循环处理图片中的每个像素for w in range(1, width + 1):for h in range(1, height + 1):# getpixel函数用于获取像素色彩值,入参为像素坐标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))# 将rgb值转换为16进制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_letter_h = cell.col_idx# 调整列宽worksheet.column_dimensions[_w].width = 8# 调整行高worksheet.row_dimensions[h].height = 45# 填充颜色,fill_type是填充类型,fgColor是填充的颜色cell.fill = fills.PatternFill(fill_type="solid", fgColor=hex_rgb)print('saving...')workbook.save(out_file)print('success!')if __name__ == '__main__':draw_jpg('lyx.jpg')

效果图,以我这个头像为例(excel画出来的图太大了,这里截了一部分)

这要是手工画一张不得画几个月...但通过程序可以直接秒出,牛哇~

参考
https://zhuanlan.zhihu.com/p/95720761
https://blog.51cto.com/u_15255081/6164226
https://blog.csdn.net/weixin_43790276/article/details/108478270
https://qiita.com/gorimacho/items/63707223e692f7401988

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/129363.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(3)MyBatis-Plus待开发

常用注解 TableName MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定即实体类型决定,且默认操作的表名和实体类型的类名一致,如果不一致则会因找不到表报异常 //向表中插入一条数据 Test public void testInsert(){User user new User(null, &…

python如何学习

功能如此强大、高效的Python,却非常的简单好学,这让学它的同学爱不释手,也让越来越多的互联网企业开始用Python来做主要的开发语言,比如谷歌、Facebook(现Meta)、豆瓣、知乎等知名互联网公司都在使用Python…

【C++】简单理解:将整数(浮点数)转换为字符串(string),将字符串(string)转换为整数(浮点数)方法

用stringstream类&#xff0c;口诀&#xff1a;过滤一下就转化 头文件#include<sstream> 例子&#xff1a;将整数12和浮点数12.34转化为字符串 int main() {int x 12;double d 12.34;string s;//创建一下对象strstringstream str;//过滤一下就转化str << x;st…

day3_C++

day3_C 思维导图用C的类完成数据结构 栈的相关操作用C的类完成数据结构 循环队列的相关操作 思维导图 用C的类完成数据结构 栈的相关操作 stack.h #ifndef STACK_H #define STACK_H#include <iostream> #include <cstring>using namespace std;typedef int datat…

SpringMVC_拦截器

4.拦截器 4.1拦截器概述 概述&#xff1a;一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方法的执行实际开发中&#xff0c;静态资源&#xff08;HTML/CSS&#xff09;不需要交给框架处理&#xff0c;需要拦截的是动态资源 4.2图示 图示 4.3案例实现 …

Win11共享文件夹怎么设置

当我们在使用Win11的过程中有时会因为一些操作需要共享文件夹&#xff0c;那么Win11系统该如何设置共享文件夹呢&#xff0c;下面小编就给大家详细介绍一下Win11设置共享文件夹的方法&#xff0c;有需要的小伙伴快来和小编一起看看吧。 Win11设置共享文件夹的方法&#xff1a;…

最后一块石头的重量 II【动态规划】

最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&am…

php代理刷访问量(附源码)

众所周知&#xff0c;所谓的访问量就是用户的点击次数。当然&#xff0c;如果真只是单纯记录用户的访问次数&#xff0c;那访问量刷起来也太简单了&#xff0c;不断的刷新网页就行。因此&#xff0c;常规的网站记录访问量是通过ip来的&#xff0c;一个有效ip对应一个访问量。通…

干了三年的功能测试,让我女朋友跑了,太难受了...

简单概括一下 先说一下自己的情况&#xff0c;普通本科&#xff0c;19年通过校招进入深圳某软件公司&#xff0c;干了3年多的功能测试&#xff0c;21年的那会&#xff0c;因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不…

【算法】Java-使用数组模拟单向链表,双向链表

目录 试题1&#xff1a;实现一个单链表&#xff0c;并实现以下功能&#xff1a; 试题2&#xff1a;实现一个双链表&#xff0c;并实现以下功能 思路总结&#xff1a; 什么情况下可能涉及到用数组实现链表呢&#xff1f; 在学习时了解到了可以用数组模拟链表&#xff0c;使其…

xCode14.3.1运行MonkeyDev出现“Executable Not Found“的解决办法

安装MonkeyDev遇到的坑 环境&#xff1a;Xcode Version 14.3.1 (14E300c) 错误提示 is not a valid path to an executable file. 报错 /Users/xxxx//Library/Developer/Xcode/DerivedData/MonTest-ccparhdyzjuqhjdergwrngpfwwoh/Build/Products/Debug-iphoneos/MonTest.app…

七、MySql表的内置函数

文章目录 一、日期函数&#xff08;一&#xff09;常用日期函数1.获得年月日&#xff1a;2.获得时分秒&#xff1a;3.获得时间戳&#xff1a;4.在日期的基础上加日期&#xff1a;5.在日期的基础上减去时间&#xff1a;6.计算两个日期之间相差多少天 &#xff08;二&#xff09;…

RabbitMQ - 如保证消息的可靠性?

目录 一、消息可靠性 1.1、生产者消息确认&#xff08;生产者角度&#xff09; 1.1.1、理论 1.1.2、实践 1.2、消息持久化&#xff08;消息角度&#xff09; 1.2.1、理论 1.3、消费者消息确认&#xff08;消费者角度&#xff09; 1.3.1、理论 1.3.2、实践 1.4、失败重…

ARM指令集--数据处理指令

数据处理指令&#xff1a;数学运算&#xff0c;逻辑运算 立即数 立即数的本质 就是包含在指令当中的数&#xff0c;属于指令的一部分 立即数的优点&#xff1a;取指的时候就可以将其读取到CPU&#xff0c;不用单独去内存读取&#xff0c;速度快 立即数的缺点&#xff1a;不…

数电课程设计——课设二:交通信号灯

一、实验内容 &#xff08;1&#xff09;十字路口有 x、y 方向两组交通信号灯&#xff0c;每组有红、黄、绿灯各一个&#xff1b; &#xff08;2&#xff09;设计一个交通灯控制电路&#xff0c;模拟十字路口交通灯工作情况&#xff0c;红灯亮 35s&#xff0c;黄灯亮 5s&…

JAVA设计模式第七讲:设计模式在 Spring 源码中的应用

设计模式&#xff08;design pattern&#xff09;是对软件设计中普遍存在的各种问题&#xff0c;所提出的解决方案。本文以面试题作为切入点&#xff0c;介绍了设计模式的常见问题。我们需要掌握各种设计模式的原理、实现、设计意图和应用场景&#xff0c;搞清楚能解决什么问题…

电子企业应该先实施ERP系统还是WMS仓储管理系统

电子企业应该先实施ERP系统还是WMS仓储管理系统&#xff1f;这是一个有争议的问题&#xff0c;不同的企业和管理专家有不同的看法。但是&#xff0c;从我个人的观点来看&#xff0c;电子企业应该先实施ERP系统&#xff0c;然后再考虑WMS仓储管理系统。 首先&#xff0c;ERP系统…

医疗知识图谱 neo4j

开源项目&#xff1a; https://github.com/liuhuanyong/QASystemOnMedicalKG 一.效果 二.需要安装&#xff1a; pip install pyahocorasick pip install py2neo 三.需要修改&#xff1a; 需要改的点&#xff1a; 1.改连接的方式 2.改读文件的方式 MedicalGraph 运行&am…

【C++进阶】二叉树搜索树

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C进阶 ⭐代码仓库&#xff1a;C进阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

一文读懂java变量类型

前言 在学习和使用Java编程语言时&#xff0c;理解变量类型是至关重要的基础知识。Java是一种静态类型语言&#xff0c;强调变量必须先声明其类型&#xff0c;才能进行后续操作。因此&#xff0c;对于初学者来说&#xff0c;了解Java中不同的变量类型及其特性是迈向编程成功的…