有趣的Python:Excel作画

作者: whybask | 来源:发表于2019-03-17 21:29 被阅读203次

    前段时间看到一个新闻:日本74岁老人用Excel画画 栩栩如生!,的确很美,许多网友看了之后感叹“我可能用了假的Excel”。

    作为一个码农,虽然缺少绘画的艺术细胞,但特别擅长用程序来处理数字化的信息。说白了,excel也是一个数字化的文件嘛,那么从一个现有的图片,读取每个像素的颜色值,然后再填充到excel对应单元格,不就完成了Excel作画吗?

    所干就干,代码如下:

    from openpyxl import Workbook
    from openpyxl.utils import get_column_letter
    from openpyxl.styles import PatternFill, Color
    from PIL import Image
    
    # 定义常量
    IMAGE_FILE = 'starsky.jpg'  # 图片的文件名
    IMAGE_MAX_SIZE = 400  # 图片长边像素的最大值,如果超出此值,将缩小图片。
    
    img = Image.open(IMAGE_FILE)
    print('image\'s type is %s' % img.format)
    
    # 修正图片尺寸
    img_width, img_height = img.size
    print('image\'s size is (%s, %s)' % (img_width, img_height))
    if img_width > IMAGE_MAX_SIZE:
        img_height = int(img_height * IMAGE_MAX_SIZE / img_width)
        img_width = IMAGE_MAX_SIZE
    
    if img_height > IMAGE_MAX_SIZE:
        img_width = int(img_width * IMAGE_MAX_SIZE / img_height)
        img_height = IMAGE_MAX_SIZE
    
    img.thumbnail((img_width, img_height))  # 缩小图片尺寸
    print('image\'s new size is (%s, %s)' % (img_width, img_height))
    
    # 由于excel对单元格填充色有要求,所以用以下两行代码把图片转换为8位色值
    img = img.convert('P')
    img = img.convert('RGB')
    
    pix = img.load()
    
    workbook = Workbook()
    worksheet = workbook.active
    print('begin convert, please waiting...')
    
    # 获取每个像素的色值,并填充到单元格
    for row in range(1, img_height):
        for col in range(1, img_width):
            cell = worksheet.cell(column=col, row=row)
            point = pix[col-1, row-1]
            color = "FF%02X%02X%02X" % (point[0], point[1], point[2])
            cell.fill = PatternFill(patternType='solid', fgColor=Color(rgb=color))
        worksheet.row_dimensions[row].height = 6
    
    for col in range(1, img_width):
        worksheet.column_dimensions[get_column_letter(col)].width = 1
    
    # 保存生成的excel文件
    workbook.save(filename='output.xlsx')
    print('Complete.')
    

    下载了一副梵高的“星空”,然后执行上面的程序

    "C:\Program Files\Python36\python.exe"
    image's type is JPEG
    image's size is (658, 483)
    image's new size is (400, 293)
    begin convert, please waiting...
    Complete.
    

    打开生成的“output.xlsx”文件,效果截图如下:


    100%比例显示下的马赛克效果

    缩小Excel的显示比例查看全图,效果如下:


    缩小显示比例的全图效果

    以上的实践比较有趣,虽然暂时还没有什么实用价值,但掌握了以下python知识:

    • 用“PIL”库读取、处理图片
    • 用“openpyxl”库操作Excel文件

    另外:

    1. 日本老爷子是原创作画,的确佩服,博闻广见,才能向高人学习、拓展思路;
    2. 拥有抽象思维,可以做到“用代码实现所有重复性的信息化操作”。

    相关文章

      网友评论

        本文标题:有趣的Python:Excel作画

        本文链接:https://www.haomeiwen.com/subject/vnepmqtx.html