- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在位图上绘制一个椭圆,其内部有一条线,类似于此图片:
我的应用程序可以加载位图图片,可以是任何尺寸。我所需要的只是画一个椭圆,里面有一条线。
我知道如何绘制椭圆,但我的问题是它内部的线条:
Bmp.Canvas.Ellipse(0, 0, Bmp.Width, Bmp.Height);
Bmp.Canvas.MoveTo(?, ?);// Here is my problem
Bmp.Canvas.LineTo(?, ?);// here too
我试试这个:
Bmp.Canvas.MoveTo(0, 0);
Bmp.Canvas.LineTo(Bmp.Width, Bmp.Height);
但这会从图片的左上角到右下角画一条线。
最佳答案
像您一样使用 Canvas.MoveTo()
和 Canvas.LineTo()
就可以正常工作。您只需要限制椭圆内部线条的绘制,这样您在椭圆外部绘制的任何内容都不会被看到。
您可以应用椭圆 clipping region在绘制线条之前使用 Win32 API CreateEllipticRgn()
到 Canvas
和 SelectClipRgn()
函数,例如:
// draw the actual ellipse first...
Bmp.Canvas.Ellipse(0, 0, Bmp.Width, Bmp.Height);
// then create a region to match the ellipse...
Rgn := CreateEllipticRgn(0, 0, Bmp.Width, Bmp.Height);
try
SelectClipRgn(Bmp.Canvas.Handle, Rgn);
try
// then draw the line inside the region...
Bmp.Canvas.MoveTo(0, 0);
Bmp.Canvas.LineTo(Bmp.Width, Bmp.Height);
finally
SelectClipRgn(Bmp.Canvas.Handle, 0);
end;
finally
DeleteObject(Rgn);
end;
或者,您可以应用椭圆 clipping path相反,使用 Win32 API BeginPath()
, EndPath()
,和 SelectClipPath()
函数,例如:
// draw the actual ellipse first...
Bmp.Canvas.Ellipse(0, 0, Bmp.Width, Bmp.Height);
// then create a path to match the ellipse...
BeginPath(Bmp.Canvas.Handle);
try
Bmp.Canvas.Ellipse(0, 0, Bmp.Width, Bmp.Height);
finally
EndPath(Bmp.Canvas.Handle);
end;
SelectClipPath(Bmp.Canvas.Handle, RGN_COPY);
// then draw the line inside the path...
Bmp.Canvas.MoveTo(0, 0);
Bmp.Canvas.LineTo(Bmp.Width, Bmp.Height);
参见Clipping Overview在 MSDN 上了解更多详细信息。
例如:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Bmp: TBitmap;
Rgn: HRGN;
begin
Bmp := TBitmap.Create;
try
Bmp.SetSize(Image1.Width, Image1.Height);
Bmp.Canvas.Brush.Color := clWhite;
Bmp.Canvas.FillRect(Rect(0, 0, Bmp.Width, Bmp.Height));
Bmp.Canvas.Pen.Color := clRed;
Bmp.Canvas.Pen.Width := 5;
// draw the actual ellipse first...
Bmp.Canvas.Ellipse(0, 0, Bmp.Width, Bmp.Height);
// then create a region to match the ellipse...
Rgn := CreateEllipticRgn(0, 0, Bmp.Width, Bmp.Height);
try
SelectClipRgn(Bmp.Canvas.Handle, Rgn);
try
// then draw the line inside the region...
Bmp.Canvas.MoveTo(0, 0);
Bmp.Canvas.LineTo(Bmp.Width, Bmp.Height);
finally
SelectClipRgn(Bmp.Canvas.Handle, 0);
end;
finally
DeleteObject(Rgn);
end;
Image1.Picture.Assign(Bmp);
finally
Bmp.Free;
end;
Bmp := TBitmap.Create;
try
Bmp.SetSize(Image2.Width, Image2.Height);
Bmp.Canvas.Brush.Color := clWhite;
Bmp.Canvas.FillRect(Rect(0, 0, Bmp.Width, Bmp.Height));
Bmp.Canvas.Pen.Color := clRed;
Bmp.Canvas.Pen.Width := 5;
// draw the actual ellipse first...
Bmp.Canvas.Ellipse(0, 0, Bmp.Width, Bmp.Height);
// then create a path to match the ellipse...
BeginPath(Bmp.Canvas.Handle);
try
Bmp.Canvas.Ellipse(0, 0, Bmp.Width, Bmp.Height);
finally
EndPath(Bmp.Canvas.Handle);
end;
SelectClipPath(Bmp.Canvas.Handle, RGN_COPY);
// then draw the line inside the path...
Bmp.Canvas.MoveTo(0, 0);
Bmp.Canvas.LineTo(Bmp.Width, Bmp.Height);
Image2.Picture.Assign(Bmp);
finally
Bmp.Free;
end;
end;
end.
关于delphi - 在椭圆内画一条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49866408/
我想以 headless 模式(屏幕上根本没有 GUI)将 JPanel 绘制到 BufferedImage 中。 final JPanel panel = createPanel(); panel.
我是 Canvas 的新手,正在尝试创建看起来逼真的 float 粒子动画。 目前,我正在创建 400 个随机散布在 400x400 Canvas 上的粒子。 然后,在每个 requestAnimat
有没有办法在悬停时停止悬 float 画? :hover 这是一个显示动画的链接: https://codepen.io/youbiteme/pen/RprPrN 最佳答案 只需为您的 svg 悬停添
我想在谷歌地图上绘制覆盖图,其中除了特定点周围 1.5 公里半径以外的所有内容都被遮蔽了。为此,我尝试使用带有大量边框的圆圈,所以我会在边框中放置透明中心和覆盖颜色来实现这一点,但它无法渲染。
我正在尝试通过扩展类 UIView 来创建自定义 View ,该类可以在自定义 View 的中心显示一个圆圈。为了添加自定义绘图,我重写了 draw(_ rect: CGRect) 方法,如下所示。
我是一名优秀的程序员,十分优秀!