解决方案 »

  1.   

    注意:你要设置Timage的Strech属性为True,AutoSize不要设置为True,否则转换的过程会非常慢。
    旋转JPG图像,必须要把JPG转换成BMP图像,所以我自定义了一个函数jptpbmp()
    Function TForm1.jptobmp(jpg:Tjpegimage):Tbitmap;
    begin
      result:=nil;
      if Assigned(jpg) then
      begin
        result:=Tbitmap.Create;
        jpg.DIBNeeded;
        result.Assign(jpg);
      end;
    end;然后放置了4个按钮,左转,右转,水平和垂直,代码为//左转
    procedure TForm1.Button1Click(Sender: TObject);
    var
    i,j:integer;
    Myimage:Tbitmap;
    begin
    Myimage:=Tbitmap.Create;
    Myimage.Assign(jptobmp(Tjpegimage(image1.Picture.Graphic)));
    image1.Picture.Bitmap.Height:=Myimage.Width;
    image1.Picture.Bitmap.Width:=Myimage.Height;
    image1.Picture.CleanupInstance;
    for i := 0 to Myimage.Height do
      for j := 0 to Myimage.Width do
        image1.Canvas.Pixels[i,(-j+Myimage.Width)]:=Myimage.Canvas.Pixels[j,i];
    Myimage.Free
    end;//右转
    procedure TForm1.Button2Click(Sender: TObject);
    var
    i,j:integer;
    Myimage:Tbitmap;
    begin
    Myimage:=Tbitmap.Create;
    Myimage.Assign(jptobmp(Tjpegimage(image1.Picture.Graphic)));
    image1.Picture.Bitmap.Height:=Myimage.Width;
    image1.Picture.Bitmap.Width:=Myimage.Height;
    image1.Picture.CleanupInstance;
    for i := 0 to Myimage.Height do
      for j := 0 to Myimage.Width do
        image1.Canvas.Pixels[(-i+Myimage.Height),j]:=Myimage.Canvas.Pixels[j,i];
    Myimage.Free
    end;//水平
    procedure TForm1.Button3Click(Sender: TObject);
    var
    i,j:integer;
    Myimage:Tbitmap;
    begin
    Myimage:=Tbitmap.Create;
    Myimage.Assign(jptobmp(Tjpegimage(image1.Picture.Graphic)));
    image1.Picture.Bitmap.Height:=Myimage.Height;
    image1.Picture.Bitmap.Width:=Myimage.Width;
    image1.Picture.CleanupInstance;
    for i := 0 to Myimage.Height do
      for j := 0 to Myimage.Width do
        image1.Canvas.Pixels[(-j+Myimage.Width),i]:=Myimage.Canvas.Pixels[j,i];
    Myimage.Free
    end;//垂直
    procedure TForm1.Button4Click(Sender: TObject);
    var
    i,j:integer;
    Myimage:Tbitmap;
    begin
    Myimage:=Tbitmap.Create;
    Myimage.Assign(jptobmp(Tjpegimage(image1.Picture.Graphic)));
    image1.Picture.Bitmap.Height:=Myimage.Height;
    image1.Picture.Bitmap.Width:=Myimage.Width;
    image1.Picture.CleanupInstance;
    for i := 0 to Myimage.Height do
      for j := 0 to Myimage.Width do
        image1.Canvas.Pixels[j,(-i+Myimage.Height)]:=Myimage.Canvas.Pixels[j,i];
    Myimage.Free
    end;
    图片显示虽然是适应尺寸的,但是不影响保存后和原图的品质
      

  2.   

    顺时针90度
    procedure TSeleteImageFrm.Button4Click(Sender: TObject);
    var i,j:integer;
        k,all:Longint;
        im:Tbitmap;
    begin
      GaugeFrm.show;
      GaugeFrm.Caption:='处理数据......';
      GaugeFrm.Gauge1.Progress:=0;
      im:=Tbitmap.Create;
      im.Assign(jpbmp(Tjpegimage(image1.Picture.Graphic)));
    //确定旋转后位图的大小
      image1.Picture.Bitmap.Height:=im.Width;
      image1.Picture.Bitmap.Width:=im.Height;
      image2.Picture.Bitmap.Height:=im.Width;
      image2.Picture.Bitmap.Width:=im.Height;
      image1.Picture.CleanupInstance;  //清除图象
      image2.Picture.CleanupInstance;  //清除图象
      K:=0;
      all:=Trunc(im.Height*im.Width);
      for i:=0 to im.Height do
        for j:=0 to im.Width do
        begin
          K:=K+1;
          GaugeFrm.Gauge1.Progress:=Trunc(100*K/all);
          image1.Canvas.Pixels[(-i+im.Height),j]:=im.Canvas.Pixels[j,i];
          image2.Canvas.Pixels[(-i+im.Height),j]:=im.Canvas.Pixels[j,i];
        end;
      im.Free;
      ChangeImageSize;
      GaugeFrm.close;
    end;反时针90度
    procedure TSeleteImageFrm.Button6Click(Sender: TObject);
    var i,j:integer;
        k,all:Longint;
        im:Tbitmap;
    begin
      GaugeFrm.show;
      GaugeFrm.Caption:='处理数据......';
      GaugeFrm.Gauge1.Progress:=0;
      im:=Tbitmap.Create;
      im.Assign(jpbmp(Tjpegimage(image1.Picture.Graphic)));
    //确定旋转后位图的大小
      image1.Picture.Bitmap.Height:=im.Width;
      image1.Picture.Bitmap.Width:=im.Height;
      image2.Picture.Bitmap.Height:=im.Width;
      image2.Picture.Bitmap.Width:=im.Height;
      image1.Picture.CleanupInstance;  //清除图象
      image2.Picture.CleanupInstance;  //清除图象
      K:=0;
      all:=Trunc(im.Height*im.Width);
      for i:=0 to im.Height do
        for j:=0 to im.Width do
        begin
          K:=K+1;
          GaugeFrm.Gauge1.Progress:=Trunc(100*K/all);
          image1.Canvas.Pixels[i,(-j+im.Width)]:=im.Canvas.Pixels[j,i];
          image2.Canvas.Pixels[i,(-J+im.Width)]:=im.Canvas.Pixels[j,i];
        end;
      im.Free;
      ChangeImageSize;
      GaugeFrm.close;
    end;
      

  3.   

    颠倒
    procedure TSeleteImageFrm.Button7Click(Sender: TObject);
    var i,j:integer;
        k,all:Longint;
        im:Tbitmap;
    begin
      GaugeFrm.show;
      GaugeFrm.Caption:='处理数据......';
      GaugeFrm.Gauge1.Progress:=0;
      im:=Tbitmap.Create;
      im.Assign(jpbmp(Tjpegimage(image1.Picture.Graphic)));
    //确定旋转后位图的大小
      image1.Picture.Bitmap.Height:=im.Height;
      image1.Picture.Bitmap.Width:=im.Width;
      image2.Picture.Bitmap.Height:=im.Height;
      image2.Picture.Bitmap.Width:=im.Width;
      image1.Picture.CleanupInstance;  //清除图象
      image2.Picture.CleanupInstance;  //清除图象
      K:=0;
      all:=Trunc(im.Height*im.Width);
      for i:=0 to im.Width do
        for j:=0 to im.Height do
        begin
          K:=K+1;
          GaugeFrm.Gauge1.Progress:=Trunc(100*K/all);
          image1.Canvas.Pixels[(im.Width-i),(im.Height-j)]:=im.Canvas.Pixels[i,j];
          image2.Canvas.Pixels[(im.Width-i),(im.Height-j)]:=im.Canvas.Pixels[i,j];
        end;
      im.Free;
      ChangeImageSize;
      GaugeFrm.close;
    end;
      

  4.   

    翻转(水平)
    procedure TSeleteImageFrm.Button13Click(Sender: TObject);
    var i,j:integer;
        k,all:Longint;
        im:Tbitmap;
    begin
      GaugeFrm.show;
      GaugeFrm.Caption:='处理数据......';
      GaugeFrm.Gauge1.Progress:=0;
      im:=Tbitmap.Create;
      im.Assign(jpbmp(Tjpegimage(image1.Picture.Graphic)));
    //确定旋转后位图的大小
      image1.Picture.Bitmap.Height:=im.Height;
      image1.Picture.Bitmap.Width:=im.Width;
      image2.Picture.Bitmap.Height:=im.Height;
      image2.Picture.Bitmap.Width:=im.Width;
      image1.Picture.CleanupInstance;  //清除图象
      image2.Picture.CleanupInstance;  //清除图象
      K:=0;
      all:=Trunc(im.Height*im.Width);
      for i:=0 to im.Height do
        for j:=0 to im.Width do
        begin
          K:=K+1;
          GaugeFrm.Gauge1.Progress:=Trunc(100*K/all);
          image1.Canvas.Pixels[(-j+im.Width),(i)]:=im.Canvas.Pixels[j,i];
          image2.Canvas.Pixels[(-J+im.Width),(i)]:=im.Canvas.Pixels[j,i];
        end;
      im.Free;
      ChangeImageSize;
      GaugeFrm.close;
    end;
    有此代码是显示进度条的,可以删除。使用二个image,目的是显示选择框,你可以只用一个。
      

  5.   

    这都是用的坐标呀。这样的效率有点差呀试试BitMap.ScanLine 比那个速度快10倍不止。