这种代码,网上一搜一大把。
google是最好的工具,要善加使用。
我搜了 很多了!
有很多代码都是很不错的 但问题是 很多的GDI API在wince 下他是不支持的! 只能自己研究怎么按照算法来写代码了
不支持的API如:
GetDIBits
SetMapMode
SetWorldTransform()
所以....
把图片数据提取为像素数组,之后对像素数组进行变换,之后再把数组转为图片DC绘出来即可。
引用: 引用 3 楼 domworldjohn 的回复:
把图片数据提取为像素数组,之后对像素数组进行变换,之后再把数组转为图片DC绘出来即可。
这个应该可行,我先试试...
引用: 引用 5 楼 panyc33 的回复:
一般vc图形图像的书都有吧
有很多代码都是很不错的 但问题是 很多的GDI API在wince 下他是不支持的! 只能自己研究怎么按照算法来写代码了
不支持的API如:
GetDIBits
SetMapMode
SetWorldTransform()
所以....
引用: 引用 4 楼 aaa_tnt 的回复:
想简单的话 直接用IImage 旋转。
这个不能实现任意角度的旋转吧
直接用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;
}
引用: 引用 3 楼 domworldjohn 的回复:
把图片数据提取为像素数组,之后对像素数组进行变换,之后再把数组转为图片DC绘出来即可。
也可以用这种方法,不过速度照样不快,哈哈,你想,图解码要时间(bmp文件可能快点),操作像素也需要时间。可以研究下tcpmp里面那个旋转倒是挺快的。至少比这两种方法都要快。
//=-=-=-=-=-=-=-======================================================================
//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;
}
}
}
引用: 引用 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
引用: 引用 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的吧! 期待你的帮助
------------------------
没有这样试过,估计要实现这样的要求需要对像素进行操作。想问一下这样做有什么意义吗,以中心旋转和其他点旋转,得到的图片除了视觉角度不一样,其他都是一样的吧。
那你按中心旋转之后,移下坐标就行啦。分析一下,其实效果不是一样的吗。