5064|17

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince 下怎么旋转位图? [复制链接]

有没有代码可供参考?
或者有没有【成熟的算法】?
此帖出自WindowsCE论坛

最新回复

那你按中心旋转之后,移下坐标就行啦。分析一下,其实效果不是一样的吗。  详情 回复 发表于 2010-3-16 10:13
点赞 关注
 

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这种代码,网上一搜一大把。

google是最好的工具,要善加使用。
此帖出自WindowsCE论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我搜了 很多了!
有很多代码都是很不错的 但问题是 很多的GDI API在wince 下他是不支持的! 只能自己研究怎么按照算法来写代码了
不支持的API如:
GetDIBits
SetMapMode
SetWorldTransform()
所以....
此帖出自WindowsCE论坛
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

4
 
把图片数据提取为像素数组,之后对像素数组进行变换,之后再把数组转为图片DC绘出来即可。
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
想简单的话 直接用IImage 旋转。
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
一般vc图形图像的书都有吧
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 domworldjohn 的回复:
把图片数据提取为像素数组,之后对像素数组进行变换,之后再把数组转为图片DC绘出来即可。
[/quote]
这个应该可行,我先试试...



引用 5 楼 panyc33 的回复:
一般vc图形图像的书都有吧

有很多代码都是很不错的 但问题是 很多的GDI API在wince 下他是不支持的! 只能自己研究怎么按照算法来写代码了
不支持的API如:
GetDIBits
SetMapMode
SetWorldTransform()
所以....


[quote]引用 4 楼 aaa_tnt 的回复:
想简单的话 直接用IImage 旋转。

这个不能实现任意角度的旋转吧
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
直接用IImage 旋转 可以实现任意旋转,只是速度不快。
给你贴代码

BOOL CImageMaster::RotateImage(int iAngle, HDC hdc, ImageDrawMode mode, const RECT *pDstRect, const RECT *pSrcRect, BOOL bDraw)
{
        if(pDstRect == NULL)
    {
        return FALSE;
    }

        if (m_ImageInfo.Width >= 1024 || m_ImageInfo.Height >= 768)
        {               
                RECT rcDraw = {0};
               
        CalculateDrawArea(mode,pDstRect,pSrcRect,&rcDraw);
               
                m_ImageInfo.Width = rcDraw.right - rcDraw.left;
               
                m_ImageInfo.Height = rcDraw.bottom - rcDraw.top;
        }

        m_pImagingFactory->CreateBitmapFromImage(m_pImage, m_ImageInfo.Width, m_ImageInfo.Height, m_ImageInfo.PixelFormat, InterpolationHintDefault, &m_pBitmap);

        if(m_pImage != NULL)
    {
        m_pImage->Release();
        m_pImage = NULL;
    }

        m_pBitmap->QueryInterface(IID_IBasicBitmapOps, (void **)&m_pBasicBitmap);

        if (m_pBitmap != NULL)
        {
                m_pBitmap->Release();
                m_pBitmap = NULL;
        }

        m_pBasicBitmap->Rotate((float)iAngle, InterpolationHintDefault, (IBitmapImage **)&m_pBitmap);

        if (m_pBasicBitmap != NULL)
        {
                m_pBasicBitmap->Release();
                m_pBasicBitmap = NULL;
        }

        m_pBitmap->QueryInterface(IID_IImage, (void **)&m_pImage);

        if (m_pBitmap != NULL)
        {
                m_pBitmap->Release();
                m_pBitmap = NULL;
        }

        m_pImage->GetImageInfo(&m_ImageInfo);

        if(IsOKMemoryDC(&m_IntegrityMemDCInfo) == FALSE)
    {               
        if(IsOKImagingInterfaces() == FALSE)
        {
            return FALSE;
        }
               
        if(CreateMemoryDC(hdc,&m_IntegrityMemDCInfo,m_ImageInfo.Width,m_ImageInfo.Height) == FALSE)
        {
            return FALSE;
        }
               
        RECT rcMemDC = {0,0,m_ImageInfo.Width,m_ImageInfo.Height};   
        HRESULT hr = m_pImage->Draw(m_IntegrityMemDCInfo.hdc,&rcMemDC,NULL);
               
        if(FAILED(hr))
        {
            ReleaseImagingInterfaces();
            DeleteMemoryDC(&m_IntegrityMemDCInfo);
            return FALSE;
        }
    }
   
    BOOL bResult = TRUE;       
       
    if(bDraw == TRUE)
    {
        RECT rcDraw = {0};
        CalculateDrawArea(mode,pDstRect,pSrcRect,&rcDraw);
        bResult = Draw(hdc,&rcDraw,&m_IntegrityMemDCInfo,pSrcRect);
    }

        return bResult;
}
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 3 楼 domworldjohn 的回复:
把图片数据提取为像素数组,之后对像素数组进行变换,之后再把数组转为图片DC绘出来即可。


