请教如何在Builder中旋转图象的问题

weibz0525 2002-09-25 05:59:39
首先在form1中放置一个Image控件,然后读取BMP文件,在一个也就是这个Image控件中旋转这个。90度,180度也可以(当然在不失真的情况下旋转任意角度更好了)。请教
各位前辈他的算法是怎样?分数就200的,要的都拿去。
...全文
137 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kony123 2002-09-26
  • 打赏
  • 举报
回复
不错不错!关注!
weibz0525 2002-09-26
  • 打赏
  • 举报
回复
晕,给错了,哈,不过也没关系,那位朋友的源代码也对我很有帮助,不过可亏了这为仁兄,怎么办??我在申请个帐号给你分好了,我的手机13945091911,你看怎么办呢?哎,真对不起了
weibz0525 2002-09-26
  • 打赏
  • 举报
回复
啊,太好了,完全正确哦。真谢谢这位朋友Libran,有些地方不太明白,那个
width-j-1是怎么会事呢?-1为什么?呵呵,可能菜点,好在我本来也菜啊,我看看能不能把分给你?我可还是第一次,走了,明天上午我会看你的帖子,谢谢其他的朋友,再见
Libran 2002-09-26
  • 打赏
  • 举报
回复
这样应该好些了:
Graphics::TBitmap *TmpBmp = new Graphics::TBitmap();
TmpBmp->Width = Image1->Height;
TmpBmp->Height = Image1->Width;
for(int i=0; i<TmpBmp->Height; i++)
{
for(int j=0; j<TmpBmp->Width; j++)
{
TmpBmp->Canvas->Pixels[j][i] =
Image1->Picture->Bitmap->Canvas->Pixels[i][TmpBmp->Width-j-1];
}
}
Image1->Width = TmpBmp->Width;
Image1->Height = TmpBmp->Height;
Image1->Picture->Bitmap->Assign(TmpBmp);
delete TmpBmp;
Libran 2002-09-26
  • 打赏
  • 举报
回复
真对不起,我做实验的图片是正方形的,没这个问题
还得改改
weibz0525 2002-09-26
  • 打赏
  • 举报
回复
谢谢各位朋友的大力支持,我是个新手,每个建议对我来说都是那么 珍贵。
尤其是给出源代码的二个朋友,可见你们的态度有多认真。程序我调试了,但有一个问题,不知你们是否发现。每次旋转都会有一部分是黑的,而且怎么旋转他也
不掉,为什么,没刷新吗?还是旋转过后的坐标不对??请大家帮忙。分我都不知道怎么给了??呵呵
sandrowjw 2002-09-25
  • 打赏
  • 举报
回复
用一个旋转矩阵就可以了啊
| cosi -sini |
| sini cosi |
速度还可以呀,不慢,就是闪一下。
再说了,你用ACDSee的时候旋转图片她还要闪一下那。
hdaq 2002-09-25
  • 打赏
  • 举报
回复
要不要任意角度旋转的呢?速度不慢哟!
Libran 2002-09-25
  • 打赏
  • 举报
回复
把企鹅的整理了一下,可以用了
Libran 2002-09-25
  • 打赏
  • 举报
回复
以下是顺时针旋转Image1,每次90度的代码:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *TmpBmp = new Graphics::TBitmap();
TmpBmp->Width = Image1->Width;
TmpBmp->Height = Image1->Height;
for(int i=0; i<TmpBmp->Height; i++)
{
for(int j=0; j<TmpBmp->Width; j++)
{
TmpBmp->Canvas->Pixels[j][i] =
Image1->Picture->Bitmap->Canvas->Pixels[i][TmpBmp->Height-j];
}
}
Image1->Picture->Bitmap->Assign(TmpBmp);
delete TmpBmp;
}
jojopoper 2002-09-25
  • 打赏
  • 举报
回复
最土的方法就是用扫描一行,然后翻转。。。(当然还有的人土到了用逐点扫描的方法。。。。让人吐血!)

比较方便的方法是用RotateFlip这个API,但是只能翻转90、180、270和整图对调,比较固定。

RotateFlip的用法在MSDN上有说明和例子,一看便知。
sjd163 2002-09-25
  • 打赏
  • 举报
回复
用坐标变换:(i,j)->(x,y)
x=i*cos(d)-j*sin(d);
y=i*sin(d)+j*cos(d);

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