在图片中选一点,以这一点为圆心,图片可以360度任一角度旋转

解决方案 »

  1.   

    参考一下吧
    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];
      

  2.   

    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;