导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2003/9/30 23:06:22
标题:
我的帖子怎么没人回啊,希望朋友们多多指教撒,再问一个问题!
浏览:3052
加入我的收藏
楼主:
图象怎么在delphi中怎么旋转啊!!
----------------------------------------------
李————
作者:
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.
----------------------------------------------
作者:
2003/10/3 16:22:16
4楼:
你说的方法我都用过的,不过在实行任意角度的旋转时,图像就完全面目全非了, 也就是错位很严重!大侠,能帮我继续解决一下这个问题吗?谢谢先!
----------------------------------------------
李————
作者:
2003/10/3 16:42:31
5楼:
还有一点就是图像旋转的很慢。加入Timer组件的话,图像就变得更乱七八糟的。我想在旋转的时候保持图像的原样也就是看上去是整个图像在转,改如何实现,请执教!
----------------------------------------------
李————
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/10/3 17:15:53
6楼:
是啊,图象自动旋转 我还很少见到 能保持 图象 原样的 因为坐标 很难控制 ,我MEDIA PLAYER 中的 图象也是面目全非的,完全是 怎么想就怎么写,根本不管他原来的样子! 等待高手解决。。。。。。
----------------------------------------------
作者:
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. 请问原因。
----------------------------------------------
还是很菜,继续努力!
作者:
2003/11/26 18:36:48
8楼:
-旋转的问题,我已经解决拉! 过今天有机会就吧它做成第三方控件发布出来
----------------------------------------------
李————
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/11/26 19:32:19
9楼:
谢谢!
----------------------------------------------