brew中把IBitmap对象保存成bmp图源码

hejunhard 2009-12-10 12:19:35
目前输出的图像不清晰,欢迎大家改进 ,本人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);


...全文
2033 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
赞一下
bxk253387223 2009-12-22
  • 打赏
  • 举报
回复
Mark,有空看一下。
FLYUP_CHEN 2009-12-13
  • 打赏
  • 举报
回复
不清晰的原因和设备本身是有很大关系的,和设备的现实能力有关系

3,180

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