gid+使用笔记

这篇博客介绍了如何使用GDI+从内存中创建图片对象,通过`LoadImageFromMemory`函数实现,该函数接受内存数据和大小,利用`GlobalAlloc`、`GlobalLock`、`CreateStreamOnHGlobal`和`Gdiplus::Image::FromStream`等API,最终创建Gdiplus::Image对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//从内存中创建图片对象
Gdiplus::Image* LoadImageFromMemory( LPVOID pBuf,size_t dwSize )
{
HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED, dwSize);
BYTE* pMem = (BYTE*)::GlobalLock(hMem);


memcpy(pMem, pBuf, dwSize);


IStream* pStm = NULL;
::CreateStreamOnHGlobal(hMem, TRUE, &pStm);
Gdiplus::Image *pImg = Gdiplus::Image::FromStream(pStm);
if(!pImg || pImg->GetLastStatus() != Gdiplus::Ok)
{
pStm->Release();
::GlobalUnlock(hMem);
return 0;
}
return pImg;
}


//读取文件,并根据文件内存创建图片对象

Gdiplus::Image * LoadImageFromFile( LPCTSTR pszFileName )
{
LPBYTE pData = NULL;
DWORD dwSize = 0;




HANDLE hFile = ::CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, \
FILE_ATTRIBUTE_NORMAL, NULL);
if( hFile == INVALID_HANDLE_VALUE ) return NULL;
dwSize = ::GetFileSize(hFile, NULL);
if( dwSize == 0 ) return NULL;


DWORD dwRead = 0;
pData = new BYTE[ dwSize ];
::ReadFile( hFile, pData, dwSize, &dwRead, NULL );
::CloseHandle( hFile );


if( dwRead != dwSize ) {
delete[] pData;
pData = NULL;
return NULL;
}


if (!pData) return NULL;


Gdiplus::Image* pImage = LoadImageFromMemory(pData, dwSize);
delete []pData;
return pImage;
}


//根据制定的文件类型获取CLSID
CLSID GetEncoderClsidByExtension(const WCHAR * lpExtension)
{
CLSID clsid = CLSID_NULL;


if (NULL == lpExtension)
return clsid;


UINT numEncoders = 0, size = 0;
Gdiplus::Status status = Gdiplus::GetImageEncodersSize(&numEncoders, &size);  
if (status != Gdiplus::Ok)
return clsid;


Gdiplus::ImageCodecInfo* lpEncoders = (Gdiplus::ImageCodecInfo*)(malloc(size));
if (NULL == lpEncoders)
return clsid;


status = Gdiplus::GetImageEncoders(numEncoders, size, lpEncoders);
if (Gdiplus::Ok == status)
{
for (UINT i = 0; i < numEncoders; i++)
{
BOOL bFind = FALSE;
const WCHAR * pStart = lpEncoders[i].FilenameExtension;
const WCHAR * pEnd = wcschr(pStart, L';');
do 
{
if (NULL == pEnd)
{
LPCWSTR lpExt = ::wcsrchr(pStart, L'.');
if ((lpExt != NULL) && (wcsicmp(lpExt, lpExtension) == 0))
{
clsid = lpEncoders[i].Clsid;
bFind = TRUE;
}
break;
}


int nLen = pEnd-pStart;
if (nLen < MAX_PATH)
{
WCHAR cBuf[MAX_PATH] = {0};
wcsncpy(cBuf, pStart, nLen);


LPCWSTR lpExt = ::wcsrchr(cBuf, L'.');
if ((lpExt != NULL) && (wcsicmp(lpExt, lpExtension) == 0))
{
clsid = lpEncoders[i].Clsid;
bFind = TRUE;
break;
}
}
pStart = pEnd+1;
if (L'\0' == *pStart)
break;
pEnd = wcschr(pStart, L';');
} while (1);
if (bFind)
break;
}
}


free(lpEncoders);


return clsid;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值