如何使用Python逐像素绘制图像并生成绘制过程视频
逐像素绘制灰度图生成视频实现方案
用Python+OpenCV可以快速实现这个需求,全程不需要手动操作剪辑软件,代码跑一遍直接出成品,步骤如下:
前期准备
先安装依赖库,执行命令:pip install numpy opencv-python
核心实现逻辑
别做一帧填一个像素的傻事——1000*1000一共100万像素,按30fps算要播9个多小时,文件几十上百G完全没法用。正确的做法是根据你想要的总视频时长,计算每帧需要填充的像素数量,兼顾绘制过程的观感和文件体积。
- 读取输入的1000x1000灰度图,转成numpy数组存储像素值
- 初始化同尺寸的纯白色画布,灰度模式下纯白像素值为255
- 提前生成像素填充顺序的坐标列表,默认可以选从上到下、从左到右的逐行扫描顺序,想要特殊效果可以改成随机乱序、螺旋扩散、中心向外扩散等规则
- 配置视频输出参数:选定帧率(一般30fps足够)、总时长(比如10秒),计算得出每帧需要填充的像素数=总像素数/(帧率*总时长)
- 循环生成每一帧:按顺序给画布填充对应数量的像素值,把当前帧写入视频流,直到所有像素填充完成
- 最后追加1-2秒的完整图像停留帧,避免视频结尾戛然而止
可直接运行的代码示例
import cv2 import numpy as np # 配置参数 INPUT_IMG_PATH = "your_gray_image.png" # 替换成你的灰度图路径 OUTPUT_VIDEO_PATH = "pixel_draw.mp4" FPS = 30 TOTAL_DURATION = 10 # 视频总时长,单位秒 STAY_DURATION = 2 # 最终图像停留时长,单位秒 FILL_ORDER = "row_first" # 填充顺序,可选row_first(逐行)/random(随机) # 读取灰度图 gray_img = cv2.imread(INPUT_IMG_PATH, cv2.IMREAD_GRAYSCALE) h, w = gray_img.shape assert h == 1000 and w == 1000, "输入图像尺寸必须为1000x1000" # 初始化纯白画布 canvas = np.ones_like(gray_img, dtype=np.uint8) * 255 # 生成填充坐标序列 coords = [] for y in range(h): for x in range(w): coords.append((x, y)) if FILL_ORDER == "random": np.random.shuffle(coords) # 初始化视频写入器 fourcc = cv2.VideoWriter_fourcc(*"mp4v") video_writer = cv2.VideoWriter(OUTPUT_VIDEO_PATH, fourcc, FPS, (w, h)) # 计算每帧填充像素数 pixels_per_frame = int((h * w) / (FPS * TOTAL_DURATION)) current_idx = 0 total_pixels = h * w # 逐帧生成绘制过程 while current_idx < total_pixels: # 填充当前批次的像素 end_idx = min(current_idx + pixels_per_frame, total_pixels) for i in range(current_idx, end_idx): x, y = coords[i] canvas[y, x] = gray_img[y, x] # 灰度图转3通道写入视频(OpenCV视频写入默认需要3通道) frame = cv2.cvtColor(canvas, cv2.COLOR_GRAY2BGR) video_writer.write(frame) current_idx = end_idx # 写入结尾停留帧 stay_frame = cv2.cvtColor(gray_img, cv2.COLOR_GRAY2BGR) for _ in range(FPS * STAY_DURATION): video_writer.write(stay_frame) # 释放资源 video_writer.release() print(f"视频已生成,保存路径:{OUTPUT_VIDEO_PATH}")
自定义调整说明
- 想要特殊绘制效果:只要修改
coords坐标列表的生成规则就行,比如螺旋填充就按螺旋遍历的顺序生成(x,y)坐标,中心向外扩散就按像素到中心的距离从小到大排序坐标 - 想要绘制速度变化:可以动态调整
pixels_per_frame的值,比如开头慢每帧填100个像素,后面逐渐加快每帧填10000个,做出加速绘制的效果 - 编码兼容问题:如果Windows下输出的视频打不开,可以把编码参数里的
mp4v改成DIVX,输出文件后缀改成.avi即可
内容的提问来源于stack exchange,提问作者Danish Bansal
相关产品推荐
相关产品推荐

