小于号被吃掉了,重贴一次
canvas.pixels[i,j]:=clblue当然可以但是太慢;canvas的源码中:
property pixels ..read getpixel write setpixel所以就是setpixel.
还是用的scanline.如果单是给image的图像加上网点的话并不复杂:
var
x,y,z : Integer;
BitMap : TBitMap;
P : PByteArray;
begin
y := 0;
x:=0;
z:=0;
while y lessthan image1.height do
begin
z:=z*(-1)+1;
x:=z;
P := image1.picture.BitMap.ScanLine[y];
while x lessthan image1.width do
begin
P[3*x] := 255; //知道为什么要*3吗?
p[3*x+1]:=0;
p[3*x+2]:=0;
x:=x+2;
end;
y:=y+2;
end;
image1.refresh;
end;
但是我要的是在一个已经在canvas上的图像上加网点.所以要现在程序
中创建一个bitmap,把canvas的部分图像copyrect到bitmap,然后在
bitmap上加网点.如果直接画只能用setpixel不能用scanline,慢.
我是在继续修改TImageDBGrid(我从TDBGrid改写的带背景图的DBGrid,
练功场可下载.我改的好辛苦@$#^&$%!觉得好用就朋友们来封信鼓励鼓
励吧.)当某个单元或者行被选中时一原来默认的蓝色背景显示,这样就
遮住了图片背景;于是我想应该可以把网页上的那种效果加进来.
if HighLightCell then
begin
i:=0;
k:=0;
while i lessthan b.bottom do
begin
P := drawBitMap.ScanLine;
k:=k*(-1)+1;
j:=k;
while j lessthan drawbitmap.width do
begin
P[3*j] := 255;
p[3*j+1]:=0;
p[3*j+2]:=0;
j:=j+2;
end;
i:=i+2;
end;
end;
SetBkMode(Handle, TRANSPARENT);
DrawText(Handle, PChar(Text), Length(Text), R,
AlignFlags[Alignment]);
这段代码运行时网点显示不出来.我又加了一个临时的Abitmap中转一下,
给Abitmap加上网点在赋给drawbitmap.网点能显示出来了,但是第一个
显示不出来,第二个以后可以;网点宽度不够也不是要的蓝色.仔细看了
TBitmap的help,发现了Dormant方法.改成:
if HighLightCell then
begin
drawbitmap.Dormant;
i:=0;
k:=0;
while i lessthan b.bottom do
begin
P := drawBitMap.ScanLine;
k:=k*(-1)+1;
j:=k;
while j lessthan drawbitmap.width do
begin
P[4*j] := 255;
p[4*j+1]:=0;
p[4*j+2]:=0;
j:=j+2;
end;
i:=i+2;
end;
drawbitmap.Dormant;
end;
SetBkMode(Handle, TRANSPARENT);
DrawText(Handle, PChar(Text), Length(Text), R,
AlignFlags[Alignment]);
这样就一切正常,实现预想的功能了.为什么改成
P[4*j] := 255;
p[4*j+1]:=0;
p[4*j+2]:=0;
宽度就够了颜色也是蓝色了,而在前面那段给image加网点的程序中
P[3*j] := 255;
p[3*j+1]:=0;
p[3*j+2]:=0;
正常,放到这里却不行了呢?scanline返回的pbytearray的每三个字节
代表一个像素的blue,green,red值,4是怎么回事?
哪位大虾明白请赐教!
<img src="http://h_dh.163.net/demo.jpg">