如何对TBitmap进行像素级的处理(100分)

  • 主题发起人 主题发起人 terrylin
  • 开始时间 开始时间
T

terrylin

Unregistered / Unconfirmed
GUEST, unregistred user!
由TBitmap.scanline[row]和TBitmpap.width可以得到一个像素点,大致如下:
var P : PByteArray;
for y := 0 to BitMap.Height -1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.Width -1 do
P[x]......就是当前的像素了
现在我要对这个像素进行处理,如改变灰度级等
我不知道对不同的像素类型TBitmap.pixelformat来说,这个P[x]是什么结构,应该怎么处理
请赐教,最好能有一段简单的滤波程序做例子,thx
 
procedure RGB2Gray(const Bitmap:TBitmap);
var
X: Integer;
Y: Integer;
PRGB: pRGBTriple;
Gray: Byte;
begin
for Y := 0 to (Bitmap.Height - 1) do
begin
PRGB := Bitmap.ScanLine[Y];
for X := 0 to (Bitmap.Width - 1) do
begin
Gray := Trunc(0.3 * PRGB^.rgbtRed + 0.59 * PRGB^.rgbtGreen + 0.11 * PRGB^.rgbtBlue);
PRGB^.rgbtRed:=Gray;
PRGB^.rgbtGreen:=Gray;
PRGB^.rgbtBlue:=Gray;
Inc(PRGB);
end;
end;
end;
[8D]
 
TBigmap.Canvas.pixels不就是象素了吗
 
为什么在Trunc(0.3 * PRGB^.rgbtRed + 0.59 * PRGB^.rgbtGreen + 0.11 * PRGB^.rgbtBlue);

直接的相加DIV3不就可以了吗?为什么还要这样rgb分别乘个0.3,0.5,0.11呢??
 
to Tassadar
Tbitmap.Canvas.Pixels的速度太慢了,微软已经承认该方法有缺陷
to qingniao
分别乘上0.3,0.59,0.11是因为人眼对不同的颜色的灵敏度不一样,科学研究发现,人眼对绿色最敏感。所以,对R,G,B进行不同的加权运算

 
thx to rgbwoo, you told us how to deal with it when pixelformat is 'pf24bit'.
thx to everyone who has taken part in it.

 
后退
顶部