图片族转 ( 积分: 20 )

  • 主题发起人 主题发起人 雨之子
  • 开始时间 开始时间

雨之子

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手,我如何让我的image中的图片顺时针族转90度呀。
 
各位高手,我如何让我的image中的图片顺时针族转90度呀。
 
Delphi中的Image构件可以显示位图,进一步,我们还可以用它完成位图旋转。
---- 把一个点绕原点旋转α角度后,新的坐标位置与原坐标位置的关系是:
X=x?cosα-y?sinα
Y= x?sinα+y?cosα
例如要把位图顺时针旋转90度,坐标变换公式为:X=-y Y=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度”按钮的On Click事件。

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;


---- 4. 编写“旋转180度”按钮的On Click事件。
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;

---- 5. 编写“旋转270度” 按钮的On Click事件。代码和步骤3相似,只需要用image4 替换image2,然后用以下的语句替换步骤3 for循环中的原有的语句。
image4.canvas.Pixels[i,(image1.Width-j)]:=image1.canvas.Pixels[j,i];
---
 
全部代码:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
TempBmp:TBitmap;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure RotateBMP(BMP,TempBmp:TBitmap);
var
i,j,W:Integer;
ScOrg,ScDest:Array of PIntegerArray;
begin
TempBmp.Assign(BMP);
W:=BMP.Width;
BMP.Width:=BMP.Height;
BMP.Height:=W;
Dec(W);

SetLength(ScDest,BMP.Height);
SetLength(ScOrg,TempBmp.Height);
for i:=0 to BMP.Height-1 do ScDest:=BMP.ScanLine;
for i:=0 to TempBmp.Height-1 do ScOrg:=TempBmp.ScanLine;

for i:=0 to BMP.Height-1 do
for j:=0 to BMP.Width-1 do
ScDest[W-i][j]:=ScOrg[j];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
RotateBMP(Image1.Picture.Bitmap,TempBmp);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.Bitmap.PixelFormat:=pf32bit;
TempBmp:=TBitmap.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
TempBmp.Free;
end;

end.
 
jpg格式的图片可以族转吗?程序如何改呀。
 
各位jpg的图像不能族转吗?
 
先将jpg格式转换为Bmp格式!
 
可以给你任何角度的旋转代码!


//----------------------------------------------------------------------------//

//****************************************************************************//
// 事件:ActRotrotateAngleExecute(Sender: TObject);
// 功能:实现图片的任意角度旋转
// 备注:
//****************************************************************************//

procedure TFormCompare.MP_Rotate( SrcBMp, DestBmp : TBitMap;
Angle : Extended );
var
iC1X : integer; //
iC1Y : integer; //
iC2X : integer; //
iC2Y : integer; //
iP1X : integer; //
iP1Y : integer; //
iP2X : integer; //
iP2Y : integer; //
N : integer; //
iRadius : integer; //
Alpha : extended; //
c0 : TColor; //
c1 : TColor; //
c2 : TColor; //
c3 : TColor; //

begin
DestBmp.Width := SrcBmp.Width; // 原位图与目标位图等宽
DestBmp.Height := SrcBmp.Height; // 原位图与目标位图等高
Angle := ( Angle / 180 ) * Pi; // 将角度转换为 Pi 值

{ 计算中心点,可修改它 }
iC1X := SrcBmp.Width div 2; //
iC1Y := SrcBmp.Height div 2; //
iC2X := DestBmp.Width div 2; //
iC2Y := DestBmp.Height div 2; //

if iC2X < iC2Y then //
begin
N := iC2Y; //
end
else //
begin
N := iC2X; //
end;

Dec( N, 1); //

{ 开始旋转 }
for iP2X := 0 to N do //
begin
for iP2Y := 0 to N do //
begin
if iP2X = 0 then //
begin
Alpha := Pi / 2; //
end
else //
begin
{ArcTan2:
Calculates the arctangent angle and quadrant of a given number.
}
Alpha := ArcTan2( iP2Y,iP2X ); //
end;

