百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

利用python在excel中画图的实现方法

toyiye 2024-09-14 13:40 3 浏览 0 评论

一、前言

以前大学时候,学EXCEL看到N多大神利用excel画图,觉得很不可思议。今儿个学了一个来月python,膨胀了就想用excel画图。当然,其实用画图这个词不甚严谨,实际上是利用opencv遍历每一个像素的rgb值,再将其转化为16进制,最后调用openpyxl进行填充即可。

这是小编准备的python基础学习资料,关注,转发,私信小编“01”即可免费领取!


1.1、实现效果

效果如下图

1.2、需要用到的库的安装

需要用到库如下:

import cv2 #导入OpenCV库
import xlsxwriter #利用这个调整行高列宽
import openpyxl #利用这个填充颜色
import numpy as np #下面这两个是数据存储的两种方式,用此种方式处理数据,比列表高效,具体可自行查看文档
import pandas as pd

除了第一个库其他的可以直接用pip在命令提示行进行安装,或者利用编辑器的一些自动安装功能也非常的方便,具体的请参看这篇文章 的第三节。

第一个库如果你直接用pip3 install opencv-python 进行安装的话,无论你网速多么快,都会非常慢几k/s,如下:

如果能安装好还行,关键有的可能等上几分钟也不行,直接出现几十行的红色字看的头疼。几经百度后才知道是安装源的问题,切换为国内的安装源即可,利用如下命令:

pip3 install -i https://pypi.tuna.tsinghua.ed... opencv-python

如下图,我准备截取安装速度和上面的作对比的,结果直接安装好了

二、代码分开讲解

本文我们利用面相对象的编程思维进行。

2.1、对象的定义以及初始化

class ImageToExcel():
def __init__(self,image_path,excel_path):
self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)
self.excel_path=excel_path

前面两行很好理解就是定义对象的格式以及初始化对象。

其中image_path和excel_path这两个变量是你的图像储存路径和后续的excel文件保存位置。

第三行self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)意思是调用opencv的imread读取图片。其中第一个参数就是对象实例化时候传递进来的图像储存路径。该函数返回的是一个三维数组,分别表示x,y,rgb 就是x,y坐标对应的rgb值,其中x,y单位为1像素。最后将这个三维数组传递给对象的一个属性imgviewx,等待后续对象方法调用。我们将之打印出来如下。

第四行<<self.excel_path=excel_path>>是将对象实例化时候传递进来的excel_path传递给对象的属性excel_path,同样等待后续对象的方法调用。

2.2、对象的方法

1:行高列宽调整,以防止图像变形

#excel行高列宽调整
def excel_size(self):
workbook = xlsxwriter.Workbook(self.excel_path)
worksheet = workbook.add_worksheet('test')
worksheet.set_column('A:CAA', 1)
for x in range(2000):worksheet.set_row(x, 8.4)
workbook.close()

这个其实你可以后续在excel中调整也可以。

第二行第三行基本一看就懂,就是在你刚开始对象实例化时候传入的一个路径中创建一个工作簿并添加一个名为test的工作表。

第三行意思是将A列到CAA列的列宽设置为1(注意:这里面设置为1不知道为什么在工作表中就是0.94,列宽同样小点)

第四行意思同样,不过行高不能批量只能通过循环。

最后一样看着像关闭,其实最主要功能是保存,没有这一行,前面的所有设置都不会被保存。

2.3、对象的方法2:10进制转化为16进制

#10进制转化为16进制
def ten2_16(self,num):
num1 = hex(num).replace('0x', '')
return num1 if len(num1) > 1 else '0' + num1

这个方法不用细说,就是利用系统自带的函数hex将10进制转化为16进制。我们都知道hex返回的16进制是以0x开头的,而16进制颜色码中明显没有,所以要用replace去掉。

如果rgb值是16以内的,以16进制显示的话会是1位数,而同样这个在16进制颜色码中也没有,所以最后一行的意思就是一位数的话在开头补0。

2.4、对象的方法3:获取r、g、b值并运用方法1转化为16进制颜色码

#获取像素数据并转化为16进制
def get_rgb_data(self):
self.excel_size()
data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)
data_g=pd.DataFrame( np.array(self.imgviewx)[:,:,1] ).applymap(self.ten2_16)
data_b=pd.DataFrame( np.array(self.imgviewx)[:,:,0] ).applymap(self.ten2_16)
return (data_r+data_g+data_b).values

其中第二行self.excel_size() 是在本方法本调用时候先调用方法1调整行高列宽。我们后面说,这关系到对象方法之间的参数传递,我们后续说。

三四五行的代码结构一样,我们挑一个说。比如第三行data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)这个代码我们可以拆开成下面的代码:

