当前位置: 首页 > news >正文

我把Excel变成了像素画板!用Python实现图片到单元格的映射

 视频演示

 

我把Excel变成了像素画板!用Python实现图片到单元格的映射


 

大家好,这里是Coding茶水间!

最近做了一个有趣的小工具:用 Python 把任意图片“复刻”成 Excel 表格艺术。

通过解析图片像素值,然后在 Excel 单元格中填充对应颜色,就能生成一张由无数小方格组成的“像素画”。

这个工具不复杂,适合对图像处理和自动化感兴趣的小伙伴研究。

在这篇图文教程中,我会一步步带你了解工具的原理、代码实现和使用方法。

代码基于 PyQt5(GUI 界面)、OpenCV(图像处理)和 openpyxl(Excel 操作),简单易上手。感兴趣的同学可以直接 fork 代码试试!

工具效果预览

先来看看成品效果吧!左边是原图,右边是生成的 Excel 艺术(每个单元格就是一个像素)。

wechat_2025-10-10_171303_678

 

另一个例子,我换了张猫咪图片,生成后效果如下:

wechat_2025-10-11_113608_678

(截图说明:工具自动缩放图片到 320 宽,生成低分辨率 Excel 以节省资源,但细节依然清晰)

手工操作这种效果?想想看,一张 320x240 的图片就需要 76,800 个单元格手动填色……太恐怖了!用程序,几秒钟搞定。

实现原理

核心思路很简单:

  1. 读取图片:用 OpenCV 加载图像,获取每个像素的 RGB 值。
  2. 缩放处理:为了避免高分辨率图片占用过多资源,默认将宽度固定为 320,高度按比例缩放。
  3. 生成 Excel:用 openpyxl 创建工作表,每个像素对应一个单元格,填充对应颜色的 PatternFill。
  4. GUI 界面:PyQt5 提供简单界面,选择图片和保存路径,一键绘制,还带进度条显示。

环境准备

  • Python 3.8+
  • 依赖库:pip install PyQt5 opencv-python openpyxl numpy
  • UI 文件:用 Qt Designer 设计 excel_ui.py(我用的是一个简单的窗口,包含图片预览、路径输入和按钮)。

如果懒得配置环境,我还打包了 EXE 可执行文件(脱离 Python 环境)

完整代码

