python利用PIL及openpyxl实现图片转为excel表格

最开始是看了一个b站视频,他采用了python加vba实现了将一个图片转化在excel表格当中。https://www.bilibili.com/video/av55033139?t=300
首先是python代码
这里有个相对陌生的模块pIL(Python Imaging Library),pip install Pillow即可安装
这里分析标量图里各个像素的rgb值,并生成一个txt文件

from PIL import Image
imload=Image.open("C:/Users/thinkpad/Desktop/sunmei.jpg")
im=imload.convert("RGB")
width,height=im.size
print(1)
demo=open('rgb2.txt','a')
for y in range(height):
    for x in range(width):
        rgb=im.getpixel((x,y))
        rgb=str(rgb)
        demo.write(rgb[1:-1]+"\t")
    demo.write("\n")
demo.close()

然后用excel将该txt文件打开,进入代码界面,

Sub set_rgb()
    Dim r As Range, arr
    For Each r In Range("A:AOQ")
        arr = Split(r, ",")
        r.Interior.Color = RGB(CInt(arr(0)), CInt(arr(1)), CInt(arr(2)))
    Next
    
End Sub

这里的AOQ是根据txt最右边的列名决定的(一定要看清楚!!!),由于这个vba编的有点问题,最后会报错提示下标越界,但是不影响正常结果出现,我也就没纠正。最后将列宽改成2.1-2.2左右(用来使每个单元格近似成一个正方形),最后的最后将每个单元格的数据删除就行了。
在这里插入图片描述
效果如下
在这里插入图片描述
继续放大看,由一个类似像素点的单元格组合而成。
在这里插入图片描述

当然这个是可以优化的,一是没必要保存成txt,直接保存成xlsx即可;二是vba实现的将单元格设置背景颜色的步骤也可以用python实现。整体的思路是先将rgb值直接转移到excel对应的单元格上,这一点用xlwt本应该很简单就能做到,但是!!!!xlwt只支持256列,目前一般的图片都比这个大,所以用xlwt就不行,所以我后来采用的是openpyxl,openpyxl功能很强大,能够设置字体、颜色等各种东西。经过我的研究发现他的设置颜色的值就是#加上十六进制的rgb(真是难为我这个对颜色,rgb啥的一窍不通的小白了),然后保存就比较简单了,最终优化代码如下所示;

from PIL import Image
import xlwt
import openpyxl
from openpyxl.styles import PatternFill
#因为xlwt无法输入超过256列的数据,所以在这采用oppyxl
imload=Image.open("C:/Users/thinkpad/Desktop/tiananmenguangchang.jpg")
im=imload.convert("RGB")
width,height=im.size
print(1)
xls=openpyxl.Workbook()
demo = xls.create_sheet(u'天安门广场')
#demo = xls.get_sheet_by_name(u'天安门广场')
#转化函数,由于部分十进制数转化为十六进制会是三位数比如lex(10)=0xa,,需要补0,把它变成Ox0a
def changergb(x):
    if len(x)==3:
        x='0x0'+x[-1]
    return(x)
for y in range(1,height-1):
    for x in range(1,width-1):
        rgb=im.getpixel((x,y))
        #print(rgb[0],rgb[1],rgb[2])
        r=changergb(hex(rgb[0]))
        g = changergb(hex(rgb[1]))
        b = changergb(hex(rgb[2]))
        cellcolor = (r + g + b).replace('0x', '')
        #print(cellcolor)
        rgb=str(rgb)
        fill = PatternFill("solid", fgColor=cellcolor)
        demo.cell(row=y, column=x).value=rgb[1:-1]#向单元格写入rgb值,其实已经没必要,可以注释掉
        demo.cell(row=y, column=x).fill=fill#想单元格设置填充值
xls.save(filename='tiananmenguangchagn.xlsx')

最后用pyinstaller将这些代码打包成了一个exe文件,不需要安装python啥的就能直接使用转化,就是有点大(60m左右)感兴趣的人可以自行提取 链接:https://pan.baidu.com/s/1PZS_5mztMoCXkSLrRJ6tmw
提取码:1chb

发布了23 篇原创文章 · 获赞 6 · 访问量 4668

猜你喜欢

转载自blog.csdn.net/qq_34211618/article/details/93905469