当前位置 博文首页 > 周旋_的博客:python写情人节女朋友的EXCEL画像!

    周旋_的博客:python写情人节女朋友的EXCEL画像!

    作者:[db:作者] 时间:2021-06-02 18:31

    祝大家心想事成,永不被渣,得其所爱,幸福美满。

    给大家准备了一份已经写好的代码,利用python+opencv+openpyxl,opencv实现读取图片像素颜色,然后openpyxl自动填充Excal表格对应单元格背景颜色,得到一副Excal填充图画。文末代码下载链接。

    先来看看效果叭(gif动图)!
    img
    (换成你女朋友的照片,效果会比二次元好很多,因为更加逼真了)
    然后看代码叭!(兄弟们店点赞)。

    配置环境

    我们需要用到python以及openpyxl和opencv包,没有下载的小伙伴可以去配置一下,超级简单:

    大概就是在python终端(看个人环境)执行:

    pip install opencv-python
    pip install openpyxl
    

    配置完成后就是导入我们需要的包了,这儿不需要过多了解:

    #导入opencv和openpyxl
    import openpyxl
    import cv2 as cv
    import numpy as np
    from openpyxl import load_workbook
    from openpyxl import workbook
    # 导入字体、边框、颜色以及对齐方式相关库
    from openpyxl.styles import Font, Border, Side, PatternFill, colors, Alignment
    

    读取Excal表格

    我们首先需要读取一个xlsx格式的Excal表格,需要提前在工作路径或者某绝对路径进行创建,并自定义命名,然后我们得到了一个表格对象sheet,就可以对它进行读写设置等操作了。

    #设置路径
    #file_path = r"L:\jupyter notebook_code\file\zhaopian.xlsx"  #绝对路径
    # 加载工作簿
    wb = load_workbook(filename='zhaopian.xlsx') #默认工作路径,zhaopian.xlsx为Excal表格名称,自行更改
    # 获取活动中的表格
    sheet = wb.active
    print("open sheet:", sheet.title) #打印表格标题
    print("row:", sheet.max_row, "column:", sheet.max_column)
    

    opencv读取图像并显示

    #opencv读取图像并显示
    '''
    opencv的imread函数读取图片到srcImage
    如果按原始大小读取图片,可以改为:srcImage = cv.imread('zhu.jpg')
    加上第二个参数33:srcImage = cv.imread('zhu.jpg',33)
    表示将原图缩为原来的1/4进行读取。当原图过大是可以采用
    '''
    srcImage = cv.imread('zhaopian.jpg') #zhu.jpg为照片名字,自行更改
    cv.imshow('image',srcImage)
    
    #获取图像的高,宽并打印
    height = srcImage.shape[0]
    width = srcImage.shape[1]
    print("height:", height, "width:", width)
    

    利用opencv将图像读取进来,之后我们就要利用for循环遍历图像的各个像素值了,但在这之前我们需要自定义一个函数,因为我们是用openpyxl包的

    PatternFill(fill_type='solid',fgColor= 'FFFFFF')
    

    函数填充单元格颜色的,该函数只能设置十六进制的颜色格式:

    img

    所以我们需要自己写一个函数将RGB颜色格式转换为十六进制:

    #自定义函数,将RGB颜色值转换为16进制的字符串格式
    def color_transform(value):
        digit = list(map(str, range(10))) + list("ABCDEF")
        if isinstance(value, tuple):
            string = ''
            for i in value:
                a1 = i // 16
                a2 = i % 16
                string += digit[a1] + digit[a2]
            return string
        elif isinstance(value, str):
            a1 = digit.index(value[1]) * 16 + digit.index(value[2])
            a2 = digit.index(value[3]) * 16 + digit.index(value[4])
            a3 = digit.index(value[5]) * 16 + digit.index(value[6])
            return (a1, a2, a3)
    

    该函数实现的功能:

    输入:(0,0,0),输出:000000
    输入:#FFFFFF,输出:(255, 255, 255)
    

    好了,解决了颜色转换,我们就遍历像素吧!

    #遍历循环图片,获取各像素点位置的像素值,并利用openpyxl改写对应位置单元格颜色
    for y in range(1, height):
        print("第几行:",y) #供查看进度
        for x in range(1, width):
            Blue_value = srcImage[y,x,0] #获取蓝,绿,红三个通道
            Green_value = srcImage[y,x,1]
            Red_value = srcImage[y,x,2]
            color = (Red_value,Green_value,Blue_value) #转为元组并附给color_transform函数得到16进制
            hex_ = color_transform(color)
            fille = PatternFill(fill_type='solid',fgColor= hex_) #设置颜色
            sheet.cell(y,x).fill=fille #openpyxl进行颜色填充
    

    具体大家看注释了,大概就是遍历像素并读取RGB像素值,然后传给color_transform函数进行转换,然后赋值给openpyxl的PatternFill进行Excal表格填充。

    还有一步,就是保存了:

    wb.save(filename = 'zhaopian.xlsx')  # 保存工作簿
    print("保存成功")
    
    cv.waitKey(30)#图片展示30ms
    cv.destroyAllWindows()
    

    完整代码下载链接:

    链接:如果失效了可以来公众号【Opencv视觉实践】找我拿。
    https://pan.baidu.com/s/1QOw28b-8tQpUp2j0qz26rg
    提取码:02q9

    最后一步!超重要

    上面程序完毕之后,我们只是完成了单元格的填充,但我们知道,单元格不是正方形,运行完图片是扁平的:

    img

    所以还需要我们手动更改一下单元格的大小,其实openpyxl也是可以做到的,但我也是第一天用openpyxl,也不熟练,能动手就动手吧,毕竟最麻烦的已经完成了。

    还有还有!在发给对象之前,一定把excal表格打开看一下,确保是这样的:

    img

    也就是缩放正常的表格,只有这样,当她滚动鼠标滚轮进行缩放,渐渐变成下图这样时,才会有惊喜嘛!

    img

    如果直接一打开就是上图,和一个照片也没什么两样,也就没那么惊喜了,是不是?

    THE END

    兄弟们,看在我昨晚熬夜调BUG的份上,不要吝啬你们的赞了!

    详细注释版代码下载链接:
    链接:https://pan.baidu.com/s/1R96CUkil4LgxO0oSSddxIw
    提取码:y5om