brew中把IBitmap对象保存成bmp图源码
目前输出的图像不清晰,欢迎大家改进 ,本人QQ:1071903446
// bmputil.c : Defines the entry point for the console application.
//
#include "AEEModGen.h" // Module interface definitions
#include "AEEAppGen.h" // Applet interface definitions
#include "AEEShell.h" // Shell interface definitions
#include "AEEFile.h" // File interface definitions
#include "CFileApp.h"
//#include "windows.h"
//#include "windef.h"
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
//near用于段相同的物理地址的偏移 段内相对地址
//far用于段和偏移地址的组合 绝对地址
//类型字段单独抽出,如果放在tagBITMAPFILEHEADER 中,sizeof(tagBITMAPFILEHEADER)==16与标准bmp的14位不符
WORD bfType;
typedef struct tagBITMAPFILEHEADER {
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
typedef RGBQUAD * LPRGBQUAD;
unsigned char *pBmpBuf;
int bmpWidth;//图像的宽
int bmpHeight;//图像的高
RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型,每像素位数
int saveBmp(CFileApp* pApp,char *bmpName,IDIB* pDIB)
{ unsigned char *imgBuf=pDIB->pBmp;
int width=pDIB->cx;
int height=pDIB->cy;
int biBitCount=pDIB->nDepth;
RGBQUAD *pColorTable=pDIB->pRGB;
uint16 cntRGB=pDIB->cntRGB;
IFile *pIFile;
int colorTablesize=0;
int lineByte=0;
int dataSize=0;
int error;
BITMAPFILEHEADER fileHead;
BITMAPINFOHEADER head;
//如果位图数据指针为0,则没有数据传入,函数返回
if(!imgBuf)
return 0;
if(IFILEMGR_Test(pApp->pIFileMgr,bmpName)==SUCCESS)
{
pIFile=IFILEMGR_OpenFile(pApp->pIFileMgr,bmpName,_OFM_READWRITE);
if(pIFile)
DBGPRINTF("file already exists");
}
else
{
pIFile=IFILEMGR_OpenFile(pApp->pIFileMgr,bmpName,_OFM_CREATE);
if(pIFile)
DBGPRINTF("file create successful");
else
error=IFILEMGR_GetLastError(pApp->pIFileMgr) ;
}
DBGPRINTF("width=%d,height=%d, biBitCount=%d\n",width,height, biBitCount);
//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
if(biBitCount==8)
colorTablesize=1024;
if(cntRGB>0)
colorTablesize=4*cntRGB;
//待存储图像数据每行字节数为4的倍数
lineByte=(width * biBitCount/8+3)/4*4;
//lineByte=-pDIB->nPitch;
//以二进制写的方式打开文件
if(pIFile==0) return 0;
//申请位图文件头结构变量,填写文件头信息
bfType = 0x4D42;//bmp类型
//bfSize是图像文件4个组成部分之和
//为了保证最后一行字节为4的位数,需要加上dataSize字节
dataSize=4-(lineByte*height-10)%4;
fileHead.bfSize= 2+sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ colorTablesize + lineByte*height+dataSize;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
//bfOffBits是图像文件前3个部分所需空间之和
fileHead.bfOffBits=54+colorTablesize;
//写文件头进文件
IFILE_Write(pIFile,&bfType, 2);
IFILE_Write(pIFile,&fileHead, sizeof(BITMAPFILEHEADER));
//申请位图信息头结构变量,填写信息头信息
head.biBitCount=biBitCount;
head.biClrImportant=cntRGB;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*height+dataSize;
head.biWidth=width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
head.biClrUsed=0x0000+cntRGB;
//写位图信息头进内存
IFILE_Write(pIFile,&head, sizeof(BITMAPINFOHEADER));
//如果灰度图像,有颜色表,写入文件
if(cntRGB==0&&biBitCount==8)
IFILE_Write(pIFile,pColorTable, sizeof(RGBQUAD)*256);
else
IFILE_Write(pIFile,pColorTable,colorTablesize);
//写位图数据进文件
IFILE_Write(pIFile,imgBuf, height*lineByte+dataSize);
//关闭文件
IFILE_Release(pIFile);
return 1;
}
void saveBrewBmp(CFileApp* pApp,IBitmap *pBmp,char * bmpName)
{
IDIB* pDIB = NULL;
IBITMAP_QueryInterface(pBmp,AEECLSID_DIB, (void**)&pDIB);
saveBmp(pApp,bmpName,pDIB);
}
/****************************************************/
调用部分源码
case EVT_APP_START:
// 创建文件管理器
ISHELL_CreateInstance(pMe->a.m_pIShell,AEECLSID_FILEMGR,(void**)&pMe->pIFileMgr);
// 显示位图并存盘
pBmp=ISHELL_LoadResBitmap(pMe->a.m_pIShell,BMP_RES_FILE,GAMETITLE);
IBITMAP_GetInfo(pBmp,&info,sizeof(AEEBitmapInfo));
IDISPLAY_BitBlt(pMe->a.m_pIDisplay, 10, 10, 147, 72,pBmp, 0, 0, AEE_RO_COPY);
IDISPLAY_Update(pMe->a.m_pIDisplay);
saveBrewBmp(pMe,pBmp,"test.bmp");
return(TRUE);