在多媒体处理中,将一系列图片转换为视频是一个常见的需求。本文将详细介绍如何使用 SharpAvi库在 C# 中实现这一功能。
C#Install-Package SharpAvi Install-Package System.Drawing.Common
C#using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using SharpAvi;
using SharpAvi.Output;
using Image = System.Drawing.Image;
namespace AppSharpAvi
{
public class VideoCreator
{
/// <summary>
/// 将图片序列转换为 AVI 视频
/// </summary>
/// <param name="imagePaths">图片路径数组</param>
/// <param name="outputPath">输出的 AVI 文件路径</param>
/// <param name="frameRate">视频帧率</param>
public static void CreateAviFromImages(
string[] imagePaths,
string outputPath,
int frameRate = 30
)
{
// 参数有效性检查
if (imagePaths == null || imagePaths.Length == 0)
throw new ArgumentException("图片路径数组不能为空");
// 读取第一张图片获取尺寸
using (var firstImage = Image.FromFile(imagePaths[0]))
{
int width = firstImage.Width;
int height = firstImage.Height;
// 创建 AVI 写入器
using (var writer = new AviWriter(outputPath)
{
FramesPerSecond = frameRate,
EmitIndex1 = true
})
{
// 添加视频流
var videoStream = writer.AddVideoStream(
width,
height,
BitsPerPixel.Bpp24
);
// 逐帧处理
ProcessFrames(imagePaths, videoStream, width, height);
}
}
}
/// <summary>
/// 处理每一帧图像
/// </summary>
private static void ProcessFrames(
string[] imagePaths,
IAviVideoStream videoStream,
int width,
int height)
{
foreach (var imagePath in imagePaths)
{
using (var bitmap = new Bitmap(imagePath))
{
// 调整图像大小
using (var resizedBitmap = new Bitmap(bitmap, width, height))
{
// 锁定图像数据
var bitmapData = resizedBitmap.LockBits(
new Rectangle(0, 0, width, height),
System.Drawing.Imaging.ImageLockMode.ReadOnly,
System.Drawing.Imaging.PixelFormat.Format24bppRgb
);
try
{
// 准备帧数据
int frameDataLength = bitmapData.Stride * height;
byte[] frameData = new byte[frameDataLength];
// 垂直翻转图像数据
for (int y = 0; y < height; y++)
{
Marshal.Copy(
new IntPtr(bitmapData.Scan0.ToInt64() + bitmapData.Stride * (height - 1 - y)),
frameData,
y * bitmapData.Stride,
bitmapData.Stride
);
}
// 写入帧
videoStream.WriteFrame(
true, // 关键帧
frameData,
0,
frameDataLength
);
}
finally
{
resizedBitmap.UnlockBits(bitmapData);
}
}
}
}
}
}
}
C#namespace AppSharpAvi
{
internal class Program
{
static void Main(string[] args)
{
VideoCreator.CreateAviFromImages(new string[] { "1.jpg", "2.jpg", "3.jpg","4.jpg" }, "output.avi", 30);
}
}
}
SharpAvi提供了一种简单而强大的方式来将图片序列转换为 AVI 视频。通过合理配置,可以满足各种多媒体处理需求。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!