哪位高手能看懂,并解析一下? 给高分 ---------图形方面的!!!(200分)

  • 主题发起人 主题发起人 afeisky
  • 开始时间 开始时间
A

afeisky

Unregistered / Unconfirmed
GUEST, unregistred user!
var Bitmap1, Bitmap2, Bitmap3: TBitmap;
Image1Loaded, Image2Loaded: Boolean;


procedure TForm1.FormCreate(Sender: TObject);
begin
bitmap1 := Graphics.TBitmap.Create;
bitmap2 := Graphics.TBitmap.Create;
bitmap3 := Graphics.TBitmap.Create;
bitmap1.PixelFormat := pf8bit; //?(1) pf8bit是什么意思?
bitmap2.PixelFormat := pf8bit;
bitmap3.PixelFormat := pf8bit;

try
bitmap1.LoadFromFile('factory.bmp');
bitmap2.LoadFromFile('handshak.bmp');
Image1Loaded := true;
Image2Loaded := true;
bitmap3.Palette := bitmap1.Palette; //? (2) Palette是什么来的?
bitmap3.Height := bitmap1.Height;
bitmap3.Width := bitmap1.Width;
except
Image1Loaded := false;
Image2Loaded := false;
end;
Form1.DoubleBuffered:=True;
end;

procedure TForm1.SlideFromLeft1Click(Sender: TObject);
var
Current: PByteArray;
Next: PByteArray;
ToDisplay: PByteArray;
i, y, j, z: Integer;

begin
if not (Image1Loaded) then
ShowMessage('Bitmap1 not loaded');
if not (Image2Loaded) then
ShowMessage('Bitmap2 not loaded');
if((Image1Loaded) and (Image2Loaded)) then
begin
for i := 0 to bitmap1.Width - 1 do
begin
for y := 0 to bitmap1.Height -1 do
begin //?(3) 下面这段干什么用?
Current := bitmap1.ScanLine[y];
Next := bitmap2.ScanLine[y];
ToDisplay := bitmap3.ScanLine[y];
for z := 0 to i - 1 do
ToDisplay[z] := Next[z];
for j := i to bitmap1.Width - 1 do
ToDisplay[j] := Current[j];
end;
Image1.Canvas.Draw(0,0,bitmap3); //??(4) 什么意思,直接用没效果。
Application.ProcessMessages(); //??(5) 不用则没有效果。
end;
end;
end;

程序测试是从左到右画BMP图!!!
但不知道各个语句的意思????请高手解析一下。
 
找本书看看,很常见的代码
 
哪句看不懂啊。不会你都看不懂吧?
 
for y := 0 to bitmap1.Height -1 do
begin //?(3) 下面这段干什么用?
下面是合并2个图形
Current := bitmap1.ScanLine[y];//取bitmap1一行
Next := bitmap2.ScanLine[y];//取bitmap2一行
ToDisplay := bitmap3.ScanLine[y];//取要显示的bitmap3一行
for z := 0 to i - 1 do
ToDisplay[z] := Next[z];//将bitmap2一行给bitmap3
for j := i to bitmap1.Width - 1 do//将bitmap1的1行加在后面
ToDisplay[j] := Current[j];
end;
Image1.Canvas.Draw(0,0,bitmap3); //??(4) 什么意思,直接用没效果。
将bitmap3复制到image1
Application.ProcessMessages(); //??(5) 不用则没有效果。
让程序处理其他的消息
 
var Bitmap1, Bitmap2, Bitmap3: TBitmap;
Image1Loaded, Image2Loaded: Boolean;


procedure TForm1.FormCreate(Sender: TObject);
begin
bitmap1 := Graphics.TBitmap.Create;
bitmap2 := Graphics.TBitmap.Create;
bitmap3 := Graphics.TBitmap.Create;
bitmap1.PixelFormat := pf8bit; //(1) pf8bit是指采用256色的调色板
bitmap2.PixelFormat := pf8bit;
bitmap3.PixelFormat := pf8bit;

try
bitmap1.LoadFromFile('factory.bmp'); //加载源位图
bitmap2.LoadFromFile('handshak.bmp'); //加载覆盖显示的位图
Image1Loaded := true;
Image2Loaded := true;
bitmap3.Palette := bitmap1.Palette; // (2) Palette是位图文件的调色板
bitmap3.Height := bitmap1.Height; // 输出位图的调色板余元位图相同,尺寸相同
bitmap3.Width := bitmap1.Width;
except
Image1Loaded := false;
Image2Loaded := false;
end;
Form1.DoubleBuffered:=True; // 双缓冲,避免闪烁 (Image1的GDI环境使用了父窗口的)
end;

