C#转换AVI文件为BMP文件

AVI英文全称为Audio Video Interleaved,即音频视频交错格式。它是一种将语音和影像同步组合在一起的文件格式。AVI支持256色和RLE压缩,主要应用在多媒体光盘上,主要用来保存电视、电影等各种影像信息。

在Windows系统中,借助于API之利,我们能够轻易的实现AVI文件的分解与重组。下面,我给出一个C#版本的AVI分解示例。

using System;

using System.Drawing;

using System.Runtime.InteropServices;

using System.IO;

namespace org.loon.util

{

/// <summary>

/// org.loon.util.AVIUtil 用于AVI文件处理

/// </summary>

public class AVIUtil

{

[StructLayout(LayoutKind.Sequential, Pack = 1)]

struct BITMAPFILEHEADER

{

public ushort bfType;

public uint bfSize;

public ushort bfReserved1;

public ushort bfReserved2;

public uint bfOffBits;

}

[StructLayout(LayoutKind.Sequential, Pack = 1)]

struct BITMAPINFOHEADER

{

public uint biSize;

public int biWidth;

public int biHeight;

public ushort biPlanes;

public ushort biBitCount;

public uint biCompression;

public uint biSizeImage;

public int biXPelsPerMeter;

public int biYPelsPerMeter;

public uint biClrUsed;

public uint biClrImportant;

public const int BI_RGB = 0;

}

const uint DIB_RGB_COLORS = 0;

const uint DIB_PAL_COLORS = 1;

/// <summary>

/// 对象转换

/// </summary>

/// <param name="pBITMAPINFOHEADER"></param>

/// <returns></returns>

public static Bitmap ToBitmap(IntPtr pBITMAPINFOHEADER)

{

unsafe

{

BITMAPINFOHEADER* pbmi = (BITMAPINFOHEADER*)pBITMAPINFOHEADER;

BITMAPFILEHEADER pbmfi;

pbmfi.bfType = (int)‘M‘ << 8 | (int)‘B‘;

pbmfi.bfOffBits = (uint)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));

pbmfi.bfSize = pbmfi.bfOffBits + pbmi->biSizeImage;

MemoryStream stream = new MemoryStream();

BinaryWriter bw = new BinaryWriter(stream);

byte[] data = new byte[sizeof(BITMAPFILEHEADER)];

Marshal.Copy((IntPtr)(&pbmfi), data, 0, data.Length);

bw.Write(data);

data = new byte[sizeof(BITMAPINFOHEADER)];

Marshal.Copy(pBITMAPINFOHEADER, data, 0, data.Length);

bw.Write(data);

data = new byte[pbmi->biSizeImage];

++pbmi;

Marshal.Copy((IntPtr)pbmi, data, 0, data.Length);

bw.Write(data);

bw.Flush();

bw.BaseStream.Position = 0;

return new Bitmap(bw.BaseStream);

}

}

}

/// <summary>

/// AviFile,用于AVI文件处理

/// </summary>

public class AviFile : IDisposable

