Delphi 获取周围像素的颜色并更改它们
我想做一个应用程序,首先检查一个特定像素颜色的图像。 当找到具有正确pixelcolor的像素时,它将“高亮显示”该像素 但这里有一个棘手的部分,在那之后我想检查“高亮”像素周围8个像素的颜色。如果其中一个周围像素是黑色的,则该像素的颜色应改变 我已经设法“突出”具有特定像素颜色的像素(见下面的代码),但我一直在寻找如何检查其周围的像素 我希望我的问题是清楚的Delphi 获取周围像素的颜色并更改它们,delphi,image-processing,pixels,Delphi,Image Processing,Pixels,我想做一个应用程序,首先检查一个特定像素颜色的图像。 当找到具有正确pixelcolor的像素时,它将“高亮显示”该像素 但这里有一个棘手的部分,在那之后我想检查“高亮”像素周围8个像素的颜色。如果其中一个周围像素是黑色的,则该像素的颜色应改变 我已经设法“突出”具有特定像素颜色的像素(见下面的代码),但我一直在寻找如何检查其周围的像素 我希望我的问题是清楚的 procedure Tform_Main.analyzepixels (bitmapanalyse : TBitmap); var C:
procedure Tform_Main.analyzepixels (bitmapanalyse : TBitmap);
var
C: TColor;
X, Y:Integer;
Pixels : PRGBTripleArray
begin
bitmapanalyse := TBitmap.Create;
try
bitmapanalyse.Assign(FBitmap);
Form_memo.Memo1.Lines.BeginUpdate;
try
for Y := 0 to bitmapanalyse.Height - 1 do
begin
Pixels := bitmapanalyse.ScanLine[Y];
ProgressBar2.StepIt;
ProgressBar2.Update;
Application.ProcessMessages;
for X := 0 to bitmapanalyse.Width - 1 do
begin
if (Pixels[X].rgbtRed >= Pixelcolor) and
(Pixels[X].rgbtGreen >= Pixelcolor) and
(Pixels[X].rgbtBlue >= Pixelcolor)
then
begin
C := RGB(
Pixels[X].rgbtRed,
Pixels[X].rgbtGreen,
Pixels[X].rgbtBlue
);
Form_memo.Memo1.Lines.Add(
'===============' + sLineBreak +
'Pixel[' + IntToStr(X) + '; ' + IntToStr(Y) + ']' + sLineBreak +
'Color: ' + ColortoString(C))
;
Pixels[X].rgbtRed := 255;
Pixels[X].rgbtGreen := 255;
Pixels[X].rgbtBlue := 0;
end;
end;
end;
finally
Form_memo.Memo1.Lines.EndUpdate;
end;
我可能遗漏了一些东西,但是因为你有(x,y),你可以通过简单地使用
[x - 1, y - 1][x , y - 1][x + 1, y - 1]
[x - 1, y ][x , y ][x + 1, y ]
[x - 1, y + 1][x , y + 1][x + 1, y + 1]
您已经具备了获取特定像素的逻辑。我会重构你的东西
function GetRGBAt(ABitmap: TBitmap; const X, Y: Integer) : PRGBTriple;
begin
Result := nil; // don't remember if this is necessary
if (Y >= 0) and (X >= 0) then
begin
Result := aBitmap.ScanLine[Y];
Inc(Result, X);
end;
end;
function IsRGBBlack(ABitmap: TBitmap; const X, Y: Integer) : boolean;
var
P: PRGBTriple;
begin
P := GetRGBAt(ABitmap, X, Y);
Result := (P <> nil) and
(P^.rgbtBlue + P^.rgbtGreen + P^.rgbtBlue = 0);
end;
这是一种非常简单的方法,但是您没有说明在相邻合格像素的情况下要执行的操作,例如,因此您可能需要为这些像素添加一些额外的逻辑
返回结果
不是Delphi代码。:-)另外,PRGBTriple
没有rgbBlack
成员。IsRGBBlack
测试可简化为结果:=(P无)和(P^.rgbtRed+P^.rgbtGreen+P^.rgbtBlue=0)代码>你是对的,我会改变的。这是所有的邮件代码!(我添加了你关于使用sum的建议,但我不确定这是否更清楚)-顺便说一句,“返回结果”显示了当你在某一天使用太多语言编程时会发生什么…前两个是修复建议。这笔钱只是另一种选择。:-)哦,当然。我知道这仍然是正确的。我想我对这两种选择都没有坚定的立场,而且你的建议在肉眼看来更有效。
if IsRGBBlack(bitmapanalyse, x - 1, y-1)
or IsRGBBlack(bitmapanalyse, x, y-1)
or IsRGBBlack(bitmapanalyse, x + 1, y-1)
or IsRGBBlack(bitmapanalyse, x - 1, y)
// x, y not needed
or IsRGBBlack(bitmapanalyse, x + 1, y)
or IsRGBBlack(bitmapanalyse, x - 1, y + 1)
or IsRGBBlack(bitmapanalyse, x, y + 1)
or IsRGBBlack(bitmapanalyse, x + 1, y + 1) then
// your logic here for (x, y)