将屏幕拷贝下来,保存为BMP,但是失真,请大家给点意见

onlysel 2011-08-19 04:20:19
从IBITMAP获得IDIB后,直接保存为BMP,却失真的厉害,不清楚是什么原因,请大家给点意见。

不多说了,直接上代码:


static boolean PIC_SaveAsBMP( PicturesApp *pMe, IBitmap *pIBitmap )
{
unsigned char *imgBuf = NULL;
int width = 0;
int height = 0;
int biBitCount = 0;

PIC_RGBQUAD *pColorTable = 0;
uint16 cntRGB = 0;
IFile *pIFile = NULL;
int colorTablesize = 0;
int lineByte = 0;
int dataSize = 0;

int dataSizebuf = 0;
int error = 0;
int i = 0;

PIC_BITMAPFILEHEADER fileHead;
PIC_BITMAPINFOHEADER head;


IDIB *pDecodedDIB = NULL;

char bmpName[PIC_MAX_FILENAME];

MSG_HIGH("PIC_SaveAsBMP( pIBitmap %d)",pIBitmap,0,0);


//如果位图数据指针为0,则没有数据传入,函数返回
if( NULL == pIBitmap)
{
return FALSE;
}


MEMSET( bmpName, 0, sizeof( bmpName ) );
STRCAT( bmpName, MYPHOTO );
STRCAT( bmpName, "xieshenghong.bmp");

DBGPRINTF_FATAL( "bmpName %s", bmpName );


IBITMAP_QueryInterface( pIBitmap,AEECLSID_DIB, (void**)&pDecodedDIB );

imgBuf = pDecodedDIB->pBmp;
width = pDecodedDIB->cx;
height = pDecodedDIB->cy;
biBitCount = pDecodedDIB->nDepth;

pColorTable = ( PIC_RGBQUAD * )pDecodedDIB->pRGB;
cntRGB = pDecodedDIB->cntRGB;

if(IFILEMGR_Test( pMe->m_pIFileMgr,bmpName)==SUCCESS)

{
pIFile=IFILEMGR_OpenFile( pMe->m_pIFileMgr,bmpName,_OFM_READWRITE);

if( pIFile )
{
DBGPRINTF("file already exists");
}
}

else
{
pIFile=IFILEMGR_OpenFile( pMe->m_pIFileMgr,bmpName,_OFM_CREATE);

if(pIFile)
{
DBGPRINTF("file create successful");
}

else
{
error=IFILEMGR_GetLastError( pMe->m_pIFileMgr) ;
}
}

if( cntRGB > 0 )
{
colorTablesize = 4 * cntRGB;
}

//ᄡ�ᄡ₩ᄡ꽈퇴￱ᅧ�ᄒ￝ᅢ﾿￐￐ᅲᅱ프ᅧ�ᅫᆰ4샤ᄆ쎠�
lineByte = ( ( width * biBitCount + 31) & ~31) >> 3;

//lineByte=-pDIB->nPitch; //ᅰ¬ᄌ￶ᅬᅱᅯᅳᄏᄍᄇ퀽ᄉ￀ᅮᅢᅪᄒ

if( pIFile == NULL )
{
return FALSE;
}

//要以二进制写的方式打开文件

//申请位图文件头结构变量,填写文件头信息

PIC_bfType = 0x4D42;//bmp类型

//bfSize是图像文件4个组成部分之和

//为了保证最后一行字节为4的位数,需要加上dataSize字节

dataSize = 4 - ( lineByte * height - 10 ) % 4;
fileHead.bfSize = 2 + sizeof( PIC_BITMAPFILEHEADER ) + sizeof( PIC_BITMAPINFOHEADER )
+ colorTablesize + lineByte*height+dataSize;


MSG_HIGH("sizeof( PIC_BITMAPFILEHEADER ) %d", sizeof( PIC_BITMAPFILEHEADER ),0,0);
MSG_HIGH("dataSize %d, lineByte %d", dataSize, lineByte, 0);


fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;


//bfOffBitsᅧᅦᅪ퇴￱ᅫᅣ테ᄚ3ᄌ￶ᄇ﾿위ᅨ￐│﾿ᅰᄐ¦ᅱᆴ촤
fileHead.bfOffBits=54 + colorTablesize;

//￐ᄡᅫᅣ톼ᄋᄑ￸ᅫᅣᄐ
IFILE_Write(pIFile,&PIC_bfType, 2);
IFILE_Write( pIFile,&fileHead, sizeof( PIC_BITMAPFILEHEADER ) );

//申请位图信息头结构变量,填写信息头信息

head.biSize=40;
head.biWidth=width;
head.biHeight=height;
head.biPlanes=1;


head.biBitCount=biBitCount;
head.biCompression=0;
head.biSizeImage=lineByte*height+dataSize;
head.biXPelsPerMeter=0;

head.biYPelsPerMeter=0;
head.biClrUsed = 0;//cntRGB;
head.biClrImportant = 0;//cntRGB;

//￐ᄡᅫ콰ᄐ￐ᅤᅬ꽈ᄋᄑ￸ᅣᅳᄡ₩
IFILE_Write(pIFile,&head, sizeof( PIC_BITMAPINFOHEADER ));

IFILE_Write(pIFile,pColorTable,colorTablesize);

/*写位图数据进文件

* IFILE_Write(pIFile,imgBuf, height*lineByte+dataSize);

* 不用上一句的写法是因为BMP格式图片与IDIB中的数据不是采用

* 相同标系的。

*/

IFILE_Write( pIFile,&dataSizebuf, dataSize );

for( i = height; i > 0; i-- )
{
if( IFILE_Write( pIFile,( imgBuf + (i -1 )*lineByte ), lineByte ) == 0 )
{
MSG_ERROR("IFILE_Write--Unsuccessful", 0, 0, 0);
}
}

//关闭文件D
IFILE_Release(pIFile);

return TRUE;

}
...全文
1922 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,851

社区成员

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

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