Lazy loaded image
帮粉丝用gpt写代码生成一个文字视频
字数 2526阅读时长 7 分钟
2026-1-2
2026-1-4
type
status
date
slug
summary
tags
category
icon
password

文章目录

  • * 使用网站
  • ValueError: could not broadcast input array from shape (720,1280) into shape (720,1280,3)
  • 定义文本内容和动画参数
  • 定义视频参数
  • 创建背景
  • 使用 PIL 创建文本图像
  • 创建文本剪辑
  • 使用函数创建文本剪辑
  • 合并所有剪辑
  • 导出视频
  • * * 1\. 理解错误信息
  • 2\. 确认图像数组形状
  • 3\. 测试 `create_text_image` 函数
  • 4\. 检查其他部分的数组处理
  • 5\. 调试和定位问题
  • 代码说明:
  • 定义文本内容和动画参数
  • 定义视频参数
  • 创建背景
  • 创建文本剪辑
  • 合并所有剪辑
  • 导出视频
  • * * 代码说明:
  • 代码说明:
  • 解决步骤:
  • 配置方法:
  • * 方法一:通过系统环境变量
  • 方法二:手动配置 `MoviePy`
  • 修改后的代码(无需更改,只需确保 `ImageMagick` 安装和配置正确):
  • 代码说明:

使用网站

<https://chatgpt-plus.top/>

ValueError: could not broadcast input array from shape (720,1280) into

shape (720,1280,3)
报错了
这个报错信息提示你试图将一个形状为 (720, 1280) 的数组赋值给一个形状为 (720, 1280, 3) 的数组。这个问题通常发生在处理图像数据时,因为单通道的灰度图像与三通道的彩色图像有不同的形状。
以下是一些可能导致这个问题的原因及其解决方法:
  1. **灰度图像与彩色图像混淆** :
  • 如果你正在处理一个灰度图像,而尝试将它赋值给一个彩色图像数组,会导致这种错误。你需要将灰度图像转换成彩色图像格式。
import numpy as np

假设 img 是形状为 (720, 1280) 的灰度图像

img_gray = np.random.rand(720, 1280) # 示例灰度图像 img_color = np.stack((img_gray, img_gray, img_gray), axis=-1) # 转换为彩色图像 print(img_color.shape) # 应该输出 (720, 1280, 3)
  1. **使用合适的图像读取库** :
  • 确保你使用的图像读取库正确读取了图像的颜色通道。例如,使用 OpenCV 读取图像时,可以指定 `cv2.IMREAD_COLOR` 或 `cv2.IMREAD_GRAYSCALE`。
import cv2

读取彩色图像

img_color = cv2.imread('path_to_image.jpg', cv2.IMREAD_COLOR) print(img_color.shape) # 应该输出 (720, 1280, 3)

读取灰度图像

img_gray = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE) print(img_gray.shape) # 应该输出 (720, 1280)
  1. **检查图像的读取方式** :
  • 确保你读取图像时使用的模式与预期的数组形状一致。例如,如果你期望一个三通道图像,但实际上读取的是单通道的图像。
  1. **调试代码** :
  • 添加调试信息来检查在代码执行过程中图像数组的形状。这样可以帮助你快速定位问题。
