图片旋转的问题,以任意角度旋转 在图片中选一点,以这一点为圆心,图片可以360度任一角度旋转 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考一下吧Delphi中的Image构件可以显示位图,进一步,我们还可以用它完成位图旋转。 ---- 把一个点绕原点旋转α角度后,新的坐标位置与原坐标位置的关系是: X=xcosα-ysinα Y= xsinα+ycosα例如要把位图顺时针旋转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);vari,j:integer;begin//确定旋转后位图的大小image2.Picture.Bitmap.Height:=image1.picture.width;image2.Picture.Bitmap.Width:=image1.picture.height;for i:=0 to image1.Height dofor j:=0 to image1.Width doimage2.canvas.Pixels[(-i+ image1.Height),j]:=image1.canvas.Pixels[j,i];end;---- 4. 编写“旋转180度”按钮的On Click事件。 procedure TForm1.Button3Click(Sender: TObject);vari,j:integer;begin//确定旋转后位图的大小image3.Picture.Bitmap.Height:=image1.picture.Height;image3.Picture.Bitmap.Width:=image1.picture.Width;for i:=0 to image1.Height dofor j:=0 to image1.Width doimage3.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]; type pRGBArray = ^TRGBArray; TRGBArray = array[0..32768 - 1] of TRGBTriple;procedure RotateBitmap(ASrcBmp, ADestBmp: TBitmap; AAngle: double);var cosTheta: double; i: integer; iOriginal: integer; iPrime: integer; j: integer; jOriginal: integer; jPrime: integer; RowOriginal: pRGBArray; RowRotated: pRGBArray; sinTheta: double; OldPixelFormat: TPixelFormat; NewCX, NewCY: integer; OldCX, OldCY: integer; TranspColor: TRGBTriple;begin OldPixelFormat := ASrcBmp.PixelFormat; ASrcBmp.PixelFormat := pf24bit; sinTheta := Sin(-AAngle * pi / 180); cosTheta := Cos(-AAngle * pi / 180); ADestBmp.Width := abs(round(ASrcBmp.Height * sinTheta)) + abs(round(ASrcBmp.Width * cosTheta)); ADestBmp.Height := abs(round(ASrcBmp.Width * sinTheta)) + abs(round(ASrcBmp.Height * cosTheta)); ADestBmp.PixelFormat := pf24bit; if ASrcBmp.Transparent then begin TranspColor.rgbtBlue := (ASrcBmp.TransparentColor and $FF0000) shr 16; TranspColor.rgbtGreen := (ASrcBmp.TransparentColor and $00FF00) shr 8; TranspColor.rgbtRed := (ASrcBmp.TransparentColor and $0000FF); end else begin TranspColor.rgbtBlue := 255; TranspColor.rgbtRed := 0; TranspColor.rgbtGreen := 0; end; OldCX := ASrcBmp.Width div 2; OldCY := ASrcBmp.Height div 2; NewCX := ADestBmp.Width div 2; NewCY := ADestBmp.Height div 2; for j := ADestBmp.Height - 1 downto 0 do begin RowRotated := ADestBmp.Scanline[j]; jPrime := (j - NewCY); for i := ADestBmp.Width - 1 downto 0 do begin iPrime := (i - NewCX); iOriginal := Round(iPrime * CosTheta - jPrime * sinTheta) + OldCX; jOriginal := Round(iPrime * sinTheta + jPrime * cosTheta) + OldCY; if (iOriginal >= 0) and (iOriginal <= ASrcBmp.Width - 1) and (jOriginal >= 0) and (jOriginal <= ASrcBmp.Height - 1) then begin RowOriginal := ASrcBmp.Scanline[jOriginal]; RowRotated[i] := RowOriginal[iOriginal] end else begin RowRotated[i] := TranspColor; end; end; end; ASrcBmp.PixelFormat := OldPixelFormat;end;procedure TForm1.Button1Click(Sender: TObject);var db:TBitmap;begin db:=TBitmap.Create; RotateBitmap(Image1.Picture.Bitmap,db,30); Image2.Picture.Bitmap.Assign(db); db.free;end; 为何提示 go 附近语法错误? 是高手的进来!,在delphi中如何实现宏替换? 用 ADOQUERY 执行 insert 语句时 因为有 字符“ ` ”,执行出错 求delphi数据库开发方面的书籍 如何实现循环检测? 怪了!请进来看看 高分得网址 如何控制打印预览(用的是quickreport)中的close 按钮事件?? 谁有现存的项目计划书Email一份给我? 如何作出象IE收藏选项里的动态菜单 怎样把图片存入数据库啊?用什么字段啊?在前端录入怎么写代码啊? DELPHI7下载问题(100分)
Delphi中的Image构件可以显示位图,进一步,我们还可以用它完成位图旋转。 ---- 把一个点绕原点旋转α角度后,新的坐标位置与原坐标位置的关系是: X=xcosα-ysinα
Y= xsinα+ycosα
例如要把位图顺时针旋转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];
pRGBArray = ^TRGBArray;
TRGBArray = array[0..32768 - 1] of TRGBTriple;procedure RotateBitmap(ASrcBmp, ADestBmp: TBitmap; AAngle: double);
var
cosTheta: double;
i: integer;
iOriginal: integer;
iPrime: integer;
j: integer;
jOriginal: integer;
jPrime: integer;
RowOriginal: pRGBArray;
RowRotated: pRGBArray;
sinTheta: double;
OldPixelFormat: TPixelFormat;
NewCX, NewCY: integer;
OldCX, OldCY: integer;
TranspColor: TRGBTriple;
begin
OldPixelFormat := ASrcBmp.PixelFormat;
ASrcBmp.PixelFormat := pf24bit;
sinTheta := Sin(-AAngle * pi / 180);
cosTheta := Cos(-AAngle * pi / 180);
ADestBmp.Width := abs(round(ASrcBmp.Height * sinTheta)) + abs(round(ASrcBmp.Width * cosTheta));
ADestBmp.Height := abs(round(ASrcBmp.Width * sinTheta)) + abs(round(ASrcBmp.Height * cosTheta));
ADestBmp.PixelFormat := pf24bit;
if ASrcBmp.Transparent then
begin
TranspColor.rgbtBlue := (ASrcBmp.TransparentColor and $FF0000) shr 16;
TranspColor.rgbtGreen := (ASrcBmp.TransparentColor and $00FF00) shr 8;
TranspColor.rgbtRed := (ASrcBmp.TransparentColor and $0000FF);
end else
begin
TranspColor.rgbtBlue := 255;
TranspColor.rgbtRed := 0;
TranspColor.rgbtGreen := 0;
end;
OldCX := ASrcBmp.Width div 2;
OldCY := ASrcBmp.Height div 2;
NewCX := ADestBmp.Width div 2;
NewCY := ADestBmp.Height div 2;
for j := ADestBmp.Height - 1 downto 0 do
begin
RowRotated := ADestBmp.Scanline[j];
jPrime := (j - NewCY);
for i := ADestBmp.Width - 1 downto 0 do
begin
iPrime := (i - NewCX);
iOriginal := Round(iPrime * CosTheta - jPrime * sinTheta) + OldCX;
jOriginal := Round(iPrime * sinTheta + jPrime * cosTheta) + OldCY;
if (iOriginal >= 0) and (iOriginal <= ASrcBmp.Width - 1) and
(jOriginal >= 0) and (jOriginal <= ASrcBmp.Height - 1) then
begin
RowOriginal := ASrcBmp.Scanline[jOriginal];
RowRotated[i] := RowOriginal[iOriginal]
end else
begin
RowRotated[i] := TranspColor;
end;
end;
end;
ASrcBmp.PixelFormat := OldPixelFormat;
end;procedure TForm1.Button1Click(Sender: TObject);
var
db:TBitmap;
begin
db:=TBitmap.Create;
RotateBitmap(Image1.Picture.Bitmap,db,30);
Image2.Picture.Bitmap.Assign(db);
db.free;
end;