在 TBitmap 周围绘制点的边界?
Posted
技术标签:
【中文标题】在 TBitmap 周围绘制点的边界?【英文标题】:Drawing a borderline of dots around a TBitmap? 【发布时间】:2017-06-20 17:19:26 【问题描述】:我已经编写了一个例程,它应该为位图添加一个虚线边框:
procedure AddDottedBorderToBitmap(aBM: Vcl.Graphics.TBitmap);
var
c: TCanvas;
begin
c := aBM.Canvas;
c.Pen.Color := clBlack;
c.Pen.Mode := pmXor;
c.Pen.Style := psDot;
c.MoveTo(0, 0);
c.LineTo(0, aBM.Height - 1);
c.LineTo(aBM.Width - 1, aBM.Height - 1);
c.LineTo(aBM.Width - 1, 0);
c.LineTo(0, 0);
end;
但是当放大结果时,生成的边界线而不是点似乎是由小破折号组成的:
这是正确的吗?如果没有,我怎样才能得到真正的点而不是破折号?
【问题讨论】:
【参考方案1】:使用DrawFocusRect
可能看起来很简单,但如果您需要绘制矩形以外的东西,您可能需要提前阅读。
钢笔风格psDot
并不意味着每隔一个像素就被着色而另一个被清除。如果您考虑一下,分辨率越高,就越难看出虚线与灰色实线 f.ex 的差异。还有另一种笔样式psAlternate
交替像素。文档说:
ps替代
笔设置每隔一个像素。 (此样式仅适用于 化妆笔。)此样式仅适用于使用 ExtCreatePen API 函数。 (请参阅 MS Windows SDK 文档。)这适用于 VCL 和 VCL.NET。
要定义笔并使用它,我们执行以下操作
var
c: TCanvas;
oldpenh, newpenh: HPEN; // pen handles
lbrush: TLogBrush; // logical brush
...
c := pbx.Canvas; // pbx is a TPintBox, but can be anything with a canvas
lbrush.lbStyle := BS_SOLID;
lbrush.lbColor := clBlack;
lbrush.lbHatch := 0;
// create the pen
newpenh := ExtCreatePen(PS_COSMETIC or PS_ALTERNATE, 1, lbrush, 0, nil);
try
// select it
oldpenh := SelectObject(c.Handle, newpenh);
// use the pen
c.MoveTo(0, 0);
c.LineTo(0, pbx.Height - 1);
c.LineTo(pbx.Width - 1, pbx.Height - 1);
c.LineTo(pbx.Width - 1, 0);
c.LineTo(0, 0);
c.Ellipse(3, 3, pbx.width-3, pbx.Height-3);
// revert to the old pen
SelectObject(c.Handle, oldpenh);
finally
// delete the pen
DeleteObject(newpenh);
end;
最后是它的样子(放大镜是 x 10)
【讨论】:
@user1580348 我不会将此称为提示,我会将其作为公认的答案:-) @Jerry 感谢您的支持。 @Kobik 感谢您的编辑,我还添加了尝试 - 终于 @TomBrunberg,如果您在这里选择使用 try/finally,您还需要使用 try/finally 块保护oldpenh := SelectObject(c.Handle, newpenh)
/ SelectObject(c.Handle, oldpenh);
以使其一致;)
@kobik 是的,确实,但你听起来(...如果您选择使用...)因为您不会打扰这些尝试 - 最后?
【参考方案2】:
DrawFocusRect 它是一个 Windows API 调用,可以根据需要制作边框。
procedure AddDottedBorderToBitmap(aBM: Vcl.Graphics.TBitmap);
begin
DrawFocusRect(aBM.canvas.Handle,Rect(0,0,aBM.Width,aBM.Height));
end;
【讨论】:
谢谢你,这很好用!但只是出于好奇:为什么我的代码结果中有小破折号而不是真正的点(如您的示例中)?以上是关于在 TBitmap 周围绘制点的边界?的主要内容,如果未能解决你的问题,请参考以下文章
Python - opencv 在 Canny 边缘图像周围绘制边界框