You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python逐像素绘制图像并生成绘制过程视频

逐像素绘制灰度图生成视频实现方案

用Python+OpenCV可以快速实现这个需求,全程不需要手动操作剪辑软件,代码跑一遍直接出成品,步骤如下:

前期准备

先安装依赖库,执行命令:
pip install numpy opencv-python

核心实现逻辑

别做一帧填一个像素的傻事——1000*1000一共100万像素,按30fps算要播9个多小时,文件几十上百G完全没法用。正确的做法是根据你想要的总视频时长,计算每帧需要填充的像素数量,兼顾绘制过程的观感和文件体积。

  1. 读取输入的1000x1000灰度图,转成numpy数组存储像素值
  2. 初始化同尺寸的纯白色画布,灰度模式下纯白像素值为255
  3. 提前生成像素填充顺序的坐标列表,默认可以选从上到下、从左到右的逐行扫描顺序,想要特殊效果可以改成随机乱序、螺旋扩散、中心向外扩散等规则
  4. 配置视频输出参数:选定帧率(一般30fps足够)、总时长(比如10秒),计算得出每帧需要填充的像素数=总像素数/(帧率*总时长)
  5. 循环生成每一帧:按顺序给画布填充对应数量的像素值,把当前帧写入视频流,直到所有像素填充完成
  6. 最后追加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:06:51