使图片任意转动的编程例子
unit unitImage; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, math; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; Image3: TImage; Button2: TButton; Button3: TButton; Button4: TButton; Image4: TImage; Button1: TButton; procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } procedure bmp_rotate(src, dst: tbitmap; angle: extended); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} { TForm1 } procedure TForm1.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; procedure TForm1.Button2Click(Sender: TObject); var i, j: integer; begin //确定旋转后位图的大小 image2.Picture.Bitmap.Height := image1.picture.width; image2.Picture.Bitmap.Width := image1.picture.height; for i := 0 to image1.Height do for j := 0 to image1.Width do image2.canvas.Pixels[(-i + image1.Height), j] := image1.canvas.Pixels[j, i]; end; procedure TForm1.Button3Click(Sender: TObject); var i, j: integer; begin //确定旋转后位图的大小 image3.Picture.Bitmap.Height := image1.picture.Height; image3.Picture.Bitmap.Width := image1.picture.Width; for i := 0 to image1.Height do for j := 0 to image1.Width do image3.canvas.Pixels[(image1.Width - j), (image1.Height - i)] := image1.canvas.Pixels[j, i]; end; procedure TForm1.Button4Click(Sender: TObject); var i, j: integer; begin //确定旋转后位图的大小 image4.Picture.Bitmap.Height := image1.picture.Width; image4.Picture.Bitmap.Width := image1.picture.Height; for i := 0 to image1.Height do for j := 0 to image1.Width do image4.canvas.Pixels[i, (image1.Width-j)] := image1.canvas.Pixels[j, i]; end; end.