DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: qiaoguoqiang
今日帖子: 0
在线用户: 2
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 xiuluodao (修罗道) ★☆☆☆☆ -
普通会员
2003/9/30 23:06:22
标题:
我的帖子怎么没人回啊,希望朋友们多多指教撒,再问一个问题! 浏览:3052
加入我的收藏
楼主:      图象怎么在delphi中怎么旋转啊!!
----------------------------------------------
李————
作者:
男 sealcheng (chengcheng) ★☆☆☆☆ -
普通会员
2003/10/1 18:57:34
1楼: 有什么用??
----------------------------------------------
-
作者:
男 cnxxx (我本高手) ★☆☆☆☆ -
盒子活跃会员
2003/10/2 1:44:28
2楼: 放假了,高手睡觉去了。
http://bbs.2ccc.com/topic.asp?topicid=24163
搜索出来的。
----------------------------------------------
黑夜中,一眼望去,我就是高手。
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/10/2 7:15:23
3楼: Image 任意角度的旋轉 
兔老(轉)發布於:2001-07-11 09:29:23 
調用方法: 
   bmp_rotate(Image1.Picture.Bitmap, Image2.Picture.Bitmap, RAngle); 

procedure TfrmColor.bmp_rotate(src,dst:tbitmap;angle:extended); 
var 
  c1x,c1y,c2x,c2y:integer; 
  p1x,p1y,p2x,p2y:integer; 
  radius,n:integer; 
  alpha:extended; 
  c0,c1,c2,c3:tcolor; 
begin 
   //將角度轉換為PI值 
  angle := (angle / 180) * pi; 
   // 計算中心點,你可以修改它 
  c1x := src.width div 2; 
  c1y := src.height div 2; 
  c2x := dst.width div 2; 
  c2y := dst.height div 2;    

   // 步驟數值number 
  if c2x < c2y then 
    n := c2y 
  else 
    n := c2x; 
  dec (n,1); 

   // 開始旋轉 
  for p2x := 0 to n do begin 
    for p2y := 0 to n do begin 
      if p2x = 0 then 
        alpha:= pi/2 
      else 
        alpha := arctan2(p2y,p2x); 
      radius := round(sqrt((p2x*p2x)+(p2y*p2y))); 
      p1x := round(radius * cos(angle+alpha)); 
      p1y := round(radius * sin(angle+alpha)); 
              
      c0 := src.canvas.pixels[c1x+p1x,c1y+p1y]; 
      c1 := src.canvas.pixels[c1x-p1x,c1y-p1y]; 
      c2 := src.canvas.pixels[c1x+p1y,c1y-p1x]; 
      c3 := src.canvas.pixels[c1x-p1y,c1y+p1x]; 

      dst.canvas.pixels[c2x+p2x,c2y+p2y]:=c0; 
      dst.canvas.pixels[c2x-p2x,c2y-p2y]:=c1; 
      dst.canvas.pixels[c2x+p2y,c2y-p2x]:=c2; 
      dst.canvas.pixels[c2x-p2y,c2y+p2x]:=c3; 
    end; 
    application.processmessages 
  end; 
end; 
*************8 
----把一個點繞原點旋轉嶠嵌群螅  碌淖虃虷鼽m與原坐標位置雛 
關繫是: 

X=x  cos幔    sin? 
Y=x  sin幔    cos? 
例如要把位圖順時針旋轉90度,坐標變換公式為:X=-yY=x 

----把這一公式用到Image構件上,顯示位圖的主要問題是Image構 
件顯示的位圖隻有一個像限,並且x、y坐標也是互相顛倒的,為了 
解決這個問題,必須在Image構件上建立一個新的坐標原點。下面就 
舉例說明。 

----1.新建一工程project1,在form1上添加image1、image2、 
image3、image4,其Autosize屬性設為True,image1用來顯示原 
圖,image2、image3、image4分別用來顯示旋轉90度、180度和270 
度後的圖像。雙擊image1,選定一幅bmp圖。 

----2.添加Button1、Button2、Button3和Button4按鈕,其 
caption屬性分別為"原圖"、"旋轉90度"、"旋轉180度"、 
"旋轉270度"。 

----3.編寫"旋轉90度"按鈕的OnClick事件。 

procedureTForm1.Button2Click(Sender:TObject); 
var 
i,j:integer; 
begin 
//確定旋轉後位圖的大小 
image2.Picture.Bitmap.Height:=image1.picture.width; 
image2.Picture.Bitmap.Width:=image1.picture.height; 
fori:=0toimage1.Heightdo 
forj:=0toimage1.Widthdo 
image2.canvas.Pixels[(-i+image1.Height), 
j]:=image1.canvas.Pixels[j,i]; 
end; 


----4.編寫"旋轉180度"按鈕的OnClick事件。 