// 图片旋转后的显示区域,以下的括号一定要非常注意
iRadius := Round( Sqrt( ( iP2X * iP2X ) + ( iP2Y * iP2Y ) ) );

{ 求旋转半径 }
iP1X := Round( iRadius * Cos( Angle + Alpha ) );
iP1Y := Round( iRadius * Sin( Angle + Alpha ) );

c0 := SrcBmp.Canvas.Pixels[ iC1X + iP1X, iC1Y + iP1Y ];
c1 := SrcBmp.Canvas.Pixels[ iC1X - iP1X, iC1Y - iP1Y ];
c2 := SrcBmp.Canvas.Pixels[ iC1X + iP1Y, iC1Y - iP1X ];
c3 := SrcBmp.Canvas.Pixels[ iC1X - ip1Y, iC1Y + iP1X ];

DestBmp.Canvas.Pixels[ iC2X + ip2X, iC2Y + iP2Y ] := c0;
DestBmp.Canvas.Pixels[ iC2X - iP2X, iC2Y - iP2Y ] := c1;
DestBmp.Canvas.Pixels[ iC2X + iP2Y, iC2Y - iP2X ] := c2;
DestBmp.Canvas.Pixels[ iC2X - iP2Y, iC2Y + iP2X ] := c3;
end;

{
ProcessMessages:
Interrupts the execution of an application so that it can process
the message queue.
}
application.ProcessMessages; //
end;


end;

//----------------------------------------------------------------------------//

//****************************************************************************//
// 事件:ActRotrotateAngleExecute(Sender: TObject);
// 功能:实现图片的任意角度旋转
// 备注:
//****************************************************************************//

procedure TFormCompare.ActRotrotateAngleExecute(Sender: TObject);
var
NewBmp : TBitMap; // 位图变量 NewBmp
Bmp : TBitMap; // 位图变量 Bmp
iAngle : integer; // 角度变量
StartTime : Longint; // 开始时间
EndTime : LongInt; // 结束时间
Time : Longint; // 处理所用时间
begin
// crHourGlass 为后台操作状态
Screen.Cursor := crHourGlass; // 设置鼠标的形状为等待状态
StartTime := GettickCount; // 取系统时间

NewBmp := TBitMap.Create; // 创建位图 NewBmp
Bmp := TBitMap.Create; // 创建位图 Bmp
NewBmp.PixelFormat := Pf24Bit; // 设置为 24 位真彩色位图
Bmp.PixelFormat := Pf24Bit; // 设置为 24 位真彩色位图


NewBmp.Assign( Image1.Picture.Bitmap ); // 将 Image1 赋给 NewBmp

// 输入旋转对话框,默认为 90 度
iAngle := StrToInt( InPutBox ('旋转位图', '请输入旋转角度:','90' ) );

MP_Rotate( NewBmp, Bmp, iAngle); // 调用自定义的旋转
Image2.Picture.Bitmap.Assign(Bmp); // 将 Bmp 赋给 Image2 显示出来

{ 设置图片为居中状态 }
Image2.Left := ( self.Width div 2 ) - ( Bmp.Width div 2 );
Image2.Top := ( self.Height div 2 ) - ( Bmp.Height div 2 );

NewBmp.Free; // 释放位图 NewBmp
Bmp.Free; // 释放位图 Bmp

EndTime := GettickCount; // 取系统时间
Time := EndTime - StartTime; // 处理所用时间
ShowMessageFmt('处理所用时间为:%d 毫秒',[Time]); // 显示处理时间

// crDefault 为鼠标的普通状态
Screen.Cursor := crDefault; // 恢复鼠标形状

end;
 
记得有个控件,好像叫rotimg。支持任何角度和方向。
 
多人接受答案了。
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
767
DelphiTeacher的专栏
D
D
回复
0
查看
739
DelphiTeacher的专栏
D
后退
顶部