C# 在WPF中绘制线条,就像在WinForms中一样
如何在WPF中绘制线条,使结果看起来像C# 在WPF中绘制线条,就像在WinForms中一样,c#,wpf,listview,filter,C#,Wpf,Listview,Filter,如何在WPF中绘制线条,使结果看起来像Winformsresult 我有这张图片:PictureBox.BackgroundImage 我倒过来说: 我得到的:PictureBox屏幕截图 代码: 画笔:=TextureBrush来自反向位图 尺寸:=300 条宽:=25 棒间距:=5 结果获取PictureBox.Image 公共位图CreateSpectrumLine(画笔、int-size、int-barWidth、int-barSpacing) { 使用(变量笔=新笔(画笔,(浮
Winforms
result
- 我有这张图片:
PictureBox.BackgroundImage
- 我倒过来说:
- 我得到的:
屏幕截图PictureBox
- 代码:
画笔:=
来自反向位图TextureBrush
尺寸:=300
条宽:=25
棒间距:=5
结果获取PictureBox.Image
公共位图CreateSpectrumLine(画笔、int-size、int-barWidth、int-barSpacing) { 使用(变量笔=新笔(画笔,(浮动)条形宽度)) { var b=新位图(大小、大小); 使用(var g=Graphics.FromImage(b)) { g、 透明(彩色、透明); g、 SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.None; int h=尺寸; PointData[]点=计算点(大小); 对于(int i=0;i
如何使用
WPF
组件/命令(生成BitmapSource
)获得相同的结果?如果不知道CalculatePoints的功能,很难回答。如果x值正确,而y值不正确,则上述算法可能存在问题。对于p1
和p2
,为什么要改变y?这不应该总是从0
变为size-1
?不需要h
变量,您可以使用size
来提高代码的可读性。由于您的所有值都是int
,因此可以将x
更改为int
,而不是强制转换float
,并使用Point
而不是PointF
。如果不知道CalculatePoints的作用,很难回答。如果x值正确,而y值不正确,则上述算法可能存在问题。对于p1
和p2
,为什么要改变y?这不应该总是从0
变为size-1
?不需要h
变量,您可以使用size
来提高代码的可读性。由于所有值都是int
,因此可以将x
更改为int
,而不是强制转换float
,并使用Point
而不是PointF
。
public Bitmap CreateSpectrumLine(Brush brush, int size, int barWidth, int barSpacing)
{
using (var pen = new Pen(brush, (float)barWidth))
{
var b = new Bitmap(size, size);
using (var g = Graphics.FromImage(b))
{
g.Clear(Color.Transparent);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
int h = size;
PointData[] points = CalculatePoints(size);
for (int i = 0; i < points.Length; i++)
{
PointData p = points[i];
int barIndex = p.PointIndex;
float x = (float)((barWidth + barSpacing) * barIndex + barWidth / 2);
var p1 = new PointF(x, h + 1);
var p2 = new PointF(x, h - (float)p.Value + 1);
g.DrawLine(pen, p1, p2);
}
}
return b;
}
}
struct PointData
{
public int PointIndex;
public double Value;
}