怎样实现JPG图像的旋转 ( 积分: 200 )

  • 主题发起人 主题发起人 刘邦
  • 开始时间 开始时间

刘邦

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个图片浏览器,主要用来浏览JPG图片,可是image控件没有提供JPG图片旋转功能
请各位大侠指教怎样实现JPG图片的旋转,
 
我做了一个图片浏览器,主要用来浏览JPG图片,可是image控件没有提供JPG图片旋转功能
请各位大侠指教怎样实现JPG图片的旋转,
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=126177
http://www.delphibbs.com/delphibbs/dispq.asp?lid=100299
http://www.delphibbs.com/delphibbs/dispq.asp?lid=142952

转90的倍数角度、转任意角度的算法都有,自己看看吧
 
图片旋转任意角度:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3075296
(bmp_rotate(Srcbmp, DestBmp: Tbitmap; angle: extended);)
这里是Jpg图像,可以如此:
procedure RotateJpg(jpgSource,jpgDest :TJPEGImage;angle: extended);
var
bmpSrc,bmpDest :TBitmap;
begin
bmpSrc :=TBitmap.Create;
bmpDest :=TBitmap.Create;
try
jpgSource.DIBNeeded;
bmpSrc .Canvas.StretchDraw(bmp.Canvas.ClipRect,jpgSource);
bmp_rotate(bmpSrc , bmpDest , angle);
jpgDest.Assign(bmpDest );
finally
bmpSrc .Destroy;
bmpDest .Destroy;
end;
end;
 
献丑了,我贴的这段代码效率很低:)
 
to dawnsong 我参考了你给的链接http://www.delphibbs.com/delphibbs/dispq.asp?lid=3075296,可是(bmp_rotate(Srcbmp, DestBmp: Tbitmap; angle: extended);)中arctan2编译不过去,不知是什么函数,找遍整个帖子也没发现,另外你的例子中bmpSrc .Canvas.StretchDraw(bmp.Canvas.ClipRect,jpgSource);一句bmp是什么变量?因为本人才疏学浅,最好给个完整的代码,万分感谢,再加100分
 
bmpSrc.Canvas.StretchDraw(bmpSrc.Canvas.ClipRect,jpgSource);
不好意思,顺手写了一下,没仔细看
 
to dawnsong 我参考了你给的链接http://www.delphibbs.com/delphibbs/dispq.asp?lid=3075296,可是(bmp_rotate(Srcbmp, DestBmp: Tbitmap; angle: extended);)中arctan2编译不过去,不知是什么函数
 
正在调试
http://www.delphibbs.com/delphibbs/dispq.asp?lid=126177
中Another_eYes的代码
呵呵。。。
 
procedure RotateBmp(bmp: TBitmap; Center: TPoint; angle: Integer);
var
tmpbmp: TBitmap;
i, j, x, y, px, py: Integer;
cAngle, sAngle: Extended;
p1, p2 :PByteArray;
NextLine:Integer;
pOrigin1,pOrigin2:PByte;
logI,logJ:Integer;
begin
while angle < 0 do Inc(angle,360);
angle := angle mod 360;
sAngle := sin(- angle * pi / 180);
cAngle := cos(- angle * pi / 180);

tmpbmp := tbitmap.create;
try
tmpbmp.assign(bmp);
tmpbmp.PixelFormat :=pf24bit;
pOrigin1 := tmpbmp.scanline[0];
NextLine := Integer(tmpbmp.scanline[1]) -Integer(pOrigin1);//增量,此处的存储结构为负
//tmpbmp.SaveToFile('log.bmp');

bmp.FreeImage;
bmp.Width :=tmpbmp.Width;
bmp.Height:=tmpbmp.Height;
bmp.PixelFormat :=pf24bit;
bmp.Canvas.FillRect(bmp.Canvas.ClipRect);
pOrigin2 := bmp.scanline[0];

try
Integer(p1) :=Integer(pOrigin1);
for i := 0 to tmpbmp.height - 1 do
begin
py := 2 * (i - center.y) - 1;
for j := 0 to tmpbmp.width - 1 do
begin
px := 2 * (j - center.x) - 1;
x := (round(px * cAngle - py * sAngle) - 1) div 2 + center.x;
y := (round(px * sAngle + py * cAngle) - 1) div 2 + center.y;
if (x>=0)and(x<tmpbmp.width)and(y>=0)and(y<tmpbmp.height) then
begin
Integer(p2) := Integer(pOrigin2) + y *NextLine +x *3;
p2[0] :=p1[0];
p2[1] :=p1[1];
p2[2] :=p1[2];
end;
Integer(p1) :=Integer(p1) +3;
logJ :=j;
end;
Integer(p1) :=Integer(pOrigin1) +NextLine *i;
logI :=i;
end;
except on e:Exception do begin
ShowMessage(IntToStr(logI));
ShowMessage(IntToStr(logJ));
end;
end;
finally
tmpbmp.Destroy;
end;
end;

procedure RotateJpg(var jpg:TJPEGImage;const angle: Integer);
var
bmp :TBitmap;
center:TPoint;
begin
bmp :=TBitmap.Create;
try
jpg.DIBNeeded;
bmp.Width :=jpg.Width;
bmp.Height:=jpg.Height;
bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect,jpg);
center.X :=(bmp.Canvas.ClipRect.Right -bmp.Canvas.ClipRect.Left) div 2;
center.Y :=(bmp.Canvas.ClipRect.Bottom-bmp.Canvas.ClipRect.Top) div 2;
RotateBmp(bmp,center,angle);
jpg.Assign(bmp);
finally
bmp.Destroy;
end;
end;

procedure TForm1.Image1DblClick(Sender: TObject);
var
jpg:TJPEGImage;
begin
jpg :=TJPEGImage.Create;
try
jpg.LoadFromFile('test.jpg');
//旋转30度
RotateJpg(jpg,30);
jpg.JPEGNeeded;
jpg.SaveToFile('log1.jpg');
Image1.Picture.Bitmap.FreeImage;
jpg.DIBNeeded;
Image1.Canvas.StretchDraw(Image1.ClientRect,jpg);
finally
jpg.Destroy;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.LoadFromFile('test.jpg');
end;
 
太感谢了,大侠就是大侠,高手就是高手[:D]
 
我想再给你100分,有没有办法?
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部