Anolecrab 发表于 2022-1-21 11:36

图片转excel(单元格填充像素颜色)

本帖最后由 Anolecrab 于 2022-1-21 11:37 编辑


之前看了《82岁老人用Excel画画,获奖无数还开画展!而你只会做表格》这个故事之后。忽然想到图片由像素构成,excel的sheet由单元格构成,
像素有颜色,单元格可以填充颜色。


也是是说:   像素<=>单元格;
那么我们就可以将图片每个像素的颜色读取出来,并根据像素坐标映射到excel对应的单元格中。
而且,python操作图片以及excel的库都比较成熟,应该很好操作
理论存在,那么就动手开干了。

先看效果:

我这里用的是花瓣大神的图,大家可以换成自己喜欢的妹子的照片,撩她一下

原图


转换后效果




示例视频:链接: https://pan.baidu.com/s/1N4sCCf8JhiXzkuw_xxfVxw密码: 60kb源码:https://github.com/craii/picture_or_phote_to_excel

# - * - coding:utf-8 - * -
#作者:Elias Cheung
#编写时间:2022/1/2014:42
import math
from xlwt import *
import xlwings as xw
from PIL import Image
from typing import Tuple


def resize_image(original_pic_path: str, resized_pic_path: str, max_resize_width: int = 256) -> Tuple:
    """
    :param original_pic_path: 【输入】需要转换成excel单元格填充的原始图片A
    :param resized_pic_path: 【输出】经过缩放后的图片A
    :param max_resize_width: 缩放后图片的最大宽度,由于xlwings限制,不可超过256
    :return:
    """
    img = Image.open(original_pic_path)
    img_width, img_height = img.size

    #以max_resize_width为基准比例,计算图片等比缩放后的宽高
    resize_width, resize_height = max_resize_width, math.ceil(img_height * max_resize_width / img_width)
    # print(resize_width, resize_height)
    resized_image = img.resize((resize_width, resize_height))
    resized_image.save(resized_pic_path)
    return resized_pic_path, (resize_width, resize_height)


def pixel_colour(image_path: str, image_size: tuple) -> list:
    """
    :param image_path: 经过缩放的图片的路径,可由resize_image()返回
    :param image_size: 经过缩放后的图片的宽高,可由resize_image()返回
    :return: 每个像素点的rgb点及对应的像素坐标
    """
    img = Image.open(image_path)
    img = img.convert('RGB')
    colour_list = img.load()

    img_width, img_height = image_size
    pixel_coordinates = [(i, j) for i in range(img_width) for j in range(img_height)]

    coordinates_and_colour_to_be_returned = [(colour_list, (i, j)) for i, j in pixel_coordinates]

    return coordinates_and_colour_to_be_returned


def create_excel(size: tuple, cell_width: int=2) -> str:
    """
    :param size: excel画布的尺寸
    :param cell_width: 每个单元格的宽度,不建议调整,此默认参数可将单个单元格大致调整为正方形
    :return: 创建并经过单元格调整的excel路径,默认为当前路径
    """
    cell_width = 256 * cell_width
    _book = Workbook(encoding="utf - 8")
    sheet = _book.add_sheet("picture", cell_overwrite_ok=True)
    for i in range(size):
      first_col = sheet.col(i)
      first_col.width = cell_width
    book_name = "picture.xls"
    _book.save(book_name)
    return book_name


def draw_excel(excel: str, colour_and_cord: list):
    """
    :param excel: 创建并经过单元格调整的excel路径,默认为当前路径
    :param colour_and_cord: 每个单元格的rgb点及对应的像素坐标
    :return:
    """
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(excel)
    sht = wb.sheets
    print(sht)
    for cell_info in colour_and_cord:
      r, g, b = cell_info
      x, y = cell_info
      try:
            sht.range((y + 1, x + 1), (y + 1, x + 1)).color = (r, g, b)
      except ValueError as e:
            # 在超过excel允许的最大列宽时出现此错误,一般由于resize_image()方法max_resize_width参数超过256时导致
            print(f"cell index out of range: {e}")
            continue
    wb.save("processed.xlsx")


if __name__ in "__main__":
    resized = resize_image(original_pic_path="kkk.jpeg", resized_pic_path="kkk.resize.png")
    print(resized)
    colours = pixel_colour(resized, resized)
    book = create_excel(resized)
    draw_excel(book, colours)

Mainos 发表于 2022-1-21 16:20

本帖最后由 Mainos 于 2022-1-21 18:01 编辑

反手编译了一下,自己查毒。
http://tmp.link/f/61ea6c1d9f1ce
https://wss1.cn/f/7f01xiusi3u
https://a.7xsh.top/s/ZXvdqsy
https://wormhole.app/rA0Ao#i4XhySfzcCv_DT6Zfw_yyg

使用方法
1、搞一个名称为in.jpg的图片放同目录
2、执行exe
3、等待(等不急打开任务管理器看看)
没界面,没窗口....

michael45645 发表于 2022-1-21 17:35

Mainos 发表于 2022-1-21 16:20
反手编译了一下,自己查毒。
http://tmp.link/f/61ea6c1d9f1ce
https://wss1.cn/f/7f01xiusi3u


确实不能用

zhengxinjun 发表于 2022-1-21 11:55

下来试一下效果如何

抢师太的秃驴 发表于 2022-1-21 12:10

这个玩过,稍微大点的图要转换好久啊..不过拿来哄妹纸挺好用的.哈哈

jfy168 发表于 2022-1-21 12:10

继续学习。

shallies 发表于 2022-1-21 13:35

牛逼,收藏了!

sxhzsj 发表于 2022-1-21 14:07

谢谢分享,让我长见识了

sp0770 发表于 2022-1-21 14:20

真的长见识了,没想到一个做表格的还能画画

xuanmuluck 发表于 2022-1-21 15:06

如果列数超过256的话,先降下维会不会更好些?

噫哥哥 发表于 2022-1-21 16:04

挺有意思的,谢谢
页: [1] 2
查看完整版本: 图片转excel(单元格填充像素颜色)