这是我用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改写,让我参考一下,谢谢
...全文
18817打赏收藏
求一段scanline的示例程序
这是我用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改写,让我参考一下,谢谢
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;
利用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.Width3)-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.Width3)-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.Width3)-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.