7347|10

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE中用IImage如何旋转JPG图片 [复制链接]

我现在按照以下代码做,该代码没有添加“图片旋转功能”那三行时是可以加载一幅jpb图片到用户区(VC++2005,WinMobile 6.0中文模拟器环境):


  1. void CImagingDemoDlg::OnBnClickedRotate()
  2. {
  3.     // TODO: 在此添加控件通知处理程序代码
  4.     HRESULT hr ; //返回结果
  5.     IImagingFactory * pImagingFactory =NULL; //Image工厂接口对象
  6.     IImage * pImage = NULL;    //Image接口对象

  7.     IBitmapImage * pbmpImg = NULL;   //bmp图像
  8.     IBitmapImage * pNewbmpImg = NULL;   //旋转后的bmp图像
  9.     IBasicBitmapOps * pbmpOp = NULL;   //旋转操作
  10.     IImage * pNewImage = NULL;   //新的IImage图像
  11.     FLOAT m_RAngle = 90;

  12.     LPCTSTR szFileName = L"\\Windows Embedded.jpg"; //图象文件test.jpg

  13.     //初始化COM环境
  14.     if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
  15.     {
  16.            TRACE(L"COINIT_MULTITHREADED ERROR");
  17.         return;
  18.     }

  19.     //得到Image工厂接口对象
  20.      hr = CoCreateInstance(CLSID_ImagingFactory,
  21.                           NULL,
  22.                           CLSCTX_INPROC_SERVER,
  23.                           IID_IImagingFactory,
  24.                           (void**) &pImagingFactory);

  25.     if (FAILED(hr))
  26.     {
  27.         TRACE(L"IMAGE FACTORY CREATED ERROR");
  28.         goto finish;
  29.     }

  30.     //加载图象文件到IImage接口对象中
  31.     hr = pImagingFactory->CreateImageFromFile(szFileName,&pImage);

  32.     //
  33.     if (FAILED(hr))
  34.     {
  35.         TRACE(L"IMAGE LOAD ERROR");
  36.         goto finish;
  37.     }   
  38.     //图片旋转功能--------------------------------------------------------
  39.     hr = pImage->QueryInterface(IID_IBasicBitmapOps,(void **)&pbmpOp);
  40.     pbmpOp->Rotate(m_RAngle,InterpolationHintDefault,&pNewbmpImg);
  41.     pNewbmpImg->QueryInterface(IID_IImage,(void **)&pNewImage);

  42.     //-----------------------------------------------------------------
  43.     //开始绘制图象
  44.     //得到设备环境
  45.     CDC *pDC =GetDC();

  46.     //定义绘制尺寸
  47.     RECT rect;
  48.     GetClientRect(&rect);

  49.     //绘制图片
  50.     pImage->Draw(pDC->m_hDC, &rect, NULL);

  51.     //释放设备环境
  52.     ReleaseDC(pDC);

  53. finish:
  54.     //释放IImage接口对象
  55.     if (pImage)
  56.         pImage->Release();
  57.         
  58.     //释放IImagingFactory接口对象
  59.     if (pImagingFactory)
  60.         pImagingFactory->Release();

  61.     //释放程序占用的COM资源
  62.     CoUninitialize();

  63. }

复制代码


在hr = pImage->QueryInterface(IID_IBasicBitmapOps,(void **)&pbmpOp);
执行后返回hr=E_NOINTERFACE,对照资料说是“不支持接口”,
那是不是说俺使用的模拟器环境不支持“IID_IBasicBitmapOps”接口?

最新回复

UUG
这个就俺看就微软就没有提供现成的函数咯  详情 回复 发表于 2010-2-28 10:06
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
在VS2005的帮助文件中,查询IID_IBasicBitmapOps条目,出来的结果是只有Microsoft Windows CE 5.0的,是不是在Mobile6.0中不支持或是没有添加呢
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
一个COM对象明明支持一个接口,创建时却返回E_NOINTERFACE的问题
http://www.cppblog.com/xgzpan/archive/2008/04/29/48405.html

“ 后来我看了下我的测试工程是/MDd,而COM工程的线程模型是Free,改成Apartment就好了.解释如上.但我愚钝,还是一知半解,五一好好钻研下这两个问题:
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
IBasicBitmapOps是要从IBitmapImage接口query的,而不是IImage接口
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 ruritanian 的回复:
IBasicBitmapOps是要从IBitmapImage接口query的,而不是IImage接口


