1. 程式人生 > >使用Python在Excel中展示圖片

使用Python在Excel中展示圖片

使用Python在Excel中展示圖片

Python 中有個名為 xlwings 的庫,它能使我們用 Python 操作 Excel,操作方式與Excel自帶的 VBA 類似。最近經常使用VBA調整表格的樣式,像是調整單元格的大小和填充顏色之類的,於是產生了一個想法:用Excel展示圖片。具體做法可以分為以下幾步:

  1. 使用 Python 讀取一張圖片的RBG值
  2. 通過 xlwings 開啟一張Excel表格
  3. 根據圖片的畫素調整表格的單元格
  4. 將第一步獲取的RBG值填充到第三步的單元格中

首先選取一張圖片
在這裡插入圖片描述
使用下面的程式碼可以檢視該圖片的資訊

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

效果如下
在這裡插入圖片描述

用這種方法處理彩色圖片時速度比較慢,比如下面這張圖是通過填充大約10萬個單元格得到的,花了接近一個小時
在這裡插入圖片描述

下面給出一些處理圖片及畫素常用的操作:

#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])#倒數第二行