吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6067|回复: 16
收起左侧

[Python 转载] 图片转excel(单元格填充像素颜色)

  [复制链接]
Anolecrab 发表于 2022-1-21 11:36
本帖最后由 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

[Python] 纯文本查看 复制代码
# - * - coding:utf-8 - * -
#  作者:Elias Cheung
#  编写时间:2022/1/20  14: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[str, 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], (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[0]):
        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[0]
    print(sht)
    for cell_info in colour_and_cord:
        r, g, b = cell_info[0]
        x, y = cell_info[1]
        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[0], resized[1])
    book = create_excel(resized[1])
    draw_excel(book, colours)

免费评分

参与人数 4吾爱币 +5 热心值 +4 收起 理由
噫哥哥 + 1 + 1 我很赞同!
Mainos + 2 + 1 热心回复!
jiaokeer + 1 + 1 试一试看看效果如何
vapour + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
挺有意思的,谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表