大家好,我在evc4.0上编程想用Imaging.Dll来实现bmp转换为jpeg,可不知道如何使用?我按照http://www.diybl.com/course/3_program/c++/cppjs/20100630/289261.html 上讲的进行了编程,可是build时发现error C2061: syntax error : identifier 'IImagingFactory',我想问下大家我的工程下只有dll,而没有Imaging。lib,我添加了#include "initguid.h"
#include "imaging.h"
#pragma comment(lib,"Imaging.lib")
谁能帮个忙?或者说,能给个Imaging。dll与Imanging。lib资源,或者使用到这两个东西的成功例子也可以。谢谢了
------解决方案--------------------
- C/C++ code
/*******************************************************函数介绍:将文件加载到内存流中参数:[in]tszFilename,表示要打开的文件 [out]ppStream,表示内存流,将文件中的内容输出到此内存流中返回值:S_OK表示成功,否则失败*******************************************************/HRESULT CreateStreamOnFile(const TCHAR* tszFilename,IStream** ppStream){ HRESULT hrRet = S_FALSE; HGLOBAL hg = NULL; HANDLE hFile = NULL; DWORD dwSize,dwRead; BYTE* pbLocked = NULL; //打开bmp文件 hFile = CreateFile(tszFilename,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); if(INVALID_HANDLE_VALUE == hFile) { goto error; } //得到文件大小 dwSize = GetFileSize(hFile,NULL); if(0xffffffff == dwSize) { goto error; } //分配内存 hg = GlobalAlloc(GMEM_MOVEABLE,dwSize); if(NULL == hg) { goto error; } //得到已经分配的内存指针 pbLocked = (BYTE*)GlobalLock(hg); if(NULL == pbLocked) { goto error; } //读取文件内容到内存中 if(!ReadFile(hFile,pbLocked,dwSize,&dwRead,NULL)) { goto error; } //解锁已经分配的全局内存,对应于GlobalLock(hg); GlobalUnlock(hg); //创建Stream对象 hrRet = CreateStreamOnHGlobal(hg,TRUE,ppStream); //关闭文件流 CloseHandle(hFile); return hrRet; //错误处理error: if(pbLocked) GlobalUnlock(hg); if(hg) GlobalFree(hg); if(hFile) CloseHandle(hFile); return hrRet;}/***************************************************函数介绍:根据编码器类型名称得到指定的编码器CLSID参数:[in] pImagingFactory,Image接口对象 [in] wszMimeType,Image编码格式名称 [out] pclsid,编码器的CLSID返回值:TRUE:成功;FALSE:失败***************************************************/BOOL GetEncodecCLSID(IImagingFactory* pImagingFactory,WCHAR* wszMimeType,CLSID* pclsid){ UINT uiCount; ImageCodecInfo *codecs; HRESULT hr; BOOL fRet = FALSE; //枚举系统已经安装的编码器 hr = pImagingFactory->GetInstalledEncoders(&uiCount,&codecs); //查找指定格式编码器的CLSID for(UINT i = 0; i < uiCount; i++) { if(wszMimeType && !wcscmp(wszMimeType, codecs[i].MimeType)) { *pclsid = codecs[i].Clsid; fRet = TRUE; break; } } //释放内存 CoTaskMemFree(codecs); return fRet;}
------解决方案--------------------
- C/C++ code
/*******************************************************函数介绍:将文件加载到内存流中参数:[in]tszFilename,表示要打开的文件 [out]ppStream,表示内存流,将文件中的内容输出到此内存流中返回值:S_OK表示成功,否则失败*******************************************************/HRESULT CreateStreamOnFile(const TCHAR* tszFilename,IStream** ppStream){ HRESULT hrRet = S_FALSE; HGLOBAL hg = NULL; HANDLE hFile = NULL; DWORD dwSize,dwRead; BYTE* pbLocked = NULL; //打开bmp文件 hFile = CreateFile(tszFilename,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); if(INVALID_HANDLE_VALUE == hFile) { goto error; } //得到文件大小 dwSize = GetFileSize(hFile,NULL); if(0xffffffff == dwSize) { goto error; } //分配内存 hg = GlobalAlloc(GMEM_MOVEABLE,dwSize); if(NULL == hg) { goto error; } //得到已经分配的内存指针 pbLocked = (BYTE*)GlobalLock(hg); if(NULL == pbLocked) { goto error; } //读取文件内容到内存中 if(!ReadFile(hFile,pbLocked,dwSize,&dwRead,NULL)) { goto error; } //解锁已经分配的全局内存,对应于GlobalLock(hg); GlobalUnlock(hg); //创建Stream对象 hrRet = CreateStreamOnHGlobal(hg,TRUE,ppStream); //关闭文件流 CloseHandle(hFile); return hrRet; //错误处理error: if(pbLocked) GlobalUnlock(hg); if(hg) GlobalFree(hg); if(hFile) CloseHandle(hFile); return hrRet;}/***************************************************函数介绍:根据编码器类型名称得到指定的编码器CLSID参数:[in] pImagingFactory,Image接口对象 [in] wszMimeType,Image编码格式名称 [out] pclsid,编码器的CLSID返回值:TRUE:成功;FALSE:失败***************************************************/BOOL GetEncodecCLSID(IImagingFactory* pImagingFactory,WCHAR* wszMimeType,CLSID* pclsid){ UINT uiCount; ImageCodecInfo *codecs; HRESULT hr; BOOL fRet = FALSE; //枚举系统已经安装的编码器 hr = pImagingFactory->GetInstalledEncoders(&uiCount,&codecs); //查找指定格式编码器的CLSID for(UINT i = 0; i < uiCount; i++) { if(wszMimeType && !wcscmp(wszMimeType, codecs[i].MimeType)) { *pclsid = codecs[i].Clsid; fRet = TRUE; break; } } //释放内存 CoTaskMemFree(codecs); return fRet;}