多媒体编程基础
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章多媒体编程基础
6.1多媒体文件
多媒体文件一般被称为RIFF文件,即资源交互文件格式(Resource interchange file format)。RIFF格式是面向部分(Chunk)的。一个RIFF文件是由一个或多个部分组成的,每个部分都有一个类型,后面跟着一些数据。
typedef struct{
FOURCC ckID; //4字符字段,标志类型(比如波形音频为WA VE)
DWORD cksize; //部分中数据的大小
}CK;
MFC为处理RIFF文件专门提供了一套多媒体I/O函数,这些函数都有前缀mmio。比如mmioOpen是打开RIFF文件,mmioDescend可以进入RIFF文件的部分。
HMMIO h;
CString path;
……
If ((h=mmioOpen(path,NULL,MMIO_READ))==NULL)
return FALSE;
……
If (mmioRead(h,&dataformat,(long)n)!=(long)n)
{ mmio Close(h,0);
return FALSE;
}
WA V文件开始是46个字节的文件头,之后是波形数据。文件头如下:Typedef struct {
DWORD rftype; //固定为字符串“RIFF”
DWORD wbSize; //波形块的大小
DWORD wftype; //wav文件标志,固定为字符串“WA VE”
DWORD ftype; //固定为字符串“fmt”
DWORD BlockSize; //格式块的大小
WORD wFormatTag; //记录波形编码格式。为WA VE_FORMAT_PCM WORD nChannels; //记录波形文件数据中的通道数
DWORD nSamplesPerSec; //记录波形文件的采样率
DWORD nAvgBytesPerSec;//平均每秒波形音频数据所需要的字节数
DWORD nBlockAlign; //记录一个采样所需要的字节数
WORD wBitsPerSample; //每个采样的位数
DWORD dataflag; //固定为字符串“data”
DWORD fSize; //波形文件大小
}PCMWA VEFORMAT;
BMP文件开始通常依次是14字节的文件头,40字节的位图信息,颜色表(真彩位图没有),最后是图像数据,对于用到调色板的位图,实际的图象数据ImageDate为该象素的颜色在调色板中的索引值;对于真彩色图,图象数据则为实际的R、G、B值。位图数据每一行的字节数必须为4的整倍数,如果不是,则需要补齐;位图文件中的数据是从下到上(而不是从上到下)、从左到右方式
存储的。图像数据或者不压缩,或者使用RLE压缩。
文件头如下:
typedef struct tagBITMAPFILEHEADER {
WORD bftype; // 固定为字符串“BM”
DWORD bfsize; // 字节为单位的位图文件大小
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfoffBits; // 指出图像数据针对文件头的偏移量
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //本结构的长度,为40
LONG biWidth; //图象的宽度,单位是象素
LONG biHeight; //图象的高度,单位是象素
WORD biPlanes; //必须是1
WORD biBitCount;
//表示颜色时要用到的位数,1(单色), 4(16色), 8(256色), 24(真彩色) DWORD biCompression;
//指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS 等,BI_RGB表示不压缩
DWORD biSizeImage;
//实际的位图数据占用的字节数,即biSizeImage=biWidth’×biHeight,biWidth’是biWidth 按照4的整倍数调整后的结果
LONG biXPelsPerMeter; //目标设备的水平分辨率,单位是每米的象素个数LONG biYPelsPerMeter; //目标设备的垂直分辨率,单位是每米的象素个数DWORD biClrUsed; //位图实际用到的颜色数,0表示颜色数为2biBitCount DWORD biClrImportant; //位图中重要的颜色数,0表示所有颜色都重要
} BITMAPINFOHEADER;
调色板Palette针对的是需要调色板的位图,即单色、16色和256色位图。对于不以调色板方式存储的位图,则无此项信息。调色板是一个数组,共有biClrUsed 个元素(如果该值为0,则有2biBitCount个元素)。数组中每个元素是一个RGBQUAD结构体,长度为4个字节,定义为:
typedef struct tagRGBQUAD
{
BYTE rgbBlue; //蓝色分量
BYTE rgbGreen; //绿色分量
BYTE rgbRed; //红色分量
BYTE rgbReserved; //保留值
} RGBQUAD;
6.2 WINDOWS位图
WINSOWS位图编程的方法主要分为设备相关位图与设备无关位图。DDB 设备相关位图由MFC中CBitmap类表示,从应用程序的资源里获得完全依赖于