读书人

哪位高手有可以把图像旋转任意角度的代

发布时间: 2012-02-06 15:52:44 作者: rapoo

谁有可以把图像旋转任意角度的代码?
针对真彩色的,或灰量图象的都可以.

[解决办法]
#include <algorithm>
#include <valarray.h>

void S_PicXZ(Graphics::TBitmap *Source,Graphics::TBitmap *NewPic,int angle)
{
if(angle> 180)angle=360-angle;
if(angle <-180)angle=360+angle;

float radians=(2*3.1416*angle)/360;
float cosine=(float)cos(radians);
float sine=(float)sin(radians);
float Point1x=(-Source-> Height*sine);
float Point1y=(Source-> Height*cosine);
float Point2x=(Source-> Width*cosine-Source-> Height*sine);
float Point2y=(Source-> Height*cosine+Source-> Width*sine);
float Point3x=(Source-> Width*cosine);
float Point3y=(Source-> Width*sine);
float minx=min((float)0,min(Point1x,min(Point2x,Point3x)));
float miny=min((float)0,min(Point1y,min(Point2y,Point3y)));
float maxx=max(Point1x,max(Point2x,Point3x));
float maxy=max(Point1y,max(Point2y,Point3y));
int DestBitmapWidth,DestBitmapHeight;
if(angle> 90&&angle <180)
DestBitmapWidth=(int)ceil(-minx);
else
DestBitmapWidth=(int)ceil(maxx-minx);

if(angle> -180&&angle <-90)
DestBitmapHeight=(int)ceil(-miny);
else
DestBitmapHeight=(int)ceil(maxy-miny);

NewPic-> Height=DestBitmapHeight;
NewPic-> Width=DestBitmapWidth;
for(int x=0;x <DestBitmapWidth;x++)
{
for(int y=0;y <DestBitmapHeight;y++)
{
int SrcBitmapx=(int)((x+minx)*cosine+(y+miny)*sine);
int SrcBitmapy=(int)((y+miny)*cosine-(x+minx)*sine);
if(SrcBitmapx> =0&&SrcBitmapx <Source-> Width&&SrcBitmapy> =0&&
SrcBitmapy <Source-> Height)
{
NewPic-> Canvas-> Pixels[x][y]=Source-> Canvas-> Pixels[SrcBitmapx][SrcBitmapy];
}
}
}
}
//---------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Graphics::TBitmap *oldPic = new Graphics::TBitmap();
Graphics::TBitmap *newPic = new Graphics::TBitmap();
oldPic-> LoadFromFile( "c:\\a.bmp ");
S_PicXZ(oldPic,newPic,30);
BitBlt(Canvas-> Handle,0,0,newPic-> Width,newPic-> Height,newPic-> Canvas-> Handle,0,0,SRCCOPY);
}
//---------------------------------------
[解决办法]
http://blog.csdn.net/Y___Y/archive/2007/03/22/1537376.aspx
上面有三种方法
[解决办法]
plgblt或者自己写算法
[解决办法]
BMP转任意角度
void(int angle)//45° for example
{
//int angle=45;
Graphics::TBitmap *SrcBitmap=new Graphics::TBitmap;
Graphics::TBitmap *DestBitmap=new Graphics::TBitmap;
SrcBitmap-> LoadFromFile( "Crayon.bmp ");
//Convert degrees to radians
float radians=(2*3.1416*angle)/360;

float cosine=(float)cos(radians);
float sine=(float)sin(radians);

float Point1x=(-SrcBitmap-> Height*sine);
float Point1y=(SrcBitmap-> Height*cosine);
float Point2x=(SrcBitmap-> Width*cosine-SrcBitmap-> Height*sine);
float Point2y=(SrcBitmap-> Height*cosine+SrcBitmap-> Width*sine);
float Point3x=(SrcBitmap-> Width*cosine);
float Point3y=(SrcBitmap-> Width*sine);

float minx=min(0,min(Point1x,min(Point2x,Point3x)));
float miny=min(0,min(Point1y,min(Point2y,Point3y)));
float maxx=max(Point1x,max(Point2x,Point3x));


float maxy=max(Point1y,max(Point2y,Point3y));

int DestBitmapWidth=(int)ceil(maxx-minx);
int DestBitmapHeight=(int)ceil(maxy-miny);

DestBitmap-> Height=DestBitmapHeight;
DestBitmap-> Width=DestBitmapWidth;
}

读书人网 >C++ Builder

热点推荐