首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

IImaging接口怎么使用

2012-02-05 
IImaging接口如何使用?大家好,我在evc4.0上编程想用Imaging.Dll来实现bmp转换为jpeg,可不知道如何使用?我

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资源,或者使用到这两个东西的成功例子也可以。谢谢了

[解决办法]

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;} 


[解决办法]

C/C++ code
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>

热点排行