要从一个图象文件中读取数据并显示,最困难得莫过于色彩格式得转化了。RGB888、ARGB8888、ARGB4444、RGB565、RGB555、ARGB1555等等。众多的格式要实现快速转化绝非易事。就使用DirectDraw编程来说,其实有一种非常简单的方法,那就是使用StretchDIBits函数。这将大大方便编程,节省出很多时间用于程序的主要功能开发,而不是拘泥于Format。
一下一段短小程序就是利用StretchDIBits函数在DirectDraw7中实现色彩格式的转化,请大家参看注释。
BITMAPINFO BitmapInfo;
ZeroMemory( &BitmapInfo, sizeof( BitmapInfo ) );
BitmapInfo.bmiHeader.biSize = sizeof( BitmapInfo.bmiHeader );
BitmapInfo.bmiHeader.biWidth = lPICWidth; // 图象宽度
BitmapInfo.bmiHeader.biHeight = -lPICHeight; // 图象高度注意为负值
BitmapInfo.bmiHeader.biPlanes = 1;
BitmapInfo.bmiHeader.biBitCount = dwPICBits; // 图象位深
lpDDS7->GetDC( &hDC ); // 由IDirectDrawSurface7接口获取HDC
int rc = StretchDIBits( hDC, // 色彩格式转化
0,
0,
lPICWidth, // 目标图象宽度
lPICHeight, // 目标图象高度注意为正值
0,
0,
lPICWidth, // 源图象宽度
lPICHeight, // 源图象高度注意为正值
pPixels, // 源图象缓存
&BitmapInfo, // BITMAPINFO结构
DIB_RGB_COLORS,// 转化为RGB
SRCCOPY );
lpDDS7->ReleaseDC( hDC );
// 有关BITMAPINFO和StretchDIBits函数的具体使用请大家参看Microsoft的有关文档。值得注意的是源图象缓存必须是DWORD对齐的。
用以上方法实现的色彩格式转化虽说不是最好的解决方法,但不失为一种有效的方法。也许自己写会比用以上方法更高效,但把大量时间花在这些“非主题编程”上值得吗?因此,有时使用一些已有的程序也是一种编程的好思路,这也符合软件工程中提倡的“软件复用技术”。