怎样将Image1中的aa.jpg图像旋转90度?

sbxtzhl 2002-12-01 12:13:02
请给源码,谢谢!
...全文
328 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ehom 2002-12-02
  • 打赏
  • 举报
回复
真拿你没办法,这次把示例程序给你!
http://www.ehomsoft.com/pictest.zip
HOOK_TTG 2002-12-02
  • 打赏
  • 举报
回复
一定行的!!!给我加分吧!!!
--- 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];
sbxtzhl 2002-12-02
  • 打赏
  • 举报
回复
各位高手的帮助,在些小弟表示特别感谢,但我还是没有调试出来,请各位再帮助解决为感!!
VisualLion 2002-12-02
  • 打赏
  • 举报
回复
像素级处理
耙子 2002-12-01
  • 打赏
  • 举报
回复
你把它当作矩阵,他的算法就是矩阵的旋转了。
ehom 2002-12-01
  • 打赏
  • 举报
回复
TemBmp.Assign(TemBmp);
改为
TemBmp.Assign(JPG);
ehom 2002-12-01
  • 打赏
  • 举报
回复
VAR
Bitmap:TBitmap;
TemBmp:TBitamp;
JPG:TJPEGImage;
i : INTEGER;
j : INTEGER;
rowIn : pRGBArray;
BEGIN
JPG := TJPEGImage.Create;
JPG.LoadFromFile(FilName);
TemBmp := TBitmap.Create;
TemBmp.Assign(TemBmp);
Bitmap := TBitmap.Create;
Bitmap.Width := TemBmp.Height;
Bitmap.Height := TemBmp.Width;
Bitmap.PixelFormat := TemBmp.PixelFormat;
FOR j := 0 TO TemBmp.Height - 1 DO
BEGIN
rowIn := TemBmp.ScanLine[j];
FOR i := 0 TO TemBmp.Width - 1 DO
pRGBArray(Bitmap.ScanLine[TemBmp.Width - i - 1])[j] := rowIn[i]
END;
END;

lfstudy 2002-12-01
  • 打赏
  • 举报
回复
还是用CopyRect吧,最方便的方法
CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: TRect)
提示:Dest,Source的不同可实现图像的翻转、旋转等操作
ehom 2002-12-01
  • 打赏
  • 举报
回复
TYPE
TRGBArray = ARRAY[0..65534] OF TRGBTriple;
pRGBArray = ^TRGBArray;

这个当然不能少!

TBitmap纯属笔误!
sbxtzhl 2002-12-01
  • 打赏
  • 举报
回复
错误信息如下:请指教
[Error] Unit1.pas(30): Undeclared identifier: 'TBitamp'
[Error] Unit1.pas(34): Undeclared identifier: 'pRGBArray'
lfstudy 2002-12-01
  • 打赏
  • 举报
回复
CopyRect

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