`
wangxiaohigh
  • 浏览: 1458063 次
文章分类
社区版块
存档分类
最新评论

C#转换AVI文件为BMP文件

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

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

usingSystem;
usingSystem.Drawing;
usingSystem.Runtime.InteropServices;
usingSystem.IO;

namespaceorg.loon.util
...{
/**////<summary>
///org.loon.util.AVIUtil用于AVI文件处理
///</summary>

publicclassAVIUtil...{
[StructLayout(LayoutKind.Sequential,Pack
=1)]
structBITMAPFILEHEADER
...{
publicushortbfType;
publicuintbfSize;
publicushortbfReserved1;
publicushortbfReserved2;
publicuintbfOffBits;
}


[StructLayout(LayoutKind.Sequential,Pack
=1)]
structBITMAPINFOHEADER
...{
publicuintbiSize;
publicintbiWidth;
publicintbiHeight;
publicushortbiPlanes;
publicushortbiBitCount;
publicuintbiCompression;
publicuintbiSizeImage;
publicintbiXPelsPerMeter;
publicintbiYPelsPerMeter;
publicuintbiClrUsed;
publicuintbiClrImportant;
publicconstintBI_RGB=0;
}


constuintDIB_RGB_COLORS=0;

constuintDIB_PAL_COLORS=1;

/**////<summary>
///对象转换
///</summary>
///<paramname="pBITMAPINFOHEADER"></param>
///<returns></returns>

publicstaticBitmapToBitmap(IntPtrpBITMAPINFOHEADER)
...{
unsafe
...{
BITMAPINFOHEADER
*pbmi=(BITMAPINFOHEADER*)pBITMAPINFOHEADER;
BITMAPFILEHEADERpbmfi;
pbmfi.bfType
=(int)'M'<<8|(int)'B';
pbmfi.bfOffBits
=(uint)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
pbmfi.bfSize
=pbmfi.bfOffBits+pbmi->biSizeImage;

MemoryStreamstream
=newMemoryStream();
BinaryWriterbw
=newBinaryWriter(stream);
byte[]data=newbyte[sizeof(BITMAPFILEHEADER)];
Marshal.Copy((IntPtr)(
&pbmfi),data,0,data.Length);
bw.Write(data);

data
=newbyte[sizeof(BITMAPINFOHEADER)];
Marshal.Copy(pBITMAPINFOHEADER,data,
0,data.Length);
bw.Write(data);

data
=newbyte[pbmi->biSizeImage];
++pbmi;
Marshal.Copy((IntPtr)pbmi,data,
0,data.Length);
bw.Write(data);
bw.Flush();
bw.BaseStream.Position
=0;

returnnewBitmap(bw.BaseStream);
}

}

}


/**////<summary>
///AviFile,用于AVI文件处理
///</summary>

publicclassAviFile:IDisposable
...{
conststringAVIFILE32="AVIFIL32";
constintAVIGETFRAMEF_BESTDISPLAYFMT=1;

internalenumOpenFileFlags: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)]
externinternalstaticvoidAVIFileInit();

[DllImport(AVIFILE32)]
externinternalstaticvoidAVIFileExit();

[DllImport(AVIFILE32)]
externinternalstaticuintAVIFileOpen(outIntPtrppfile,stringszFile,OpenFileFlagsmode,IntPtrpclsidHandler);

[DllImport(AVIFILE32)]
externinternalstaticintAVIFileRelease(IntPtrpfile);

[DllImport(AVIFILE32)]
externinternalstaticuintAVIFileGetStream(IntPtrpfile,outIntPtrppavi,uintfccType,intlParam);

[DllImport(AVIFILE32)]
externinternalstaticintAVIStreamRelease(IntPtrpavi);

[DllImport(AVIFILE32)]
externinternalstaticIntPtrAVIStreamGetFrameOpen(IntPtrpavi,intlpbiWanted);

[DllImport(AVIFILE32)]
externinternalstaticIntPtrAVIStreamGetFrame(IntPtrpgf,intlPos);

[DllImport(AVIFILE32)]
externinternalstaticintAVIStreamLength(IntPtrpavi);

[DllImport(AVIFILE32)]
externinternalstaticuintAVIStreamGetFrameClose(IntPtrpget);


staticuintmmioFOURCC(charc0,charc1,charc2,charc3)
...{
return(uint)c3<<24|(uint)c2<<16|(uint)c1<<8|(uint)c0;
}


staticreadonlyuintstreamtypeVIDEO=mmioFOURCC('v','i','d','s');
staticreadonlyuintstreamtypeAUDIO=mmioFOURCC('a','u','d','s');
staticreadonlyuintstreamtypeMIDI=mmioFOURCC('m','i','d','s');
staticreadonlyuintstreamtypeTEXT=mmioFOURCC('t','x','t','s');

IntPtraviFile
=IntPtr.Zero;
IntPtraviStream
=IntPtr.Zero;
booldisposed=false;

publicstaticvoidInitialize()
...{
AVIFileInit();
}


publicstaticvoidTerminate()
...{
AVIFileExit();
}


publicAviFile(stringfilename)
...{
uintresult;
result
=AVIFileOpen(outaviFile,filename,OpenFileFlags.OF_READ,IntPtr.Zero);
if(result!=0)
...{
Release();
thrownewException("AVIFileOpenfailure.");
}


result
=AVIFileGetStream(aviFile,outaviStream,streamtypeVIDEO,0);
if(result!=0)
...{
Release();
thrownewException("AVIFileGetStreamfailure.");
}

}


~AviFile()
...{
Dispose(
false);
}


voidRelease()
...{
if(aviStream!=IntPtr.Zero)
...{
AVIStreamRelease(aviStream);
aviStream
=IntPtr.Zero;
}


if(aviFile!=IntPtr.Zero)
...{
AVIFileRelease(aviFile);
aviFile
=IntPtr.Zero;
}

}


publicintGetMaxFrameCount()
...{
if(aviStream==IntPtr.Zero)
thrownewInvalidOperationException();
returnAVIStreamLength(aviStream);
}


publicBitmapGetFrame(intno)
...{
if(aviStream==IntPtr.Zero)
thrownewInvalidOperationException();

IntPtrframe
=IntPtr.Zero;
try
...{
frame
=AVIStreamGetFrameOpen(aviStream,AVIGETFRAMEF_BESTDISPLAYFMT);
IntPtrpbmi
=AVIStreamGetFrame(frame,no);
returnorg.loon.util.AVIUtil.ToBitmap(pbmi);

}

finally
...{
if(frame!=IntPtr.Zero)
AVIStreamGetFrameClose(frame);
}

}


protectedvoidDispose(booldisposing)
...{
if(disposed)
return;
disposed
=true;
Release();
}


publicvoidDispose()
...{
//不让垃圾回收器终止指定对象(即不将指定对象调入终止序列中)
GC.SuppressFinalize(this);
Dispose(
true);
}


}


}


分解AVI:
stringfilename="d:/test.avi";
//初始化
org.loon.util.AviFile.Initialize();

using(org.loon.util.AviFileavi=neworg.loon.util.AviFile(filename))
...{
intmax=avi.GetMaxFrameCount();
for(inti=0;i<max;++i)
...{
Bitmapbmp
=avi.GetFrame(i);
bmp.Save(
"d:/test/"+i+".bmp");
bmp.Dispose();
}

}

//完成
org.loon.util.AviFile.Terminate();
分享到:
评论

相关推荐

    avi格式与bmp格式相互之间的转换

    5. **代码实现**:在C#中,分解avi为bmp通常涉及打开avi文件,创建一个媒体流,然后逐帧读取并保存为bmp。合成avi则需要读取bmp图片,创建一个新的avi文件,并将这些图片编码为视频帧添加进去。 6. **性能优化**:...

    MFC实现BMP与AVI的转换,将BMP合成或将AVI分解.zip

    本话题聚焦于如何利用MFC进行BMP(Bitmap)和AVI(Audio Video Interleave)文件之间的转换。 首先,我们来理解BMP和AVI的基本概念: 1. BMP:BMP是一种位图文件格式,广泛应用于Windows操作系统中。它不包含任何...

    将AVI转成BMP的源文件

    标签“显示”可能指的是在转换过程中,除了保存为文件,还可能需要在屏幕上显示这些帧,这就涉及到图形用户界面(GUI)编程,如使用Windows API或Qt库创建窗口,以及在窗口上绘制BMP图像。 提供的压缩包文件...

    BMP序列转换为avi

    在IT行业中,图像处理是一项重要的技术,而将一系列静态的图像文件(如BMP格式)转换成动态的视频文件(如AVI格式)是常见的需求。在这个实例中,我们将探讨如何利用C#编程语言和Visual Studio 2015来实现这个功能。...

    C#与Halcon联合编程范例,并附图片转换,可以直接拿出来使用

    8. **图像数据转换**:Halcon处理的图像格式可能与C#中常用的BMP、JPEG等格式不同,因此可能需要进行数据格式的转换。C#中可以使用第三方库如Emgu CV来进行图像格式的转换。 9. **事件驱动编程**:在某些应用场景下...

    AVI视频分解成BMP图片源代码

    然后,逐帧解码视频流,每解码出一帧就保存为BMP图片。解码过程中可能需要使用到DirectShow或FFmpeg等库。 4. **BMP合成AVI**:与分解相反,合成过程需要将BMP图片重新编码成视频流,再封装到AVI容器中。首先,按照...

    从avi格式视频获取一帧图像

    本篇文章将详细探讨如何使用C#语言从AVI格式的视频文件中提取一帧图像,并将其保存为Bitmap格式。我们将围绕三个关键文件——`Avi.cs`、`AviBase.cs`和`FormatBitmap.cs`展开讨论。 首先,让我们了解AVI(Audio ...

    bmp转Avi 源码1

    在IT领域,图像处理是一项非常重要的技术,而将静态图像(如BMP)转换为动态视频(如AVI)是其中的一个应用场景。本篇将详细讲解如何通过源代码实现BMP到AVI的转换,以及涉及到的相关技术点。 首先,我们要理解BMP...

    t_Bmp2Avi.rar

    【标题】"t_Bmp2Avi.rar" 是一个压缩包文件,其核心内容是一个能够将BMP图像文件批量转换为AVI视频格式的应用程序。这个项目是在Microsoft Visual Studio 2010环境下开发并成功运行的,适用于那些需要将一系列静态...

    利用FFmpeg.AutoGen将Bitmap转h264编码的AVI文件源码

    8. **bmp2avi和bmp2avi.sln**: 这两个文件是项目文件,`bmp2avi`可能是实现上述功能的C#源代码文件,而`bmp2avi.sln`则是Visual Studio解决方案文件,包含了项目的配置和依赖项,用户可以使用Visual Studio打开并...

    avifile写的2个avi和一个wav合成

    在文件列表中,我们只看到了"TestOfAVIToBMP",这可能是程序的名字或者是测试文件,暗示了一个将AVI转换为BMP图像序列的过程。BMP是一种位图格式,用于保存单帧图像,这种转换可能用于逐帧查看视频内容,或者在没有...

    winform C# ffmpeg 图片转成视频

    本源码是ffmpeg转换视频,编译环境为vs2017,如需要转换其他格式视频填写对应的视频格式的编码格式【-f image2 -i c:\temp\d.jpg -vcodec libx264 test.mp4】,支持的图片格式为jpg,bmp,tiff等等。请注意对应的...

    文件格式批量转换小工具

    标签“格式转换”进一步明确了这个工具的主要功能,它能够处理各种文件格式之间的转换,可能包括但不限于文档(如DOC、DOCX、PDF)、图像(如JPEG、PNG、BMP)、音频(如MP3、WAV、FLAC)、视频(如MP4、AVI、MOV)...

    C#上传视频截图成图片

    在C#编程环境中,将视频的一帧转换为图片是一项常见的任务,特别是在多媒体处理或视频分析的应用中。这个过程通常涉及到视频解码、图像处理以及文件保存等步骤。在这个场景下,"C#上传视频截图成图片"的实现可能包括...

    基于opencv的视频文件分割

    本主题聚焦于“基于OpenCV的视频文件分割”,即如何利用OpenCV将AVI格式的视频按照每一帧转化为独立的BMP图片。这个过程在进行图像分析、机器学习模型训练或视频处理时非常常见。 首先,我们需要理解AVI和BMP的基本...

    转换软件.zip

    1. **文件格式转换**:最常见的转换需求包括文档格式(如PDF转DOC、PPT转PDF)、图像格式(如JPEG转PNG、BMP转JPEG)和音频/视频格式(如MP3转WAV、MP4转AVI)。这些转换软件通常具有用户友好的界面,支持批量处理,...

    N个N级目录下生成N个不同类型的文件.zip

    `System.Random`类可以用来生成随机数字,然后根据需要转换为各种类型的数据。 在性能测试的场景下,可能需要生成大量文件以模拟真实世界的使用情况。这可能包括大量并发的读写操作,测试文件系统的处理能力。为了...

Global site tag (gtag.js) - Google Analytics