请问TBitMap.ScanLine和TBitMap.Canvas.Pixels有什么区别?(100分)

  • 主题发起人 主题发起人 kde
  • 开始时间 开始时间
K

kde

Unregistered / Unconfirmed
GUEST, unregistred user!
var
P : PByteArray;
begin
P := TBitMap.ScanLine[y];
请问 P[x] 和 TBitMap.Canvas.Pixels[x,y] 有什么区别?
end;
 
前者速度快上20倍。
 
速度区别很大, scanline好得多
 
1、scanline以行的形式读到整行的象素的rgb值,pixels一次读一个点
2、要获得图片的每一点rgb值scanline速度比pixels快得多
 
Delphi帮助中说
ScanLine is used only with DIBs (Device Independent Bitmaps)
所以是不是有时无法使用ScanLine而必须用Pixels
 
我试了一下,
var
x1, x2: TColor;
P : PByteArray;
begin
x1 := TBitMap.Canvas.Pixels[x,y];
P := TBitMap.ScanLine[y];
x2 := P[x];
end;
发现x1和x2的值不一样。

 
对呀,我想在TFORM.CANVAS里用SCANLINE,可是不行,怎么办呢?
 
To kde:
当然不一样,这还和Bitmap.PixelFormat有关,如果是pf8Bit,用ScanLine返回的是颜色
在调色板中的索引。
如果是pf24Bit,那么TBitmap.Canvas.Pixel[x, y]和p := TBitmap.ScanLine[y];
x2 := p[x * 3] + p[x * 3 + 1] shl 8 + p[x * 3 + 2] shl 16是一样的。
 
To JohnsonGuo:
那请问有没有能将ScanLine中信息转化为像素信息的通用代码(包括处理2位,8位,
16位等)。
 
嘿嘿,没用过。
 
To kde:
没有通用代码,因为256色以下的位图都是通过索引色实现,获得索引后还要去查其
调色板方可以得到其颜色信息.
而256色以上的则是直接使用颜色值来描述颜色信息的.
 
scanline必须是24位才可以
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部