求将图像水平反转的一个过程!急!(50分)

  • 主题发起人 主题发起人 rachel1013
  • 开始时间 开始时间
R

rachel1013

Unregistered / Unconfirmed
GUEST, unregistred user!
求将图像水平反转的一个过程!急!
 
给你:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,math,
StdCtrls, ExtCtrls, jpeg;

type
TForm1 = class(TForm)
Edit1: TEdit;
Image1: TImage;
bmprotate: TButton;
Label1: TLabel;
Panel1: TPanel;
Image2: TImage;
Button1: TButton;
procedure bmprotateClick(Sender: TObject);
procedure Button1Click(Sender: TObject);


private
{ Private declarations }
public
{ Public declarations }
procedure bmp_rotate(src,dst:tbitmap;angle:extended);

end;

var
Form1: TForm1;

implementation

{$R *.DFM}

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
angle := (angle / 180) * pi; //将文本框内的内容转换成角度
c1x := src.width div 2;
c1y := src.height div 2;
c2x := dst.width div 2;
c2y := dst.height div 2;
if c2x < c2y then
n := c2y
else
n := c2x;
dec (n,1); //使n值减少1,n:=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); //返回argtan(p2yj/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.bmprotateClick(Sender: TObject);
Var
RAngle : Extended;
begin
RAngle := StrToFloat(Edit1.Text); //设置旋转的角度
bmp_rotate(Image1.Picture.bitmap,Image2.Picture.bitmap, RAngle);//运行旋转函数旋转图形
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;

end.
 
如果是WINDOWS编程,用下面这句吧:
Image1.Picture.Bitmap.Canvas.CopyRect(rect(0,0,Image1.Picture.Bitmap.Width,Image1.Picture.Bitmap.Height),
Image1.Picture.Bitmap.Canvas,
rect(Image1.Picture.Bitmap.Width,0,0,Image1.Picture.Bitmap.Height));
 
后退
顶部