将屏幕拷贝下来,保存为BMP,但是失真,请大家给点意见
从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;
}