print('Image shape:', img.shape)
通过以上方法,你应该能找出并解决 `ValueError: could not broadcast input array from shape (720,1280) into shape (720,
from PIL import Image, ImageDraw, ImageFont from moviepy.editor import ImageClip, CompositeVideoClip, ColorClip import numpy as np

定义文本内容和动画参数

texts = [ (“在昏暗的练武场中,两位身影在微弱的灯光下交错移动。”, 0), (“一位身穿黑色夜行衣的剑客,手持长剑,剑尖在空气中划出一道道寒光。”, 4), (“他的对手,一位身着白色练功服的武者,双手如闪电般出击,每一次攻击都带着破空之声。”, 8), (“剑客的剑法凌厉而精准,每一剑都直指要害,但白衣武者身形灵活,巧妙地躲闪着每一次攻击。”, 12), (“他的眼神冷静而坚定,似乎在寻找着对手的破绽。”, 16), (“随着战斗的进行,两人的动作越来越快,剑光与拳影交织在一起,形成了一幅动人心魄的画面。”, 20), (“剑客的剑如游龙般穿梭,白衣武者的拳法则如猛虎下山,每一次交锋都充满了力量与美感。”, 24), (“终于,在一次激烈的交锋后,剑客找到了机会,长剑直指白衣武者的胸口。”, 28), (“但就在这千钧一发之际,白衣武者身形一晃,巧妙地避开了致命一击,同时反手一掌,正中剑客的肩膀。”, 32), (“剑客踉跄后退,剑尖点地,稳住了身形。他抬头看向对手,眼中闪过一丝敬佩。”, 36), (“白衣武者收拳而立,微微点头,两人相视一笑,这场战斗,不仅是较量,更是一次武艺的交流。”, 40), (“练武场再次恢复了平静,但两位武者心中的热血仍在沸腾。”, 44), (“他们知道,这场战斗将成为他们武道之路上难忘的记忆。”, 48) ]

定义视频参数

duration = 52 fade_duration = 1 background_color = ‘black’ font_size = 30 font_color = ‘white’ font_path = “C:/Windows/Fonts/simhei.ttf” # 指定系统中的中文字体路径 size = (1280, 720)

创建背景

background = ColorClip(size, color=background_color, duration=duration)

使用 PIL 创建文本图像

def create_text_image(text, size, font_size, font_color, font_path): img = Image.new(‘RGB’, size, color=background_color) draw = ImageDraw.Draw(img) font = ImageFont.truetype(font_path, font_size) text_bbox = draw.textbbox((0, 0), text, font=font) text_width = text_bbox[2] - text_bbox[0] text_height = text_bbox[3] - text_bbox[1] position = ((size[0] - text_width) / 2, (size[1] - text_height) / 2) draw.text(position, text, font=font, fill=font_color) return np.array(img)

创建文本剪辑

def create_text_clip(text, start_time, text_duration, fade_duration): img_array = create_text_image(text, size, font_size, font_color, font_path) txt_clip = ImageClip(img_array).set_duration(text_duration).set_start(start_time) txt_clip = txt_clip.crossfadein(fade_duration).crossfadeout(fade_duration) return txt_clip

使用函数创建文本剪辑

clips = [create_text_clip(text, start_time, 4, fade_duration) for text, start_time in texts]

合并所有剪辑

video = CompositeVideoClip([background, *clips])

导出视频

video.write_videofile(“fight_scene.mp4”, fps=24)
从你的代码来看,问题可能出在 `create_text_image` 函数中将 PIL 图像转换为 NumPy 数组的部分。你创建的是一个 RGB 图像,但在将其转换为 NumPy 数组时可能没有正确处理三通道数据。这会导致形状不匹配错误。
我们可以通过确保图像的形状正确来解决这个问题。下面是修改后的代码:
from PIL import Image, ImageDraw, ImageFont from moviepy.editor import ImageClip, CompositeVideoClip, ColorClip import numpy as np

定义文本内容和动画参数

texts = [ ("在昏暗的练武场中,两位身影在微弱的灯光下交错移动。", 0), ("一位身穿黑色夜行衣的剑客,手持长剑,剑尖在空气中划出一道道寒光。", 4), ("他的对手,一位身着白色练功服的武者,双手如闪电般出击,每一次攻击都带着破空之声。", 8), ("剑客的剑法凌厉而精准,每一剑都直指要害,但白衣武者身形灵活,巧妙地躲闪着每一次攻击。", 12), ("他的眼神冷静而坚定,似乎在寻找着对手的破绽。", 16), ("随着战斗的进行,两人的动作越来越快,剑光与拳影交织在一起,形成了一幅动人心魄的画面。", 20), ("剑客的剑如游龙般穿梭,白衣武者的拳法则如猛虎下山,每一次交锋都充满了力量与美感。", 24), ("终于,在一次激烈的交锋后,剑客找到了机会,长剑直指白衣武者的胸口。", 28), ("但就在这千钧一发之际,白衣武者身形一晃,巧妙地避开了致命一击,同时反手一掌,正中剑客的肩膀。", 32), ("剑客踉跄后退,剑尖点地,稳住了身形。他抬头看向对手,眼中闪过一丝敬佩。", 36), ("白衣武者收拳而立,微微点头,两人相视一笑,这场战斗,不仅是较量,更是一次武艺的交流。", 40), ("练武场再次恢复了平静,但两位武者心中的热血仍在沸腾。", 44), ("他们知道,这场战斗将成为他们武道之路上难忘的记忆。", 48) ]

定义视频参数

duration = 52 fade_duration = 1 background_color = 'black' font_size = 30 font_color = 'white' font_path = "C:/Windows/Fonts/simhei.ttf" # 指定系统中的中文字体路径 size = (1280, 720)

创建背景

background = ColorClip(size, color=background_color, duration=duration)

使用 PIL 创建文本图像

def create_text_image(text, size, font_size, font_color, font_path): img = Image.new('RGB', size, color=background_color) draw = ImageDraw.Draw(img) font = ImageFont.truetype(font_path, font_size) text_bbox = draw.textbbox((0, 0), text, font=font) text_width = text_bbox[2] - text_bbox[0] text_height = text_bbox[3] - text_bbox[1] position = ((size[0] - text_width) / 2, (size[1] - text_height) / 2) draw.text(position, text, font=font, fill=font_color) return np.array(img)

创建文本剪辑

def create_text_clip(text, start_time, text_duration, fade_duration): img_array = create_text_image(text, size, font_size, font_color, font_path) txt_clip = ImageClip(img_array).set_duration(text_duration).set_start(start_time) txt_clip = txt_clip.crossfadein(fade_duration).crossfadeout(fade_duration) return txt_clip

使用函数创建文本剪辑

clips = [create_text_clip(text, start_time, 4, fade_duration) for text, start_time in texts]

合并所有剪辑

video = CompositeVideoClip([background, *clips])

导出视频

video.write_videofile("fight_scene.mp4", fps=24)
修改要点:
  1. **确保 PIL 图像创建为 RGB 格式** :在 `create_text_image` 函数中,明确指定创建 RGB 图像。
  1. **确保 NumPy 数组正确处理** :从 PIL 图像转换为 NumPy 数组时,确保图像维度为 (720, 1280, 3),这是 RGB 图像的标准形状。
这些改动应该可以解决 `ValueError: could not broadcast input array from shape (720,1280) into shape (720,1280,3)` 的问题。
ValueError: could not broadcast input array from shape (720,1280) into shape (720,1280,3) ,step by step
解决问题“ValueError: could not broadcast input array from shape (720,1280) into shape (720,1280,3)”需要理解 NumPy 数组的广播机制以及图像数据的存储形式。我们将逐步检查并修正你的代码中可能导致这个错误的地方。

1\. 理解错误信息

错误信息 `ValueError: could not broadcast input array from shape (720,1280) into shape (720,1280,3)` 指的是尝试将一个二维数组(灰度图像)转换或广播为一个三维数组(彩色图像)。这是因为你的数组形状不匹配。
上一篇
5分钟教你用AI把老照片动起来,别再去花49块9的冤枉钱了
下一篇
小白也能用! Cladue 一键生成6种流程图,制作教程详解

评论
Loading...