最近,處於項目需要,需要將Bmp轉換爲JPEG格式。以前做過,採用的是GDI+的方式,該方式有一個極大地缺陷爲無法實現跨平臺處理。閒話少說,進入正題。
CxImage cxImageBmp(pRGBBuffer, dwRGBSize, CXIMAGE_FORMAT_BMP);
cxImageBmp.Save("D:\\ttt.jpg",CXIMAGE_FORMAT_JPG);
該方式很正常,順利將RGB格式24位BMP圖像轉化爲本地JPG文件並保存下來。
但是採用以下內存轉換方式,卻失敗了。
BYTE* pJpgDataTemp = new BYTE[1024 * 1024];
int lJpgSize = 0;
bool b = cxImageBmp.Encode(pJpgDataTemp,lJpgSize,CXIMAGE_FORMAT_JPG);
一方面,函數返回值爲false;另一方面,數據長度,lJpgSize爲0。
後來,經過以下修改,成功。
BYTE* pJpgDataTemp =NULL;
int lJpgSize = 0;
bool b = cxImageBmp.Encode(pJpgDataTemp,lJpgSize,CXIMAGE_FORMAT_JPG);
爲什麼?下面我們從CxImage::Encode()定義中進行查看:
bool CxImage::Encode(BYTE * &buffer, long &size, DWORD imagetype)
{
if (buffer!=NULL)
{
strcpy(info.szLastError,"the buffer must be empty");
return false;
}
CxMemFile file;
file.Open();
if(Encode(&file,imagetype))
{
buffer=file.GetBuffer();
size=file.Size();
return true;
}
return false;
}
真相大白!