使用Python在Excel中展示图片

Python 中有个名为 xlwings 的库,它能使我们用 Python 操作 Excel,操作方式与Excel自带的 VBA 类似。最近经常使用VBA调整表格的样式,像是调整单元格的大小和填充颜色之类的,于是产生了一个想法:用Excel展示图片。具体做法可以分为以下几步:

  1. 使用 Python 读取一张图片的RBG值
  2. 通过 xlwings 打开一张Excel表格
  3. 根据图片的像素调整表格的单元格
  4. 将第一步获取的RBG值填充到第三步的单元格中

首先选取一张图片
使用Python在Excel中展示图片_第1张图片
使用下面的代码可以查看该图片的信息

from PIL import Image
img = np.array(Image.open('C:/Users/Administrator/Desktop/图片/01.jpg'))   #打开图片
print(img.shape)

然后根据图片的信息调整Excel表格并填充单元格,整个流程如下:

import xlwings as xw
from PIL import Image
import pandas as pd
import numpy as np
wk = xw.books.active           #激活Excel文件
img = np.array(Image.open('C:/Users/Administrator/Desktop/图片/01.jpg'))     #打开图片  
#选中“Sheet1”并调整行距和列距
sht = wk.sheets("Sheet1")
sht[:162,:225].column_width = 0.12  #为了加快填充速度,只选出了其中四分之一的像素
sht[:162,:225].row_height = 2
sht[:162,:225].color = [255,255,255]
for i in range(161):
    for j in np.arange(225):
        l = []
        a = img[2*i,2*j]
        l.append(int(a[0]))   #将PIL 中的列表转为xlwings可以识别的列表
        l.append(int(a[1]))
        l.append(int(a[2]))
        #print(l)
        if l != [255, 255, 255]:   #跳过颜色为纯白的像素
            sht[int(i),int(j)].color = l

效果如下
使用Python在Excel中展示图片_第2张图片

用这种方法处理彩色图片时速度比较慢,比如下面这张图是通过填充大约10万个单元格得到的,花了接近一个小时
使用Python在Excel中展示图片_第3张图片

下面给出一些处理图片及像素常用的操作:

#1.需要调用的包
import xlwings as xw
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

#2.打开文件及图片
wk = xw.Book(r'C:/Users/Administrator/Desktop/test.xlsx')  #打开Excel文件
img = np.array(Image.open('d:/picture.jpg'))  #打开图像并转化为数字矩阵

#3.展示图片
plt.figure("")
plt.imshow(img)
plt.axis('off')
plt.show()

#4.查看图片信息
print(img.shape)
print(img.dtype)
print(img.size)
print(type(img)
#如果是RGB图片,那么转换为array之后,就变成了一个rows*cols*channels的三维矩阵,因此可以使用img[i,j,k]来访问像素值。

#5.随机生成5000个椒盐
rows,cols,dims=img.shape
for i in range(5000):
    x=np.random.randint(0,rows)
    y=np.random.randint(0,cols)
    img[x,y,:]=255   
plt.figure("beauty")
plt.imshow(img)
plt.axis('off')
plt.show()

#6.将像素二值化
img=np.array(Image.open('d:/picture.jpg').convert('L'))

#7.对像素的索引
img[i,:] = im[j,:]   #将第 j 行的数值赋值给第 i 行
img[:,i] = 100       #将第 i 列的所有数值设为 100
img[:100,:50].sum()  #计算前 100 行、前 50 列所有数值的和
img[50:100,50:100]   #50~100 行,50~100 列(不包括第 100 行和第 100 列)
img[i].mean()        #第 i 行所有数值的平均值
img[:,-1]            #最后一列
img[-2,:] (or im[-2])#倒数第二行

你可能感兴趣的:(Python,Python,Excel,xlwings)