把Bitmap中的图片保存至内存块

来源:互联网 发布:adobe系列软件下载 编辑:程序博客网 时间:2024/04/29 18:51

在VC编程中,通常会对已有图片进行缩放,然后,需要把缩放后的图片(gdiplus::Bitmap)以二进制形式保存至内存中,再进行其它处理,如:将内存中二进制内容保存至数据库或传递给其它处理模块。

有两种方式把Bitmap对象中图片保存至内存:

1. 先将Bitmap对象中的图片以指定格式保存至本地文件,再从本地文件读取至内存块

代码如下:

BYTE* Convert(Bitmap *pBitmap){    // 默认保存为png格式    CLSID clsid;    GetImageCLSID(_T("image/png"), &clsid);        // 临时文件    CString csTempPath = _T("C:\\temp.png");        // 先保存再读取至内存    pBitmap->Save(csTempPath, &clsid);    CFile fileRead(csTempPath, CFile::modeRead);    int iLength = fileRead.GetLength();    BYTE *pbyteBuf = new BYTE[iLength];    fileRead.Read(pbyteBuf, iLength);    fileRead.Close();        // 删除临时文件    DeleteFile(csTempPath);        return pbyteBuf;}// 获取图片的clsidint CGenerateThumbnail::GetImageCLSID(const   WCHAR*   format,   CLSID*   pCLSID) {     UINT num = 0;       UINT size = 0;       ImageCodecInfo* pImageCodecInfo = NULL;       GetImageEncodersSize(&num, &size);    if(size == 0)     {         //   编码信息不可用           return   FALSE;       }     //分配内存       pImageCodecInfo = (ImageCodecInfo*)(malloc(size));       if(pImageCodecInfo == NULL)       {         //   分配失败        return FALSE;     }     //获得系统中可用的编码方式的所有信息       GetImageEncoders(num, size, pImageCodecInfo);       //在可用编码信息中查找format格式是否被支持       for(UINT i = 0; i < num; ++i)       {           //MimeType:编码方式的具体描述           if(wcscmp(pImageCodecInfo[i].MimeType, format) == 0)           {               *pCLSID = pImageCodecInfo[i].Clsid;               free(pImageCodecInfo);               return TRUE;           }       }     free(pImageCodecInfo);       return FALSE;   }

2. 使用类COleStreamFile进行转换,把Bitmap中内容读入到stream中,再从stream中读取到内存块

代码如下:

BYTE* Convert(Bitmap *pBitmap){    // 默认保存为png格式    CLSID clsid;    GetImageCLSID(_T("image/png"), &clsid);        // 创建stream对象    COleStreamFile *pOleStream = new COleStreamFile;    if (!pOleStream->CreateMemoryStream())    {        return FALSE;    }        // 先保存至流,在读取至内存块    pBitmap->Save(pOleStream->GetStream(), &clsid);    BYTE *pbyteBuf = new BYTE[pOleStream->GetLength()];    oleStream->Read(pbyteBuf, (UINT)pOleStream->GetLength());    delete pOleStream;      return pbyteBuf;}

总结:

就转换速度而言,方式1的转换时间反而比方式2快些,这个主要是方式2在CreateMemoryStream时慢些;我估计,如果转换较大的文件的话,方式2的转换时间会更短。

方式1使用了本地文件中转,这中方式比较依赖硬盘,容易出问题;而方式2只使用内存,出问题的可能性较小。

因此,还是比较推荐方式2。





原创粉丝点击