好,谢谢指点,在看看调调代码
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
好,多谢ruritanian大哥的指点,已经可以完成GIF/PNG/JPG图像的旋转功能了,具体代码如下:


  1. //JPG图片旋转功能
  2. void CImagingDemoDlg::OnBnClickedRotate()
  3. {
  4.         // TODO: 在此添加控件通知处理程序代码
  5.         HRESULT hr ;        //返回结果
  6.         IImagingFactory * pImagingFactory =NULL; //Image工厂接口对象
  7.         IImage * pImage = NULL,* pNewImage = NULL; //Image接口对象;新的IImage图像

  8.         IBitmapImage * pbmpImg = NULL,* pNewbmpImg = NULL; //GIF/PNG/JPG图像;旋转后的图像
  9.         IBasicBitmapOps * pbmpOp = NULL; //旋转操作
  10.         ImageInfo imageInfo;
  11.         FLOAT m_RAngle = 90;

  12.         LPCTSTR szFileName = L"\\Saturn&Jupiter.gif"; //图象文件notice.png//Windows Embedded.jpg//test.jpg

  13.         //初始化COM环境
  14.     if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
  15.     {
  16.                TRACE(L"COINIT_MULTITHREADED ERROR");
  17.                 return;
  18.     }

  19.         //得到Image工厂接口对象
  20.      hr = CoCreateInstance(CLSID_ImagingFactory,
  21.                           NULL,
  22.                           CLSCTX_INPROC_SERVER,
  23.                           IID_IImagingFactory,
  24.                           (void**) &pImagingFactory);

  25.     if (FAILED(hr))
  26.         {
  27.                 TRACE(L"IMAGE FACTORY CREATED ERROR");
  28.                 goto finish;
  29.         }

  30.         //加载图象文件到IImage接口对象中
  31.         hr = pImagingFactory->CreateImageFromFile(szFileName,&pImage);

  32.         if (FAILED(hr))
  33.         {
  34.                 TRACE(L"IMAGE LOAD ERROR");
  35.                 goto finish;
  36.         }       

  37.         //获得原图片的基本信息
  38.         pImage-> GetImageInfo(&imageInfo);
  39.         //加载图像文件到IImage接口对象中
  40.         pImagingFactory->CreateBitmapFromImage(pImage,imageInfo.Width,imageInfo.Height,imageInfo.PixelFormat,InterpolationHintDefault,&pbmpImg);
  41.         //查询某个组件是否支持某个特定的接口,若支持则QueryInterface则返回一个指向特定接口的指针;若不支持则返回一个错误代码
  42.         hr = pbmpImg->QueryInterface(IID_IBasicBitmapOps,(void **)&pbmpOp);
  43.         //顺时针旋转
  44.         pbmpOp->Rotate(m_RAngle,InterpolationHintDefault,&pNewbmpImg);
  45.         //IBitmapImage对象->IImage对象
  46.         hr = pNewbmpImg->QueryInterface(IID_IImage,(void **)&pNewImage);

  47.         //开始绘制图象
  48.         //得到设备环境
  49.         CDC *pDC =GetDC();

  50.         //定义绘制尺寸
  51.         RECT rect;
  52.         GetClientRect(&rect);

  53.         //绘制图片
  54.         //pImage->Draw(pDC->m_hDC, &rect, NULL);
  55.         pNewImage->Draw(pDC->m_hDC, &rect, NULL);

  56.         //释放设备环境
  57.         ReleaseDC(pDC);

  58. finish:
  59.         //释放IImage接口对象
  60.     if (pImage)
  61.         pImage->Release();
  62.         
  63.         //释放IImagingFactory接口对象
  64.     if (pImagingFactory)
  65.         pImagingFactory->Release();

  66.         //释放程序占用的COM资源
  67.     CoUninitialize();

  68. }

复制代码


 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
至于“能否用BMP,GIF文件,用IImage实现GIF文件的旋转啊?”这个问题,俺觉得流程应该要相应改变...
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

8
 
up
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

9
 
后来试了一下,这个函数可以实现“BMP/GIF/PNG/JPG图像的旋转功能”的实现, 如果所选用的图片太大,有可能运行时不能旋转,运行出错!

这个帖子要“申请推荐”!!
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

10
 
不错,我试了一下,只能旋转90,180,270度
那位高手知道怎么实现任意角度旋转?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 zyanhui 的回复:
不错,我试了一下,只能旋转90,180,270度
那位高手知道怎么实现任意角度旋转?



这个就俺看就微软就没有提供现成的函数咯
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表