使用Python在Excel中展示圖片
阿新 • • 發佈:2018-11-29
使用Python在Excel中展示圖片
Python 中有個名為 xlwings 的庫,它能使我們用 Python 操作 Excel,操作方式與Excel自帶的 VBA 類似。最近經常使用VBA調整表格的樣式,像是調整單元格的大小和填充顏色之類的,於是產生了一個想法:用Excel展示圖片。具體做法可以分為以下幾步:
- 使用 Python 讀取一張圖片的RBG值
- 通過 xlwings 開啟一張Excel表格
- 根據圖片的畫素調整表格的單元格
- 將第一步獲取的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])#倒數第二行