r=np.array(self.imgviewx)[:,:,2]
tmp=pd.DataFrame( r )
data_r=tmp.applymap(self.ten2_16)

这下就容易懂了。

第一行意思是将刚开始对象初始化时候得到的包含目标图片的所有像素点的rgb值的三维列表转化为数组并提取其中的r。

第二行是将第一行得到的数组转化为DataFrame对象并存储在tmp变量中,以便第三行的处理。

第三行是利用DataFrame中的applymap将r值转化为16进制。

最后一行return (data_r+data_g+data_b).values意思是将转化为16进制的rgb值合并后就得到了16进制的颜色码并转化为数组。

2.5、对象的方法4:颜色填充

def color_fill(self):
rgb_list=self.get_rgb_data()
wb = openpyxl.load_workbook(self.excel_path)
ws = wb['test']
for x,tmp1 in list(enumerate(rgb_list)):
print('总共有%s行,已填充%s行,还剩下%s行'%(len(rgb_list),x+1,len(rgb_list)-x-1))
for y ,tmp2 in list(enumerate(tmp1)):
ws.cell(x+1,y+1).fill = openpyxl.styles.fills.GradientFill(stop=[str(tmp2),str(tmp2)])
wb.save(self.excel_path)

第二行rgb_list=self.get_rgb_data()是不是似曾相识,对,就是在方法2中调用方法1时候用的。

这里就是在本方法也就是方法3中调用方法2。唯一的区别就是有没有返回值。

我们这样在方法3中调用方法2然后方法2中调用方法1。这样在对象外的时候我们就只用对象实例化并调用方法3即可实现功能。

第三行、第四行就是调用openpyxl.load_workbook打开我们在方法1中新建的工作簿中的test工作表。

五到七行两个循环嵌套很容易懂就是利用循环遍历每个工作表。

第八行的代码可能可以简化 ,这个是我修改网上的一个填充渐变色的代码。

最后一行就是工作表的保存,没什么可说的。

三、完整代码

import cv2 #导入OpenCV库
import xlsxwriter #利用这个调整行高列宽
import openpyxl #利用这个填充颜色
import numpy as np #下面这两个是数据存储的两种方式,用此种方式处理数据,比列表高效
import pandas as pd
 
class ImageToExcel():
#初始化
def __init__(self,image_path,excel_path):
self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)
self.excel_path=excel_path
# excel行高列宽调整
def excel_size(self):
workbook = xlsxwriter.Workbook(self.excel_path)
worksheet = workbook.add_worksheet('test')
worksheet.set_column('A:CAA', 1)
for x in range(2000): worksheet.set_row(x, 8.4)
workbook.close()
#rgb转16进制颜色码
def ten2_16(self,num):
tmp = hex(num).replace('0x', '')
return tmp if len(tmp) > 1 else '0' + tmp
#获取像素数据并转化为16进制
def get_rgb_data(self):
self.excel_size()
data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)
data_g=pd.DataFrame( np.array(self.imgviewx)[:,:,1] ).applymap(self.ten2_16)
data_b=pd.DataFrame( np.array(self.imgviewx)[:,:,0] ).applymap(self.ten2_16)
return (data_r+data_g+data_b).values
#颜色填充
def color_fill(self):
rgb_list=self.get_rgb_data()
wb = openpyxl.load_workbook(self.excel_path)
ws = wb['test']
for x,tmp1 in list(enumerate(rgb_list)):
print('总共有%s行,已填充%s行,还剩下%s行'%(len(rgb_list),x+1,len(rgb_list)-x-1))
for y ,tmp2 in list(enumerate(tmp1)):
ws.cell(x+1,y+1).fill = openpyxl.styles.fills.GradientFill(stop=[str(tmp2),str(tmp2)])
wb.save(self.excel_path)
excel_path='test23.xlsx'
image_path='tttt.png'
image=ImageToExcel(image_path,excel_path)
image.color_fill()
最后四行前两行可以直接写在第三行中,就是对象的实例化中
另外还有一点,image_path中的 tttt.jpg是直接和我的py文件放在一起的,不然运行会报错。

四、结语

好啦,到此所有东西已全部搞定,当然还有很多要注意的:

第一、方法3中红绿蓝的提取中这部分的编号是刚好相反的,提取时候需要注意。

如下:

当然你也可以尝试改变这个值看最后会得到什么结果。蓝色的太阳、红色的天空或者是绿色的帽子,这个就你们自己发挥了。

第二、除了以上一点需要注意的,还有一个需要注意,就是像素不能太高。我测试了下342*218的话我的i7-6700u打开excel就不是很流畅了。

你可以遍历的时候以2个像素点或者四个像素点为步长,不过这样我没试过,可能颗粒感比较明显吧(自己猜测没试过),或者把原始图片修改下。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码