如何用Python中19行代碼把照片寫入到Excel中
1、前言
這里說的,不是截取一張圖片,粘貼到excel;而是通過像素寫入到excel中,下面來看看具體的實現(xiàn)過程吧
2、代碼實戰(zhàn)
2.1 思路
我們今天要分享的,是把圖片寫入到excel中,
我們來捋一下思路:
- 準備源圖片,目標
excel
; - 通過
Pillow
來讀圖片的取像素(RGB); - 通過
openpyxl
向excel cell
內(nèi)填充十六進制色值; - 最后把轉(zhuǎn)換的RGB像素直接寫入到
excel
中; - 說到這里,就們就來分步實現(xiàn)。
2.2 文件準備
需要寫入而Excel的源圖片:
2.3 實戰(zhàn)
安裝:
本次需要用到兩個模塊: Pillow
和 openpyxl
。
老規(guī)矩, pip 方式安裝:
pip install Pillow? pip install openpyxl?
2.4 色值轉(zhuǎn)換
由于 圖片讀取的像素是RGB值,而excel
是十六進制寫入,
所以需要定義一個RGB與十六進制轉(zhuǎn)換的函數(shù)
''' 定義RGB 和十六進制色值轉(zhuǎn)換函數(shù) ''' def rgb_to_hex(rgb): ? ? rgb = rgb.split(',') ? ? color = '' ? ? #循環(huán)遍歷 ? ? for i in rgb: ? ? ? ? num = int(i) ? ? ? ? color ?+= str(hex(num))[-2:].replace('x','0').upper() ? ? return ?color
2.5 圖片轉(zhuǎn)換
此操作是逐行讀取圖片的 RGB
色值,再將 RGB 色值轉(zhuǎn)換為十六進制色值填充到 Excel 的 cell 中。
逐行讀取圖片中的RGB色值,再將RGB色值轉(zhuǎn)換十六進制,填充到excel中:
def img_to_excel(img_path,excel_path): ? ? #讀取源圖片 ? ? img_src = Image.open(img_path) ? ? #設(shè)置圖片寬高 ? ? img_width = img_src.size[0] ? ? img_hight = img_src.size[1] ? ? #圖片加載 ? ? str_strlist = img_src.load() ? ? #獲取當前的excel文件 ? ? wb = openpyxl.Workbook() ? ? #保存文件 ? ? wb.save(excel_path) ? ? #打開excel_path 下的excel文件,并寫入信息 ? ? wb = openpyxl.load_workbook(excel_path) ? ? cell_width,cell_height = 1.0,1.0 ? ? #設(shè)置excel的寫入頁 ? ? sheet = wb['Sheet'] ? ? #循環(huán)圖片的高與寬,并存入 ? ? for w in range(img_width): ? ? ? ? for h in range(img_hight): ? ? ? ? ? ? data = str_strlist[w,h] ? ? ? ? ? ? color = str(data).replace("(","").replace(")","") ? ? ? ? ? ? color ?= rgb_to_hex(color) ? ? ? ? ? ? #設(shè)置填充顏色為color ? ? ? ? ? ? fille = PatternFill("solid",fgColor = color) ? ? ? ? ? ? sheet.cell(h + 1,w + 1).fill = fille ? ? #循環(huán)遍歷row,讓其全部寫入 ? ? for i in range(1,sheet.max_row + 1): ? ? ? ? sheet.row_dimensions[i].height = cell_height ? ? #循環(huán)遍歷column,讓其全部寫入 ? ? for i in range(1,sheet.max_column + 1): ? ? ? ? sheet.column_dimensions[get_column_letter(i)].width = cell_width ? ? #保存文件 ? ? wb.save(excel_path) ? ? #關(guān)閉 ? ? img_src.close()
2.6 代碼整合
import ?openpyxl from openpyxl.styles import PatternFill from openpyxl.utils import ?get_column_letter from PIL import Image,ImageFont,ImageDraw,ImageColor ''' 色值轉(zhuǎn)換: 從圖片讀取的像素塊色值是 RGB 值, RGB 和十六進制色值轉(zhuǎn)換。 ''' def rgb_to_hex(rgb): ? ? rgb = rgb.split(',') ? ? color = '' ? ? #循環(huán)遍歷 ? ? for i in rgb: ? ? ? ? num = int(i) ? ? ? ? color ?+= str(hex(num))[-2:].replace('x','0').upper() ? ? return ?color ''' 圖片轉(zhuǎn)換: 逐行讀取圖片中的RGB色值,再將RGB色值轉(zhuǎn)換十六進制,填充到excel中 ''' def img_to_excel(img_path,excel_path): ? ? #讀取源圖片 ? ? img_src = Image.open(img_path) ? ? #設(shè)置圖片寬高 ? ? img_width = img_src.size[0] ? ? img_hight = img_src.size[1] ? ? #圖片加載 ? ? str_strlist = img_src.load() ? ? #獲取當前的excel文件 ? ? wb = openpyxl.Workbook() ? ? #保存文件 ? ? wb.save(excel_path) ? ? #打開excel_path 下的excel文件,并寫入信息 ? ? wb = openpyxl.load_workbook(excel_path) ? ? cell_width,cell_height = 1.0,1.0 ? ? #設(shè)置excel的寫入頁 ? ? sheet = wb['Sheet'] ? ? #循環(huán)圖片的高與寬,并存入 ? ? for w in range(img_width): ? ? ? ? for h in range(img_hight): ? ? ? ? ? ? data = str_strlist[w,h] ? ? ? ? ? ? color = str(data).replace("(","").replace(")","") ? ? ? ? ? ? color ?= rgb_to_hex(color) ? ? ? ? ? ? #設(shè)置填充顏色為color ? ? ? ? ? ? fille = PatternFill("solid",fgColor = color) ? ? ? ? ? ? sheet.cell(h + 1,w + 1).fill = fille ? ? #循環(huán)遍歷row,讓其全部寫入 ? ? for i in range(1,sheet.max_row + 1): ? ? ? ? sheet.row_dimensions[i].height = cell_height ? ? #循環(huán)遍歷column,讓其全部寫入 ? ? for i in range(1,sheet.max_column + 1): ? ? ? ? sheet.column_dimensions[get_column_letter(i)].width = cell_width ? ? #保存文件 ? ? wb.save(excel_path) ? ? #關(guān)閉 ? ? img_src.close() if __name__ == '__main__': ? ? #源圖片地址 ? ? img_path = './queue.jgp' ? ? #保存excel地址 ? ? excel_path = './queue.xlsx' ? ? #執(zhí)行 ? ? img_to_excel(img_path, excel_path)
2.7 運行結(jié)果
3、總結(jié)
這里提醒一下:
如果你的源圖片很大,運行完成后,打開Excel會提示文件損壞,
因為Excel的行數(shù)有限,導(dǎo)致無法全部寫完數(shù)據(jù)。
Excel報錯詳情:
xml報錯詳情:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><logFileName>error254800_05.xml</logFileName><summary>在文件“D:\Project\img\king.xlsx”中檢測到錯誤</summary><removedParts><removedPart>已刪除的部件: 部件 /xl/styles.xml。 (樣式)</removedPart></removedParts><repairedRecords><repairedRecord>已修復(fù)的記錄: /xl/worksheets/sheet1.xml 部分的 單元格信息</repairedRecord></repairedRecords></recoveryLog>
到此這篇關(guān)于如何用Python中19行代碼把照片寫入到Excel中的文章就介紹到這了,更多相關(guān)Python3把照片寫入到Excel中內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 3.x讀寫csv文件中數(shù)字的方法示例
在我們?nèi)粘i_發(fā)中經(jīng)常需要對csv文件進行讀寫,下面這篇文章主要給大家介紹了關(guān)于Python 3.x讀寫csv文件中數(shù)字的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08Django?url.py?path?name同一app下路由別名定義
這篇文章主要為大家介紹了Django?url.py?path?name同一app下路由別名定義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07Python 字符串操作實現(xiàn)代碼(截取/替換/查找/分割)
這篇文章主要介紹了Python 字符串截取/替換/查找/分割等實現(xiàn)方法,需要的朋友可以參考下2013-06-06python實現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法
這篇文章主要介紹了python實現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法,涉及Python實現(xiàn)格式轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04Python使用random模塊實現(xiàn)擲骰子游戲的示例代碼
這篇文章主要介紹了Python使用random模塊實現(xiàn)擲骰子游戲的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04