procedureTForm1.Button3Click(Sender:TObject); 
var 
i,j:integer; 
begin 
//確定旋轉後位圖的大小 
image3.Picture.Bitmap.Height:=image1.picture.Height; 
image3.Picture.Bitmap.Width:=image1.picture.Width; 
fori:=0toimage1.Heightdo 
forj:=0toimage1.Widthdo 
image3.canvas.Pixels[(image1.Width 
-j),(image1.Height-i)]:=image1.canvas.Pixels[j,i]; 
end; 

----5.編寫"旋轉270度"按鈕的OnClick事件。代碼和步驟3相 
似,隻需要用image4替換image2,然後用以下的語句替換步驟3for 
循環中的原有的語句。 

image4.canvas.Pixels[i,(image1.Width-j)]:=image1.canvas.Pixels[j,i]; 

procedure Rotate(Bmp,Dst:TFastRGB;cx,cy:Integer;Angle:Extended); 
var 
cAngle, 
sAngle:  Double; 
xDiff, 
yDiff, 
xpr,ypr, 
ix,iy, 
px,py, 
x,y:      Integer; 
Tmp:      PFColor;{what means?} 
begin 
  Angle:=-Angle*Pi/180; 
  sAngle:=Sin(Angle); 
  cAngle:=Cos(Angle); 
  xDiff:=(Dst.Width-Bmp.Width)div 2; 
  yDiff:=(Dst.Height-Bmp.Height)div 2; 
  Tmp:=Dst.Bits;{what means?} 
  for y:=0 to Dst.Height-1 do 
  begin 
    py:=2*(y-cy)+1; 
    for x:=0 to Dst.Width-1 do 
    begin 
      px:=2*(x-cx)+1; 
      xpr:=Round(px*cAngle-py*sAngle); 
      ypr:=Round(px*sAngle+py*cAngle); 
      ix:=((xpr-1)div 2+cx)-xDiff; 
      iy:=((ypr-1)div 2+cy)-yDiff; 
      if(ix>-1)and(ix<Bmp.Width)and(iy>-1)and(iy<Bmp.Height)then 
      Tmp^:=Bmp.Pixels[iy,ix]; {what means?} 
      Inc(Tmp); 
    end; 
    Tmp:=Pointer(Integer(Tmp)+Dst.Gap); {what means?} 
  end; 
end; 

原理:  
                    cos(Alpha), sin(Alpha), 0   
隻需要用源矩陣乘以  -sin(Alpha),cos(Alpha), 0 
                    0, 0, 1  

如果你發現轉過來的圖形帶有很整齊的花點,解決的辦法是反向計算,即從目標求的源點的坐標和像素值。 
以上的例子就是這樣的。 

如果真的按下面下矩陣計算每個點,目標區有一些點會是白點(因為有些源點通過計算和四舍五入在目標中湊到一起了),我以前解決的辦法是從目標求的源點的坐標和像素值,不過首先要取到目標區的區域(往往是斜的)。 
                    cos(Alpha), sin(Alpha), 0   
                    -sin(Alpha),cos(Alpha), 0 
                    0, 0, 1  

下載我說的控件嗎,有現成的例子及DEMO! 

http://www.crosswinds.net/~khojasteh/delphi-components.html 

TRotateImage v1.21   
  This component is a visual component similar to TImage with ability to rotate the image in any arbitrary angle. TRotateImage can be used on Delphi 3, 4, and 5.   

----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 xiuluodao (修罗道) ★☆☆☆☆ -
普通会员
2003/10/3 16:22:16
4楼: 你说的方法我都用过的,不过在实行任意角度的旋转时,图像就完全面目全非了,
也就是错位很严重!大侠,能帮我继续解决一下这个问题吗?谢谢先!
----------------------------------------------
李————
作者:
男 xiuluodao (修罗道) ★☆☆☆☆ -
普通会员
2003/10/3 16:42:31
5楼: 还有一点就是图像旋转的很慢。加入Timer组件的话,图像就变得更乱七八糟的。我想在旋转的时候保持图像的原样也就是看上去是整个图像在转,改如何实现,请执教!

----------------------------------------------
李————
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/10/3 17:15:53
6楼: 是啊,图象自动旋转 我还很少见到 能保持 图象 原样的
因为坐标 很难控制 ,我MEDIA PLAYER 中的 图象也是面目全非的,完全是
怎么想就怎么写,根本不管他原来的样子!

等待高手解决。。。。。。
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 niat_zxz (独孤诗魔) ★☆☆☆☆ -
盒子活跃会员
2003/11/26 13:16:56
7楼: 我照上面任意角度旋转的方法一试结果运行后出现报错:
project project1.exe raised exception class EExternalException with message 'External exception c000001E'.process stopped,use step or Run to continue.
请问原因。
----------------------------------------------
还是很菜,继续努力!
作者:
男 xiuluodao (修罗道) ★☆☆☆☆ -
普通会员
2003/11/26 18:36:48
8楼: -旋转的问题,我已经解决拉!
过今天有机会就吧它做成第三方控件发布出来
----------------------------------------------
李————
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/11/26 19:32:19
9楼: 谢谢!
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行79.10156毫秒 RSS