VC++ 从ZIP文件中获取图片资源

VC++图形化界面开发过程中,会需要用到很多的图片文件,部分人可能会直接通过向导直接把图像添加到项目中进行编译,这种方式加载会增加exe文件体积;部分有人可能会编写一个资源dll文件,把所有图片资源编译到dll中,通过加载dll来加载所需要的图片资源,这种方式缺点是每次修改图片,资源文件都需要重新编译一次;部分人会想到用压缩包文件,这样每次修改图片,只需要重新打包压缩包文件即可。在这里,我介绍的是第3种方式:

基于CZipImplement类扩展了一个接口:

//获取压缩文件数据
BOOL Zip_GetPackData(
    LPCTSTR lpszZipFileFullPath, // zip压缩包文件名称
    LPCTSTR lpszZipFileName,     // zip压缩包内文件相对路径
    char** ppBuffer,             // 返回文件数据缓存
    int& mSize)                  // 返回缓存大小
{
    //参数错误 
    if ((lpszZipFileName == "") || (lpszZipFileFullPath == "")) 
    { 
        //路径异常返回 
        return FALSE ; 
    } 

    CFileFind fileFind; 
    if (!fileFind.FindFile(lpszZipFileFullPath)) 
    { 
        //压缩失败(未发现压缩文件) 
        return FALSE; 
    } 

    //打开ZIP文件 
    m_zipHandle = OpenZip(lpszZipFileFullPath, 0/*加密密码*/); // 请采用zip传统加密方式
    if(m_zipHandle == 0) 
    { 
        //打开Zip文件失败 
        return FALSE; 
    } 

    ZIPENTRY ze; 
    int i; 
    if ( ZR_OK == FindZipItem(m_zipHandle, lpszZipFileName, true, &i, &ze) )
    {
        if ( NULL == *ppBuffer )
            *ppBuffer = new char[ze.unc_size];
        UnzipItem(m_zipHandle, i, *ppBuffer, ze.unc_size);
        mSize = ze.unc_size;
        CloseZip(m_zipHandle);
        return TRUE;
    }

    CloseZip(m_zipHandle); 
    return FALSE; 
}

获取到压缩包内文件数据以后,我们只需要将其转换成所需要的Gdiplus::Image*图片即可:

Gdiplus::Image* GetZipPackageImage(
	LPCTSTR lpszZipPackFileName, 
	LPCTSTR lpszFileName)
{
	CZipImplement ZipImplement;
	char* buffer = NULL;
	int iSize = 0;
	if ( ZipImplement.Zip_GetPackData(lpszZipPackFileName, lpszFileName, &buffer, iSize) ) 
	{
		IStream *stream = NULL;
		HGLOBAL global = ::GlobalAlloc( GMEM_MOVEABLE, iSize );
		if( global == NULL )
		{
			delete[] buffer;
			buffer = NULL;
			return NULL;
		}
		void *dest = ::GlobalLock( global );
		if( dest == NULL )
		{
			delete[] buffer;
			buffer = NULL;
			return NULL;
		}

		memcpy( dest, buffer, iSize );
		::GlobalUnlock( global );

		if( ::CreateStreamOnHGlobal( global, TRUE, &stream ) != S_OK )
		{
			::GlobalFree( global );
			delete[] buffer;
			buffer = NULL;
			return NULL;
		}

		Gdiplus::Bitmap *image = Gdiplus::Bitmap::FromStream( stream );
		stream->Release();
		delete[] buffer;
		buffer = NULL;
		return image;
	}

	delete[] buffer;
	buffer = NULL;
	return NULL;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值