{

const string AVIFILE32 = "AVIFIL32";

const int AVIGETFRAMEF_BESTDISPLAYFMT = 1;

internal enum OpenFileFlags : uint

{

OF_READ = 0x00000000,

OF_WRITE = 0x00000001,

OF_READWRITE = 0x00000002,

OF_SHARE_COMPAT = 0x00000000,

OF_SHARE_EXCLUSIVE = 0x00000010,

OF_SHARE_DENY_WRITE = 0x00000020,

OF_SHARE_DENY_READ = 0x00000030,

OF_SHARE_DENY_NONE = 0x00000040,

OF_PARSE = 0x00000100,

OF_DELETE = 0x00000200,

OF_VERIFY = 0x00000400,

OF_CANCEL = 0x00000800,

OF_CREATE = 0x00001000,

OF_PROMPT = 0x00002000,

OF_EXIST = 0x00004000,

OF_REOPEN = 0x00008000,

}

[DllImport(AVIFILE32)]

extern internal static void AVIFileInit();

[DllImport(AVIFILE32)]

extern internal static void AVIFileExit();

[DllImport(AVIFILE32)]

extern internal static uint AVIFileOpen(out IntPtr ppfile, string szFile, OpenFileFlags mode, IntPtr pclsidHandler);

[DllImport(AVIFILE32)]

extern internal static int AVIFileRelease(IntPtr pfile);

[DllImport(AVIFILE32)]

extern internal static uint AVIFileGetStream(IntPtr pfile, out IntPtr ppavi, uint fccType, int lParam);

[DllImport(AVIFILE32)]

extern internal static int AVIStreamRelease(IntPtr pavi);

[DllImport(AVIFILE32)]

extern internal static IntPtr AVIStreamGetFrameOpen(IntPtr pavi, int lpbiWanted);

[DllImport(AVIFILE32)]

extern internal static IntPtr AVIStreamGetFrame(IntPtr pgf, int lPos);

[DllImport(AVIFILE32)]

extern internal static int AVIStreamLength(IntPtr pavi);

[DllImport(AVIFILE32)]

extern internal static uint AVIStreamGetFrameClose(IntPtr pget);

static uint mmioFOURCC(char c0, char c1, char c2, char c3)

{

return (uint)c3 << 24 | (uint)c2 << 16 | (uint)c1 << 8 | (uint)c0;

}

static readonly uint streamtypeVIDEO = mmioFOURCC(‘v‘, ‘i‘, ‘d‘, ‘s‘);

static readonly uint streamtypeAUDIO = mmioFOURCC(‘a‘, ‘u‘, ‘d‘, ‘s‘);

static readonly uint streamtypeMIDI = mmioFOURCC(‘m‘, ‘i‘, ‘d‘, ‘s‘);

static readonly uint streamtypeTEXT = mmioFOURCC(‘t‘, ‘x‘, ‘t‘, ‘s‘);

IntPtr aviFile = IntPtr.Zero;

IntPtr aviStream = IntPtr.Zero;

bool disposed = false;

public static void Initialize()

{

AVIFileInit();

}

public static void Terminate()

{

AVIFileExit();

}

public AviFile(string filename)

{

uint result;

result = AVIFileOpen(out aviFile, filename, OpenFileFlags.OF_READ, IntPtr.Zero);

if (result != 0)

{

Release();

throw new Exception("AVIFileOpen failure.");

}

result = AVIFileGetStream(aviFile, out aviStream, streamtypeVIDEO, 0);

if (result != 0)

{

Release();

throw new Exception("AVIFileGetStream failure.");

}

}

~AviFile()

{

Dispose(false);

}

void Release()

{

if (aviStream != IntPtr.Zero)

{

AVIStreamRelease(aviStream);

aviStream = IntPtr.Zero;

}

if (aviFile != IntPtr.Zero)

{

AVIFileRelease(aviFile);

aviFile = IntPtr.Zero;

}

}

public int GetMaxFrameCount()

{

if (aviStream == IntPtr.Zero)

throw new InvalidOperationException();

return AVIStreamLength(aviStream);

}

public Bitmap GetFrame(int no)

{

if (aviStream == IntPtr.Zero)

throw new InvalidOperationException();

IntPtr frame = IntPtr.Zero;

try

{

frame = AVIStreamGetFrameOpen(aviStream, AVIGETFRAMEF_BESTDISPLAYFMT);

IntPtr pbmi = AVIStreamGetFrame(frame, no);

return org.loon.util.AVIUtil.ToBitmap(pbmi);

}

finally

{

if (frame != IntPtr.Zero)

AVIStreamGetFrameClose(frame);

}

}

protected void Dispose(bool disposing)

{

if (disposed)

return;

disposed = true;

Release();

}

public void Dispose()

{

//不让垃圾回收器终止指定对象(即不将指定对象调入终止序列中)

GC.SuppressFinalize(this);

Dispose(true);

}

}

}

分解AVI:

string filename = "d:\test.avi";

//初始化

org.loon.util.AviFile.Initialize();

using (org.loon.util.AviFile avi = new org.loon.util.AviFile(filename))

