大家快来帮我想象办法 (100分)

  • 主题发起人 主题发起人 NetBird
  • 开始时间 开始时间
N

NetBird

Unregistered / Unconfirmed
GUEST, unregistred user!
在一张bmp的图上有几个不规则形状的黑点,分别由若干(不知道多少)像素点组成,我怎样才能
找出每个黑点中离固定像素点(a,b)最近的像素点并将它们都变成红色,最好给出思路和源代码
先谢了!
 
function TRDSAppServer.Get_Employee: _Recordset;
var
ConnStr: WideString;
begin
{ Create an ADO Recordset instance directly }
ConnStr := 'FILE NAME=' + DataLinkDir + '/DBDEMOS.UDL';
Result := CoRecordSet.Create;
Result.CursorLocation := adUseClient;
Result.Open('Employee', ConnStr, adOpenStatic, adLockBatchOptimistic, adCmdTable);
end;
 
zxqht老兄的代码是不是贴错地方了?
 
这个问题我已经通过扫描像素点的方法解决了,只是比较慢,那位大虾还有更快的方法,或更快
一些的算法,欢迎指点一二,只要有用,100分就是您的了
 
用Scanlines来扫描像素点会快一点
 
你的问题其实就是一个扫描换色的问题,建议采用扫描线算法,运用 ScanLine 实现,
速度绝对不用担心。

只是运用 ScanLine 的时候,你需要确定是256色还是真彩色,这点注意就OK 。
 
以上大家说的我都知道,关键向大家询问的是用怎样的算法才能实现
to千堆雪:能给出扫描线算法的例子吗?谢谢
 
给你写点代码,关于换色;最近距离自己去写

//针对24位真彩图
var
bit :TBitmap;
FColor :TColor;//要替换掉的颜色
ForeColor :TColor;//换成的颜色
r,g,b :Byte;
I,J :Integer;
P :PByteArray;
begin
bit :=TBitmap.Create;
bit.Assign(MainImage.Picture.Bitmap);
FColor :=MainImage.Canvas.Pixels[x,y];
r :=GetRValue(FColor);
g :=GetGValue(FColor);
b :=GetBValue(FColor);
for J :=0 to bit.Height-1 do
begin
p :=bit.ScanLine[J];
for I :=0 to bit.Width-1 do
begin
if (p[3*I+2]=r) and (p[3*I+1]=g) and (p[3*I]=b) then
begin
p[3*I+2] :=GetRValue(ForeColor);
p[3*I+1] :=GetGValue(ForeColor);
p[3*I] :=GetBValue(ForeColor);
end;
end;
end;
MainImage.Picture.Bitmap.Assign(bit);
bit.Free;
end;
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部