wince 下怎么旋转位图?

zyc002002   2010-3-8 10:24 楼主
有没有代码可供参考?
或者有没有【成熟的算法】?

回复评论 (17)

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

google是最好的工具,要善加使用。
点赞  2010-3-8 10:41
我搜了 很多了!
有很多代码都是很不错的 但问题是 很多的GDI API在wince 下他是不支持的! 只能自己研究怎么按照算法来写代码了
不支持的API如:
GetDIBits
SetMapMode
SetWorldTransform()
所以....
点赞  2010-3-8 10:46
把图片数据提取为像素数组,之后对像素数组进行变换,之后再把数组转为图片DC绘出来即可。
点赞  2010-3-8 12:59
想简单的话 直接用IImage 旋转。
点赞  2010-3-8 13:07
一般vc图形图像的书都有吧
点赞  2010-3-8 13:39
引用: 引用 3 楼 domworldjohn 的回复:
把图片数据提取为像素数组,之后对像素数组进行变换,之后再把数组转为图片DC绘出来即可。

这个应该可行,我先试试...



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

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


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

这个不能实现任意角度的旋转吧
点赞  2010-3-8 15:18
直接用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;
}
点赞  2010-3-8 17:12
引用: 引用 3 楼 domworldjohn 的回复:
把图片数据提取为像素数组,之后对像素数组进行变换,之后再把数组转为图片DC绘出来即可。


也可以用这种方法,不过速度照样不快,哈哈,你想,图解码要时间(bmp文件可能快点),操作像素也需要时间。可以研究下tcpmp里面那个旋转倒是挺快的。至少比这两种方法都要快。
点赞  2010-3-8 17:18
//=-=-=-=-=-=-=-======================================================================
//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;
    }
  }
}
点赞  2010-3-10 14:38
引用: 引用 9 楼 xilidecai 的回复:
//=-=-=-=-=-=-=-======================================================================
//List 3 旋转(线性插值法)
#include  "param.h"
#include  "math.h"
/*-------rotation-------------旋转(线性插值法)------------……


这个算法是否 已经可以用 !
点赞  2010-3-13 09:02
楼主可参考下DrvEscape这个函数
点赞  2010-3-13 23:19
引用: 引用 7 楼 cardano1 的回复:
直接用IImage 旋转 可以实现任意旋转,只是速度不快。
给你贴代码

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


你这个 可以实现任意角度旋转吗?
点赞  2010-3-15 17:11
引用: 引用 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
点赞  2010-3-15 18:02
引用: 引用 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的吧!  期待你的帮助
------------------------
点赞  2010-3-16 08:42
没有这样试过,估计要实现这样的要求需要对像素进行操作。想问一下这样做有什么意义吗,以中心旋转和其他点旋转,得到的图片除了视觉角度不一样,其他都是一样的吧。
点赞  2010-3-16 09:22
当然有必要 是工作需要! 不是我没事干 乱来
点赞  2010-3-16 09:43
那你按中心旋转之后,移下坐标就行啦。分析一下,其实效果不是一样的吗。
点赞  2010-3-16 10:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复