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

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

通过解析图片像素值,然后在 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 个单元格手动填色……太恐怖了!用程序,几秒钟搞定。

实现原理

核心思路很简单:

读取图片:用 OpenCV 加载图像,获取每个像素的 RGB 值。

缩放处理:为了避免高分辨率图片占用过多资源,默认将宽度固定为 320,高度按比例缩放。

生成 Excel:用 openpyxl 创建工作表,每个像素对应一个单元格,填充对应颜色的 PatternFill。

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_letter

class 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.shape

bytes_per_line = ch * w

q_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_path

else:

return None

def huizhi(self):

"""绘制图片到 Excel"""

if not hasattr(self, 'img_ori') or self.img_ori is None:

QMessageBox.warning(self, "警告", "请先选择图片!")

return

excel_path = self.excelPathLineEdit.text()

if not excel_path:

QMessageBox.warning(self, "警告", "请先选择 Excel 文件保存路径!")

return

try:

# 强制缩放宽度为 320,高度按比例计算

min_width = 320

image = self.img_ori

height, width = image.shape[:2]

scale_factor = min_width / width

new_width = min_width

new_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 = 3

for 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():

break

for 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 = fill

progress.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

使用步骤

运行程序(python main.py 或双击 EXE)。

点击“选择图片”,挑选一张 PNG/JPG 等格式的图像,界面会预览。

点击“选择 Excel 路径”,设置保存文件名(.xlsx)。

点击“开始绘制”,等待进度条完成。

打开生成的 Excel,Ctrl + 滚轮缩放查看效果!(建议全屏查看)

表格内容

结语

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

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

http://www.cnnetsun.cn/news/15355.html

相关文章:

  • SQL优化实战:标量子查询改写外连接的真实案例
  • Claude Code 杀疯了!首创“后台实习生”模式,这才是真正的 AI 结对编程!
  • 多进程环境中解决 PHP 文件系统锁定问题指南
  • 浅谈InheritableThreadLocal---线程可继承的小书包
  • Jellyfin Android TV客户端音频播放异常问题深度解析
  • HFI高频方波注入方案stm32f405 无感FOC控制 直接闭环启动 永磁同步电机无感控制...
  • CTR预测系统构建实战:从FM到DeepFM的推荐算法演进之路
  • 从零玩转RT-Thread(22):定时器底层机制揭秘
  • B站缓存视频转换完整教程:m4s-converter高效管理本地视频
  • 解锁企业级后台管理:用Vue.js和Element-UI构建高效前端解决方案
  • WMS 和 ERP 先上哪个?行业内幕:仓库没打好地基,什么 ERP 都白搭
  • WiFi放大器小白指南:从选购到安装的完整教程
  • AI如何革新虚拟光驱开发?自动化代码生成实战
  • 2024年全国平均身高数据统计可视化分析
  • 1小时打造Mac专属SSH工具:快马平台实战
  • PIKE-RAG知识库本地化部署之分块
  • DREAM3D完整指南:从入门到精通的材料科学数据分析解决方案
  • 靠谱的自动供包环线分拣机生产厂家
  • 5分钟用VSCode在Ubuntu上搭建Web应用原型
  • 24小时挑战:用AI快速打造‘旺仔‘风格IP原型
  • 零基础搞定Umi项目自动化部署:从代码到上线的完整指南
  • 数学分析简明教程——6.2
  • SSM物业缴费管理系统u8mx4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
  • 如何在PowerPoint中轻松插入LaTeX公式:终极解决方案
  • Ultralytics YOLOv11终极性能优化:从配置到实战的完整指南
  • 突破传统:3大实战方法让GLM语言模型成为你的AI生产力工具
  • 3步快速解决HeyGem.ai性能问题:终极优化指南
  • 自助项目全解析:适配老板画像业态选择指南
  • 传统链表OUT了!侵入式链表让Nginx、TCMalloc 性能飞跃的秘密武器
  • MinIO效率革命:传统存储方案对比实测