下面是核心代码,分为主窗口类和入口。代码不长,注释详尽。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox, QProgressDialog
from PyQt5.QtGui import QImage, QPixmap
from excel_ui import Ui_MainWindow  # Qt Designer 生成的 UI 文件
from PyQt5.QtCore import Qt, QTimer
import cv2
import numpy as np
import openpyxl
from openpyxl.styles import PatternFill
from openpyxl.utils import get_column_letterclass MainWindow(QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super().__init__(parent)self.setupUi(self)self.img_ori = None  # 存储原始图像def select_pic(self):"""选择图片并预览"""file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files(*.png *.jpg *.jpeg *.bmp)")if file_path:self.img_ori = cv2.imread(file_path)img = cv2.cvtColor(self.img_ori, cv2.COLOR_BGR2RGB)h, w, ch = img.shapebytes_per_line = ch * wq_image = QImage(img.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)q_pixmap = QPixmap.fromImage(q_image)self.imageLabel.setPixmap(q_pixmap.scaled(self.imageLabel.width(), self.imageLabel.height(),Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation))def select_excel(self):"""选择 Excel 保存路径"""file_path, _ = QFileDialog.getSaveFileName(self,"设置 Excel 路径","","Excel Files (*.xlsx *.xls)")if file_path:self.excelPathLineEdit.setText(file_path)return file_pathelse:return Nonedef huizhi(self):"""绘制图片到 Excel"""if not hasattr(self, 'img_ori') or self.img_ori is None:QMessageBox.warning(self, "警告", "请先选择图片!")returnexcel_path = self.excelPathLineEdit.text()if not excel_path:QMessageBox.warning(self, "警告", "请先选择 Excel 文件保存路径!")returntry:# 强制缩放宽度为 320,高度按比例计算min_width = 320image = self.img_oriheight, width = image.shape[:2]scale_factor = min_width / widthnew_width = min_widthnew_height = int(height * scale_factor)image = cv2.resize(image, (new_width, new_height))# 创建 Excel 工作簿workbook = openpyxl.Workbook()sheet = workbook.active# 设置单元格为正方形(宽度 3,高度 17)for col in range(1, new_width + 1):sheet.column_dimensions[get_column_letter(col)].width = 3for row in range(1, new_height + 1):sheet.row_dimensions[row].height = 17# 创建进度条progress = QProgressDialog("正在绘制图片到 Excel...", "取消", 0, new_height, self)progress.setWindowTitle("进度")progress.setWindowModality(Qt.WindowModal)progress.setValue(0)# 遍历图片像素并填充 Excel 单元格for y in range(new_height):if progress.wasCanceled():breakfor x in range(new_width):b, g, r = image[y, x]  # OpenCV 默认 BGR 格式color = "{:02x}{:02x}{:02x}".format(r, g, b)  # 转换为 RGB 格式的十六进制if color == "000000":color = "010101"  # 纯黑色替换为深灰色fill = PatternFill(start_color=color, end_color=color, fill_type="solid")sheet.cell(row=y + 1, column=x + 1).fill = fillprogress.setValue(y + 1)QApplication.processEvents()  # 确保 UI 更新# 保存 Excel 文件if not progress.wasCanceled():workbook.save(excel_path)QMessageBox.information(self, "成功", "图片已成功绘制到 Excel 文件!")progress.close()except Exception as e:QMessageBox.critical(self, "错误", f"绘制失败: {str(e)}")if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec())

代码亮点解析

  • 图像预览:select_pic() 用 QImage 实时显示选中的图片,保持宽高比。
  • 缩放优化:cv2.resize() 固定宽度 320,避免高分辨率卡顿。实际 Excel 文件大小控制在合理范围内。
  • 像素填充:双层循环遍历 (y, x),转 RGB 十六进制,应用 PatternFill。进度条用 QProgressDialog 实时反馈。
  • 异常处理:捕获保存错误,友好提示。

wechat_2025-10-11_113721_605

使用步骤

  1. 运行程序(python main.py 或双击 EXE)。
  2. 点击“选择图片”,挑选一张 PNG/JPG 等格式的图像,界面会预览。
  3. 点击“选择 Excel 路径”,设置保存文件名(.xlsx)。
  4. 点击“开始绘制”,等待进度条完成。
  5. 打开生成的 Excel,Ctrl + 滚轮缩放查看效果!(建议全屏查看)

表格内容

结语

这个小工具就是下午“无聊”时写的,编程的乐趣就在于把不可能变可能。

如果你有图像处理项目灵感,评论区聊聊~别忘了三连(点赞、收藏、关注)支持下,更多干货见!

如果代码有 bug 或优化建议,随时 issue 我。玩得开心!

http://www.hskmm.com/?act=detail&tid=28671

相关文章:

  • 如何通过内核版本检查判断FreeBSD是否需要重启
  • 2025 年山东染井吉野樱 / 高杆染井吉野樱花 / 染井吉野樱花小苗厂家推荐:绿影园林的培育技术与全规格供应解析
  • C#中关于InvokeRequired 属性 与Invoke方法
  • 云存储成本自动优化技术解析
  • MZOI 20251011【CSP-】模拟 T2 序列区间
  • SAP 中CONCATENATE 空格的时候,空格不生效
  • Java的各类定时任务实现
  • 03:运算符
  • JavaScript内存泄露原因及解决方案
  • 数据类型扩展
  • 2025 年最新金蝶云服务商推荐榜单:聚焦铂金伙伴技术实力与万级客户口碑,助力企业数字化转型精准选型上海金蝶云服务商推荐
  • OIFHA251011 比赛总结
  • P2051 [AHOI2009] 中国象棋 个人题解
  • 一种智能调度分布式路径计算解决方案
  • 使用 C++ 和 minizip 实现 ZIP 压缩解压工具
  • 一看就懂,Oracle认证体系中的OCP中级认证
  • 2025 年试验机生产厂家最新推荐榜单:聚焦优质企业,助力精准选购高低温等各类试验设备弹簧拉压/弹簧疲劳/高频弹簧疲劳/U型弹簧专用试验机厂家推荐
  • IIS/如何查看IIS上部署网站的实时连接数
  • 拼叨叨砍价系统:实体店低成本引流的营销利器
  • 2025 自动门生产厂家最新推荐榜:权威筛选优质品牌,含选购指南与实力厂家深度解析
  • 医德出诊排班挂号管理系统:医院高效运营与便民服务的智能解决方案
  • 一佳教育培训课程系统小程序:一站式教育数字化解决方案
  • Supabase:无需后端代码的 Web 开发完整解决方案
  • Halo RAG!
  • SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
  • 2025 木饰面源头厂家最新推荐榜单:21 年标杆企业领衔,背景墙/全屋 /格栅/碳晶板全品类最新推荐及选购指南
  • 2025 年北京市管道疏通公司最新推荐排行榜:覆盖多城区、高压技术赋能的优质企业优选榜单西城区/朝阳区/丰台区/石景山/海淀区管道疏通公司推荐
  • 2025 年北京市清理化粪池公司最新推荐排行榜:聚焦高压技术与全城服务的权威甄选朝阳区/丰台区/海淀区/通州区清理化粪池厂家推荐
  • 报表方案Stimulsoft 2025.4 重磅发布!新增AI报表助手、C#脚本支持、全新图表类型等多项功能!
  • Prometheus的Exporter的数据采集机制