如何使用canvas的scanline方法 (100分)

  • 主题发起人 主题发起人 ricon2001
  • 开始时间 开始时间
R

ricon2001

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用Canvas的Scanline方法操作位图的位,如何用Scanline获得位的颜色(32位,或24位)。
scanline能否用于图形透明运算。
能否给出详细的例子。
 
浮雕效果
procedure TMainForm.EmbossClick(Sender: TObject);
var
i, j: integer;
p1, p2: pbyteArray;
Value: integer;
BMP: Tbitmap;
begin
bmp := TBITMAP.Create;
BMP.Assign(Childform.Image1.Picture.Bitmap);
bmp.PixelFormat := pf24bit;
for i := 0 to bmp.Height - 2 do
begin
p1 := Bmp.ScanLine;
p2 := Bmp.ScanLine[i + 1];
for j := 0 to Bmp.Width - 1 do
begin
Value := (p1[3 * j + 2] - p2[3 * j + 2]) + 128;
p1[3 * j + 2] := Min(255, Max(0, Value));
Value := p1[3 * j + 1] - p2[3 * j + 1] + 128;
p1[3 * j + 1] := Min(255, Max(0, Value));
Value := p1[3 * j] - p2[3 * j] + 128;
p1[3 * j] := Min(255, Max(0, Value));
end;
end;
childform.Image1.Picture.Bitmap.Assign(bmp);
bmp.Free;
end;
 
代码大致如下:
var
i, j: integer;
p1 : pbyteArray;
BMP: Tbitmap;
begin
bmp := TBITMAP.Create;
BMP.canvas.loadfromfile(xxx.bmp); //xxx.bmp 24bit
for i := 0 to bmp.Height - 1 do
begin
p1 := Bmp.ScanLine;
for j := 0 to Bmp.Width - 1 do
begin
p1[3 * j + 2];=colorR; //R
p1[3 * j + 1]:=ColorG;
p1[3 * j] :=ColorB;
end;
end;
form1.canvas.draw(0,0,bmp);
//类似上述方法,获取另一Scanline位值
//用ColorRx-(ColorRx-ColorRy)*k运算各分色值,再用RGB函数合并;
//如是

end;
 
接受答案了.
 
后退
顶部