这是我用Pixels写的一个图象转置的程序,很慢
var
  SourcePic,DestPic:TBitmap;for i:=0 to SourcePic.Width-1 do
begin
  for j:=0 to SourcePic.Height-1 do
  begin
    DestPic.Canvas.Pixels[j,i]:=SourcePic.Canvas.Pixels[i,j];
  end;
end;请用scanline改写,让我参考一下,谢谢

解决方案 »

  1.   

    利用Delphi实现图像的淡入淡出
    来源:www.ccidnet.com
    我们在浏览网页时见过不少图像淡入淡出的特技,其实,用Delphi也可以实现这样的效果。 
    用Delphi显示图像,有两个不可缺少的步骤,一是将图像装入Delphi隐形控件TBitmap中,二是用Canvas(画布)的Draw(x,y,Bitmap)或StretchDraw(Rect,Bitmap)方法将图像显示出来。淡出的效果就是将图像上每一个像素的颜色值进行设置,使它逐渐减少到0(黑色),实现图像的渐渐隐去。利用Canvas的Scanline属性可读取和设置图像每一行的像素颜色,我们就是利用它来实现特技的。淡入则是将一幅图像装入两个TBitmap对象,一个用来保存原始颜色,另一个用来处理,将像素的颜色从0逐渐递增到原始图的颜色,实现淡入的效果。 
    准备工作:新建一个窗体并加入一个Image控件(用来显示图像特技),两个Button控件(用来切换淡入淡出)。下面我们将两个Button的Click事件源码介绍如下: 
    unit drdc;
    interface
    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
    type
    TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    var
    Form1: TForm1;
    implementation
    {$R .DFM}
    procedure TForm1.Button1Click(Sender: TObject);
    var
    x,y,i:integer;
    Bitmap:TBitmap;
    pixcolo:PByteArray;
    begin
    Bitmap:=TBitmap.Create;
    //创建TBitMap实例
    try
    Bitmap.LoadFromFile
    ('c:\windows\clouds.bmp');
    Bitmap.PixelFormat:=pf24bit;
    for i:=0 to 255 do
    begin
    for y:=0 to Bitmap.Height-1 do
    begin
    pixcolo:=Bitmap.Scanline[y];
    //扫描每行像素颜色
    for x:=0 to ((Bitmap.Width3)-1) do
    if pixcolo[x]>0 then pixcolo[x]:=(pixcolo[x]-1);
    //递减颜色值,不同的递减值可改变不同的速度
    end;
    Image1.Canvas.Draw(0,0,Bitmap);
    //画出图像
    Application.ProcessMessages;
    //系统做其他工作
    end;
    finally
    Bitmap.free; //释放位图
    end;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var
    x,y,i,j:integer;
    Bitmap1,Bitmap2:TBitmap;
    pixcolo1,pixcolo2:PByteArray;
    begin
    Bitmap1:=TBitmap.Create;
    Bitmap2:=TBitmap.Create;
    try
    Bitmap1.LoadFromFile('c:\windows\clouds.bmp');
    //将同一幅图像装入两个TBitmap实例
    Bitmap2.LoadFromFile('c:\windows\clouds.bmp');
    Bitmap1.pixelFormat:=pf24bit;
    Bitmap2.pixelFormat:=pf24bit;
    for y:=0 to Bitmap2.height-1 do
    begin
    pixcolo2:=Bitmap2.Scanline[y];
    for x:=0 to ((Bitmap2.Width3)-1) do
    pixcolo2[x]:=0;
    //先将要处理的图像的像素颜色值设为0
    end;
    for i:=0 to 255 do
    begin
    for y:=0 to Bitmap2.Height-1 do
    begin
    pixcolo2:=Bitmap2.Scanline[y];
    pixcolo1:=Bitmap1.Scanline[y];
    for x:=0 to ((Bitmap2.Width3)-1) do if pixcolo2[x]<pixcolo1[x] then pixcolo2[x]:=(pixcolo2[x]+1);
    end;
    //与原始图的像素颜色值比较,并递增其值直到与原始图相等
    Image1.Canvas.Draw(0,0,Bitmap2);
    Application.ProcessMessages;
    end;
    finally
    Bitmap1.free
    end;
    end;
    end. 利用上面的程序,我们就在Delphi中初步实现了图像的淡入淡出效果。  
     
      

  2.   

    不懂呀,有没有人能说一下scanline的各个参数的意义,和返回值的意义
      

  3.   

    http://expert.csdn.net/Expert/topic/1220/1220577.xml不就一个参数?表示第几行!从0到Height-1!
      

  4.   

    那么我怎么用scanline读出RGB的值
      

  5.   

    看上面的例子,看看TRGBTriple是什么?
      

  6.   

    懂了,谢谢大家,scanline只能读一行,那我想作图象旋转90度,还是不方便,谁知道怎么作才能速度快
      

  7.   

    type
      tagRGBColor = packed record
        Blue : Byte;   //兰色分量值
        Green : Byte;  //绿色分量值
        Red : Byte;    //红色分量值
      
      PImageRow = ^TImageRow;
      TImageRow = Array[0..32767] of tagRGBColor;
      
      TImageColorData = Array of TImageRow;
    end;//获取位图的行和列像素色彩数据
    //下面的过程,给Src动态分配了内存,当不再使用Src时,要用函数
    //  FreeMem(),释放掉它。
    // 例如要访问位图图象上位于第3行,第7列的像素的颜色值:
    //  可以这样:
    //  "Src[2][6].Red"(获取该点颜色的红色分量值) 
    //获取该点颜色的其它分量值,依理同上 
    procedure GetImageColorData(Src: TImageColorData; Bmp: TBitmap);
    var
      i : Integer;
    begin
      if (not Assigned(Bmp)) or Bmp.Empty then  Exit;
      GetMem(Src, Bmp.Height * SizeOf(TImageRow));
      Bmp.PixelFormat := pf24bit;
      for i := 0 to Bmp.Height - 1 do
        Src[i] := Bmp.ScanLine[i]; 
    end;
      

  8.   

    这个么
    http://expert.csdn.net/Expert/topic/1220/1220577.xml
    网页无法显示 
    网页地址不正确,因此您要寻找的网页无法显示。  --------------------------------------------------------------------------------请尝试下列操作:如果您在“地址”栏中键入了网页地址,请检查地址输入是否正确。打开 expert.csdn.net 主页,寻找指向所需信息的链接。 
    HTTP 405 - 资源被禁止
    Internet 信息服务
     
      

  9.   

    http://expert.csdn.net/expert/Topicview2.asp?id=1220577
      

  10.   

    TO:ehom
    非常感谢你,我试了试你的代码,感觉速度不够理想,还有更快的方法么
    这个是演示
    http://www.77168.com/amartapple/exe.rar
      

  11.   

    在现有情况下,基于Delphi的TBitmap,这应该是最快的方法了!想再块,可以考虑利用嵌入ASM代码来做,比如自己分配内存空间,调用64位寄存器,调用CPU扩展指令集,MMX,SSE,3D NOW什么的来进行矩阵运算!
      

  12.   

    http://bluemoon.myrice.com/efg/scanline.htm
    关于SCANLINE;
    http://bluemoon.myrice.com/efg/RTTbySL.htm
    用SCANLINE做旋转;
    有文字说明。