最近,處於項目需要,需要將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;
}
真相大白!