IImaging接口如何使用?
大家好,我在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资源,或者使用到这两个东西的成功例子也可以。谢谢了
[解决办法]
/*******************************************************函数介绍:将文件加载到内存流中参数:[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;}
[解决办法]
/*******************************************************函数介绍:将文件加载到内存流中参数:[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;}
[解决办法]
void BmpToJpg(){ // TODO: 在此添加控件通知处理程序代码 HRESULT hr; IImagingFactory *pImagingFactory = NULL; //ImageFactory接口对象 IStream *pStream = NULL; //流接口对象 IImageSink *pImageSink = NULL; // ImageSink接口对象 IImageDecoder *pImageDecoder = NULL; //解码器接口对象 IImageEncoder *pImageEncoder = NULL; //编码器接口对象 CLSID clsidEncoder; //编码器CLSID TCHAR *tszInFileName,*tszOutFileName,*tszMime; tszInFileName = L"\\ResidentFlash\\test.bmp"; //指定待转换的图像文件 tszOutFileName = L"\\ResidentFlash\\test.jpg";//指定转换后的图像文件 tszMime = L"image/jpeg"; //指定转换后图像文件的格式 //初始化COM环境 if(FAILED(hr = CoInitializeEx(NULL,COINIT_MULTITHREADED))) { TRACE(L"COINIT_MULITITHREADED ERROR"); return; } //创建ImagingFactory接口对象 hr = CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**)&pImagingFactory); if(FAILED(hr)) { TRACE(L"IMAGE FACTORY CREATED ERROR"); goto finish; }//(1) //将文件内容加载到流中 if(FAILED(hr = CreateStreamOnFile(tszInFileName,&pStream))) { goto finish; } //根据编码器类型名称得到编码器CLSID if(!GetEncodecCLSID(pImagingFactory,tszMime,&clsidEncoder)) { goto finish; }//(5) //创建编码器接口,并关联到输出文件中 if(FAILED(hr = pImagingFactory->CreateImageEncoderToFile(&clsidEncoder,tszOutFileName,&pImageEncoder))) { goto finish; }//(2) //创建解码器接口 if(FAILED(hr = pImagingFactory->CreateImageDecoder(pStream,DecoderInitFlagBuiltIn1st,&pImageDecoder))) { goto finish; }//(3) //得到编码器接口的Sink对象,此ImageSink接口作为一个槽或者管道来理解 if(FAILED(hr = pImageEncoder->GetEncodeSink(&pImageSink))) { goto finish; }//(4) //开始解码 if(FAILED(hr = pImageDecoder->BeginDecode(pImageSink,NULL))) { goto finish; } //循环解码,直到结束 for( ; ; ) { //解码 hr = pImageDecoder->Decode(); //继续解码后面的部分 if(E_PENDING == hr) { Sleep(500); } //解码失败 else if(FAILED(hr)) { //停止解码 pImageDecoder->EndDecode(hr); goto finish; } else { //解码成功 break; } } //结束解码 pImageDecoder->EndDecode(hr); //释放pImaggSink对象 pImageSink->Release(); pImageSink = NULL; //结束编码,此时就已经完成了文件格式的转换 pImageEncoder->TerminateEncoder();finish: //释放pStream对象 if(pStream) pStream->Release(); //释放pImageSink对象 if(pImageSink) pImageSink->Release(); //释放pImageDecoder对象 if(pImageDecoder) pImageDecoder->Release(); //释放pImageEncoder对象 if(pImageEncoder) pImageEncoder->Release(); //释放pImagingFactory对象 if(pImagingFactory) pImagingFactory->Release(); //释放程序占用的COM资源 CoUninitialize();}/*************************************************文件 -> 内存流 -> 解码器 -> 槽 -> 编码器 -> 文件 (1) (2) (4) (3) (5)*************************************************/
[解决办法]
#include "initguid.h"
#include <Imaging.h>