当前位置: 首页 > news >正文

娱乐时间 —— 用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

相关文章:

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

最近看蛮多朋友在玩,要么只能画比较简单的,要么非常花时间。想了下本质上就是把excel对应的单元格涂色,如果能知道哪些格子要上什么颜色,用编程来实现图片转为excel十字绘应该是很方便的。 图片的每一个像素点都可以数值化&#x…...

OJ练习第160题——LRU 缓存

LRU 缓存 力扣链接:146. LRU 缓存 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓…...

使用 Hugging Face Transformer 创建 BERT 嵌入

介绍 最初是为了将文本从一种语言更改为另一种语言而创建的。BERT 极大地影响了我们学习和使用人类语言的方式。它改进了原始 Transformer 模型中理解文本的部分。创建 BERT 嵌入尤其擅长抓取具有复杂含义的句子。它通过检查整个句子并理解单词如何连接来做到这一点。Hugging F…...

unity 控制Dropdown的Arrow箭头变化

Dropdown打开下拉菜单会以“Template”为模板创建一个Dropdown List,在“Template”上添加一个脚本在Start()中执行下拉框打开时的操作,在OnDestroy()中执行下拉框收起时的操作即可。 效果代码如下用于控制Arrow旋转可以根据自己的想法进行修改&#xff…...

Java开发面试--nacos专区