procedure TForm1.SlideFromLeft1Click(Sender: TObject);
var
Current: PByteArray;
Next: PByteArray;
ToDisplay: PByteArray;
i, y, j, z: Integer;

begin
if not (Image1Loaded) then
ShowMessage('Bitmap1 not loaded');
if not (Image2Loaded) then
ShowMessage('Bitmap2 not loaded');
if((Image1Loaded) and (Image2Loaded)) then
begin
for i := 0 to bitmap1.Width - 1 do // 从左到右显示处理
begin
for y := 0 to bitmap1.Height -1 do // 遍历所有的扫描行
begin //(3) 采用ScanLine提高像素处理的速度
Current := bitmap1.ScanLine[y]; // 得到源位图y扫描行的缓冲
Next := bitmap2.ScanLine[y]; // 得到覆盖位图y扫描行的缓冲
ToDisplay := bitmap3.ScanLine[y]; // 得到输出位图y扫描行的缓冲
for z := 0 to i - 1 do // 左边的像素显示覆盖位图
ToDisplay[z] := Next[z];
for j := i to bitmap1.Width - 1 do // 右边的像素显示源位图
ToDisplay[j] := Current[j];
end;
Image1.Canvas.Draw(0,0,bitmap3); //(4) 结果输出到Image1的GDI环境
Application.ProcessMessages(); // 激活上一行的刷新事件,使输出可以看到
end;
end;
end;
 
bitmap1.PixelFormat := pf8bit; //?(1) pf8bit是什么意思?
pf8bit是8位的图象,还有pf16bit,pf24bit,等等

bitmap3.Palette := bitmap1.Palette; //? (2) Palette是什么来的?
Palette是Tbitmap的一个属性
 
大家看到没有,什么属性啊,:= ,赋值啊,我懂,

第二个for y 循环中,并没有给bitmap或image1赋值,去掉他怎么不行呢?
 
哦,PByteArray是指针类型的???
会不会,ToDisplay[j] 指向了bitmap1.ScanLine[y]; ?
改变了ToDisplay[j] 值就是改变了bitmap1中的一条线的值?

是不是啊,高手们。
 
问一下:
如何把bmp图片(分成10例)把10列从左到右画到image1中。
======================================
分成10列?
for i=1 to 10 do
begin
....???
end;
 
最好看一下scanline的帮助:
A:PByteArray是指针类型的???
Q:对,是指针
A:会不会,ToDisplay[j] 指向了bitmap1.ScanLine[y]; ?
Q:不是,toDisplay是指向bitmap3的第i行,是个数组
A:改变了ToDisplay[j] 值就是改变了bitmap1中的一条线的值?
Q:不是,是改变自己的一行
 
哦,知道了,
帮助是e 文的,看不懂:)

能再问一下吗?
如何把bmp图片(平均分成10例)把10列从左到右画到image1中。
======================================
分成10列?
for i=1 to 10 do
begin
....???
end;
 
Bitmap3 (ToDisplay)
|....................i...................................| ScanLine(y)
Bitmap2 (Next) Bitmap1 (Current)

上面显示了对其中一个扫描线的处理
第一个循环处理0~i像素
第二个循环处理i以后的像素
 
如何把bmp图片(分成10例)把10列从左到右画到image1中。
======================================
假设bmp为bmp1,image1的图象为bmp2;
var
p1,p2:PByteArray;
begin
for i:=0 to bmp1.height-1 do
begin
p1:=bmp1.scanline;
p2:-bmp2.scanline;
for j:=0 to 9 do p2[j]:=p1[j];
end;
end;
 
啊,谢谢weinie高手,明白了。
小弟还遇到一个这样的问题:
在TImage中,pf24bit的图像要画时,要画*3配的点,不知道为什么?

 
我的一点改进:
//for z := 0 to i - 1 do // 原程序每次循环,作了很多重复操作,费时,且最后一列未画出
// ToDisplay[z] := Next[z];
ToDisplay := Next;
if i=0 then //只做一次
for j := i+1 to bitmap1.Width - 1 do //原程序为j := i to ...
ToDisplay[j] := Current[j];
 
Q:在TImage中,pf24bit的图像要画时,要画*3配的点,不知道为什么?
A:因为PByteArray是字节数组,如果是8位图象即pf8bit刚刚好
如果是16位是2个下标存一个点的颜色值,依此类推。pf24bit当然乘3了。:)。。
 

Similar threads

I
回复
0
查看
520
import
I
I
回复
0
查看
687
import
I
I
回复
0
查看
593
import
I
I
回复
0
查看
591
import
I
I
回复
0
查看
658
import
I
后退
顶部