也可以用这种方法,不过速度照样不快,哈哈,你想,图解码要时间(bmp文件可能快点),操作像素也需要时间。可以研究下tcpmp里面那个旋转倒是挺快的。至少比这两种方法都要快。
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 
//=-=-=-=-=-=-=-======================================================================
//List 3 旋转(线性插值法)
#include   "param.h"
#include   "math.h"
/*-------rotation-------------旋转(线性插值法)---------------------------
image_in:输入图像区
image_out:输出图像区
deg:旋转角
-------------------------------------------------------------------------------*/
void rotation(unsigned char image_in[Y_SIZE][X_SIZE],
     unsigned char image_out[Y_SIZE][X_SIZE],float deg)
{
  int i,j,m,n;
  float x,y,p,q
  int xs=X_SIZE/2;
  int ys=Y_SIZE/2;
  int d;
  
  r=deg*3.141592/180.0;
  c=(float)cos(r);
  s=(float)sin(r);
  for(i=-ys;i     for(j=-xs;j       y=j*s+i*c;
      x=j*c-i*s;
      if(y>0) m=(int)y;
      else m==(int)(y-1);
      if(x>0) n=(int)x;
      else n=(int)(x-1);
      q=y-m;
      p=x-n;
      if(q==1) {q=0;m=m+1;}
      if(p==1) {p=0;n=n+1;}
      if ((m>=-ys) && (m=-xs) && (n         d=(int) ((1.0-q)*((1.0-p)*image_in[m  +ys][n +xs]
                             + p*image_in[m  +ys][n+1+xs])
                     +q*((1.0-p)*image_in[m+1+ys][n  +xs]
                             + p*image_in[m+1+ys][n+1+xs]));
      else
        d=0;
      if(d<0) d=0;
      if(d>255) d=255;
      image_out[i+ys][j+xs] = d;
    }
  }
}
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 xilidecai 的回复:
//=-=-=-=-=-=-=-======================================================================
//List 3 旋转(线性插值法)
#include  "param.h"
#include  "math.h"
/*-------rotation-------------旋转(线性插值法)------------……


这个算法是否 已经可以用 !
此帖出自WindowsCE论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

12
 
楼主可参考下DrvEscape这个函数
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 7 楼 cardano1 的回复:
直接用IImage 旋转 可以实现任意旋转,只是速度不快。
给你贴代码

BOOL CImageMaster::RotateImage(int iAngle, HDC hdc, ImageDrawMode mode, const RECT *pDstRect, const RECT *pSrcRect, BOOL bDraw)
{
if(pDstRect == NULL)
    {
……


你这个 可以实现任意角度旋转吗?
此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 trueman_onlyme 的回复:
引用 7 楼 cardano1 的回复:
直接用IImage 旋转 可以实现任意旋转,只是速度不快。
给你贴代码

BOOL CImageMaster::RotateImage(int iAngle, HDC hdc, ImageDrawMode mode, const RECT *pDstRect, const RECT *pSrcRect, BOOL bDraw)
{
if(pDs……


可以任意转 只要你提供一个角度参数就可以了iAngle
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 cardano1 的回复:

引用 12 楼 trueman_onlyme 的回复:
引用 7 楼 cardano1 的回复:
直接用IImage 旋转 可以实现任意旋转,只是速度不快。
给你贴代码

BOOL CImageMaster::RotateImage(int iAngle, HDC hdc, ImageDrawMode mode, const RECT *pDstRect, const RECT *pS……


想问下:加入我要旋转 你的头像图片:
以 孔子 的孔 为中心做旋转,而不是以中心旋转 ,你的代码能做到吗!
我看wince public 下有imaging.h  说明wince 5.0是支持这个IImage的吧!  期待你的帮助
------------------------
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

16
 
没有这样试过,估计要实现这样的要求需要对像素进行操作。想问一下这样做有什么意义吗,以中心旋转和其他点旋转,得到的图片除了视觉角度不一样,其他都是一样的吧。
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
当然有必要 是工作需要! 不是我没事干 乱来
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

18
 
那你按中心旋转之后,移下坐标就行啦。分析一下,其实效果不是一样的吗。
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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