{

int max = avi.GetMaxFrameCount();

for (int i = 0; i < max; ++i)

{

Bitmap bmp = avi.GetFrame(i);

bmp.Save("d:\test\"+i + ".bmp");

bmp.Dispose();

}

}

//完成

org.loon.util.AviFile.Terminate();

时间: 2024-10-13 00:56:44

C#转换AVI文件为BMP文件的相关文章

实现同时将一批.bmp文件转换成.mat格式

%% 功能:实现同时对一批.bmp文件的转换成.mat格式PicFormat = {'*.bmp','Bitmap image (*.bmp)';... '*.jpg','JPEG image (*.jpg)' ;... '*.*','All Files (*.*)'};% 利用uigetfile函数交互式选取训练样本图片[FileName FilePath,flag] = uigetfile(PicFormat,'导入图像',... '*.bmp','MultiSelect','on');if

VS2010 添加资源文件后,出现 “LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”错误

1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 解决方法: 一.1.点击“项目”-->“属性”-->“清单工具” 2.‘输入和输出’-->‘嵌入清单’,后面的‘是’改成‘否’就可以了 二.将“C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin”文件夹中的cvtres.exe删除(可以更换名字即可)

vs2010 &gt; LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 问题说明: 例如:当安装VS2012之后,原来的.NET 4.0会被替换为.NET 4.5.卸载VS2012时,不会恢复.NET 4.0. l 链接器(link)通过调用cvtres.exe完成文件向coff格式的转换,所以出现这种错误的原因是cvtres.exe出现了问题. l 安装VS2012后,之前安装的VS2010的cvtres.exe就无法使用了(版本对不上).如果你的PATH环境变

【分享】Android Studio专用文件转换工具:把ANSI文件批量另存为无BOM的UTF-8文件

[分享]Android Studio专用文件转换工具:把ANSI文件批量另存为无BOM的UTF-8文件 在Andoird Studio下编译java文件时,经常会出现像下面的错误: Error:(29, 43) 閿欒: 缂栫爜UTF-8鐨勪笉鍙槧灏勫瓧绗? 在这里,分享一个工具:ANSI文件批量另存为无BOM的UTF-8文件: 把下面代码用记事本存为AndroidStudioJava编码.vbs,双击即可使用: on error resume next Set WshShell=WScrip

Python:将utf-8格式的文件转换成gbk格式的文件

需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.open(filePath,"r",encoding) as f: return f.read() def WriteFile(filePath,u,encoding="gbk"): with codecs.open(filePath,"w",encodi

[Linux] 批量转换整个目录下的文件编码为UTF-8;

[Linux] 批量转换整个目录下的文件编码为UTF-8: #!/bin/bash - #===============================================================================# #          FILE: conv.sh#  #         USAGE: ./conv.sh #  #   DESCRIPTION: 一个支持把整个目录递归转换GB2312为UTF-8的脚本: #  #       OPTIONS: 

Linux查看文件编码格式及文件编码转换

Linux查看文件编码格式及文件编码转换 如果你需要在Linux 中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8.下面介绍一下,在Linux中如何查看文件的编码及如何进行对文件进行编码转换. 查看文件编码在Linux中查看文件编码可以通过以下几种方式:1.在Vim 中可以直接查看文件编码 Shell代码 :set fileencoding 即可显示文件编码格式.如果你只是想查看其它编码格

无法启动&quot;D\projects\hello\Debug\hello.exe&quot; 系统找不到指定的文件。[LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏]

这两天安装Visual Studio遇到这样的一个问题,用自己的电脑和公司的电脑都出现同样的问题.两台电脑都是新系统,按理来说是没有问题的.但是一出现问题,对于我这个小白来说,还是耗费了挺多精力都无果.今天问公司一个c++同事,他说他也遇到这样一个问题,一百度就给我解决了.之前我真是浪费时间,我使用搜索引擎的方法不对.我是搜索错误提示“无法启动"D\projects\hello\Debug\hello.exe" 系统找不到指定的文件”.而他是搜索“LINK : fatal error

VS2010关于error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

前段时间自己的系统一直在安装更新.今天突然打开VS2010当运行的时候一直出现error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏这种错误.然后就百度 解决的方法: 1.项目\属性\配置属性\清单工具\输入和输出\嵌入清单:原来是"是",改成"否". 或者将 项目\属性\配置属性\链接器\清单文件\生成清单:原来是"是".改成"否". (这种方法失效,网上大多数的解决的方法都是这样) 2.这个错误主要是由