1、 Nacos是什么? 请简要介绍Nacos是什么以及它的主要功能和用途。 答: 简介: Nacos是一个开源的、高性能、动态服务发现、配置和服务管理平台,通常用于微服务架构中。Nacos的名称来源于"Naming"(服务发现…...

GB28181学习(三)——心跳保活

心跳保活 要求: 1. 当原设备发现工作异常时,应立即向本SIP监控域的SIP服务器发送状态信息; 2. 无异常时,定时向本SIP监控域的SIP服务器发送状态信息; 3. 状态信息报送采用**MESSGAE**方法; 4. SIP设备宜在…...

黑马JVM总结(三)

(1)栈内存溢出 方法的递归调用,没有设置正确的结束条件,栈会有用完的一天,导致栈内存溢出 可以修改栈的大小: 再次运行:减少了次数 案例二: 两个类的循环应用问题,导致Js…...

【数据结构】二叉树基础入门

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

MFC自定义消息的实现方法----(线程向主对话框发送消息)、MFC不能用UpdateData的解决方法

在MFC中,我们一边在使用多线程时,经常会遇到在需要调用到新建的控件,此时建议不要在新建的线程中直接调用主对话框的控件,我们可以通过自定义消息,在新建线程中发送并触发主线程进行相关的界面控件操作。 以Dialog对话…...

Linux单列模式实现线程池

目录 一、单列模式 1.1 单列模式概念以及实现条件 1.2 饿汉模式 1.1.1 饿汉模式代码实现 1.1.2 饿汉模式特征和优缺点 1.3 懒汉模式 1.3.1 懒汉模式代码实现 1.3.2 懒汉模式特征以及优缺点 二、线程池 2.1 线程池概念 2.2 实现简单线程池逻辑 2.3 模拟实现懒汉模式线程…...

汇川PLC学习Day3:轴控代码编写、用户程序结构说明与任务配置示例、用户变量空间与编址

汇川PLC学习Day3:轴控代码编写、用户程序结构说明与任务配置示例、用户变量空间与编址 一、新建轴与轴控代码编写 1. 新建轴 (1)新建一个轴 (2)将轴名字更新为实际名字 可以后面实例化后再更改,汇川可以在更新名字时同步更新…...

javaee springMVC Map ModelMap ModelAndView el和jstl的使用

pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …...

vue监听表单输入的身份证号自动填充性别和生日

1&#xff0c;先给表单绑定一个v-model值 <el-input type"number" v-model"form.idCard" placeholder"请输入证件号码" /> 2&#xff0c;使用watch监听输入的值 watch(form, (newName, oldName) > {var numid newName.idCard.split(…...

蓝桥杯官网练习题(翻硬币)

题目描述 小明正在玩一个"翻硬币"的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;。 比如&#xff0c;可能情形是&#xff1a;**oo***oooo; 如果同时翻转左边的两个硬币…...

企业架构LNMP学习笔记34

LVS-DR模式&#xff1a; 老师分析&#xff1a; 1、首先用户用CIP请求VIP 2、根据上图可以看到&#xff0c;不管是Director Server还是Real Server上都需要配置VIP&#xff0c;那么当用户请求到达我们的集群网络的前端路由器的时候&#xff0c;请求数据包的源地址为CIP目标地址…...

Python学习之六 循环结构

在很多情况下,我们往往需要循环输入多次,比如,密码最多只能输错3次等。这时候,我们需要使用循环结构。本小节,将学习循环。 一、while循环 while循环的一般形式如下: while 判断条件: 循环语句块 当判断条件为真,便执行循环语句块。比如说,我们需要写一个判断账号…...

flutter 网络地址URL转file

方法1 import dart:io; import package:http/http.dart as http; import package:path/path.dart; import package:path_provider/path_provider.dart;Future<File> _fileFromImageUrl() async {final response await http.get(Uri.parse(https://example.com/xyz.jpg)…...

【JavaEE基础学习打卡07】JDBC之应用分层设计浅尝!

目录 前言一、简单说说应用分层二、实体层1.O/R映射2.O/R映射实践三、数据访问层1.DAO层2.DAO层实战总结前言 📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白…...

Helm Kubernetes Offline Deploy Rancher v2.7.5 Demo (helm 离线部署 rancher 实践)

文章目录 1. 简介2. 预备条件3. 选择 SSL 配置4. 离线安装的 Helm Chart 选项5. 下载介质6. 生成证书7. 镜像入库8. 安装 rancher9. 配置 nodeport10. 配置 ingress11. 界面访问11.1 首页预览11.2 查看集群信息11.3 查看项目空间11.4 查看节点信息 1. 简介 Rancher 是一个开源…...

网络编程day6——基于C/S架构封装的线程池

一、线程竞争基本概念 竞争与同步 同一个进程中的线程共享进程中的绝大多数资源&#xff0c;当它们随意竞争时可能会导致资源被破坏、脏数据、不完整问题 通过一些手段让线程在竞争资源时相互协调、避免出现以上问题&#xff0c;这就称为线程同步 原子操作&#xff1a; 操作过程…...

ARM/X86工业级数据采集 (DAQ) 与控制产品解决方案

I/O设备&#xff0c;包括信号调理模块、嵌入式PCI/PCIE卡、便携式USB模块、DAQ嵌入式计算机、模块化DAQ系统&#xff0c;以及DAQNavi/SDK软件开发包和DAQNavi/MCM设备状态监测软件。 工业I/O产品适用于各种工业自动化应用&#xff0c;从机器自动化控制、测试测量到设备状态监测…...

【Java】Jxls--轻松生成 Excel

1、介绍 Jxls 是一个小型 Java 库&#xff0c;可以轻松生成 Excel 报告。Jxls 在 Excel 模板中使用特殊标记来定义输出格式和数据布局。 Java 有一些用于创建 Excel 文件的库&#xff0c;例如Apache POI。这些库都很好&#xff0c;但都是一些较底层的库&#xff0c;因为它们要…...

MySQL主从复制读写分离

读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库 读写分离的好处 因为数据库的“写…...

Kafka3.0.0版本——消费者(手动提交offset)

目录 一、消费者&#xff08;手动提交 offset&#xff09;的概述1.1、手动提交offset的两种方式1.2、手动提交offset两种方式的区别1.3、手动提交offset的图解 二、消费者&#xff08;手动提交 offset&#xff09;的代码示例2.1、手动提交 offset&#xff08;采用同步提交的方式…...

【AIGC专题】Stable Diffusion 从入门到企业级实战0403

一、前言 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第03节&#xff0c; 利用Stable Diffusion ControlNet Canny模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生态…...

linux提权

目录 一、linux提权靶场下载与安装 二、基础提权 1.sudo提权 2.suid提权 3.taskset执行bash 三、内核提权 相关网站 https://gtfobins.github.io/#sudohttps://blog.csdn.net/weixin_43873557/article/details/113784146 一、linux提权靶场下载与安装 #下载链接 http…...

Excel VSTO开发7 -可视化界面开发

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 7 可视化界面开发 前面的代码都是基于插件启动或者退出时&#xff0c;以及Excel Application的相关事件&#xff0c;在用户实际操作…...

英文科技论文写作与发表-投稿到发表(第6章)

1 投稿到发表 本章介绍典型会议和期刊从投稿到最终录用或退稿的全过程&#xff0c;期刊从投稿到最终录用或退稿的过程在各种不同学科领域差别不大。会议主要针对计算机科学及其相关领域&#xff08;如电子、信息、其他工程类&#xff09;的会议。最后总结几条怎样提高论文命中…...

2.4.3 【MySQL】设置系统变量

2.4.3.1 通过启动选项设置 大部分的系统变量都可以通过启动服务器时传送启动选项的方式来进行设置。如何填写启动选项就是下面两种方式&#xff1a; 通过命令行添加启动选项。 在启动服务器程序时用这个命令&#xff1a; mysqld --default-storage-engineMyISAM --max-conn…...

【Redis】2、Redis持久化和性能管理

Redis 高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供…...

网站建设 英语词汇/网络广告推广方法

Uploading... xxxgmail.com has insufficient permissions to upload new versions of package xxxx. pub logout 然后再使用pub publish发布的时候就需要重新登录了 如果是发布到pub.dev请使用如下命令 flutter packages pub logout 发布使用 flutter packages pub publi…...

做结构图用什么网站/百度网络营销app

这个分页插件是基于mybatis-3.25.jar commons-lang3-3.32.jar 以及mybatis-spring-1.2.0.jar。 下面是继承了Interceptor的插件类 package dwz.common.mybatis;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.…...

国外免费可以做网站的服务器/百度搜索网

旧制&#xff08;中四、中五)实施九年免费教育之后&#xff0c;学生需要以校内考试成绩作评级&#xff0c;决定能否升读高中(中四、中五)。香港的中四及中五课程&#xff0c;大致上会文理分科&#xff0c;分开文、理、商科3个主流。教授科目均以香港考试及评核局举行的香港中学…...

贵阳奇点未来网站建设/如何推广一个网站

续&#xff1a;为Python图形界面添加自定义函数功能安装pyinstallerpip install pyinstaller报错情况处理Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simpleCollecting pyinstaller Downloading https://pypi.tuna.tsinghua.edu.cn/packages/82/96/21ba3619647ba…...

温江区建设局网站/uc推广登录入口

【实例简介】html5 canvas绘制随机游动线条动画特效【实例截图】【核心代码】html5 canvas绘制随机游动线条动画特效canvas.drawer {position:fixed;top:0px;left:0px;width:100vw;height:100vh;}use strict;var _createClass function () { function defineProperties(target…...

做网站平台的公司/搜索引擎是什么意思

&#xfeff;&#xfeff;问题描述试题编号&#xff1a; 201312-4 试题名称&#xff1a; 有趣的数 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述我们把一个数称为有趣的&#xff0c;当且仅当&#xff1a;1. 它的数字只包含0, 1, 2, …...