注意:你要设置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; 图片显示虽然是适应尺寸的,但是不影响保存后和原图的品质
顺时针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;
颠倒 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;
翻转(水平) 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,目的是显示选择框,你可以只用一个。
旋转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;
图片显示虽然是适应尺寸的,但是不影响保存后和原图的品质
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;
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;
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,目的是显示选择框,你可以只用一个。