如何缩放在矩形中绘制的填充样式?

我正在使用.Net绘图来绘制图表。 它本质上是一个堆积条形图。 我遇到的问题是我想减少阴影样式中的线条数量,这样就可以将其缩小以使其更清晰。 我环顾四周,但没有遇到任何可以帮助我的事情。

我绘制一个矩形,然后用一个舱口盖填充它,但由于图像尺寸,影院填充变得不那么清晰。 谢谢你的任何建议。

hatchStyles和brush类型存储在db中,我使用辅助函数来返回它们。 所以我绘制矩形,在获得画笔后,我填充矩形。 基本上我想扩大舱口填充,如果可以的话。

g.DrawRectangle(gridpen, startX, startY, BOREHOLE_RECT_WIDTH, layerRectHeight); brush = GetBoreholeBrush(l.SoilTypeMatrixLevel1Id.PrimaryBrushType, l.SoilTypeMatrixLevel1Id.PrimaryFillStyle, l.SoilTypeMatrixLevel1Id.PrimaryColour); g.FillRectangle(brush, startX, startY, BOREHOLE_RECT_WIDTH, layerRectHeight); 

和getBrush函数; 画笔类型,阴影样式和颜色存储在db中并用于创建返回的画笔:

  //=================================== private Brush GetBoreholeBrush(string BrushType, string HatchStyle, string Colour) //=================================== { //Decide on what brush type has been chosen. Brush brush; if (BrushType.ToLower() == BrushTypes.HatchBrush.ToString().ToLower()) { brush = new HatchBrush(GetHatchStyle(HatchStyle), Color.Black, ColorTranslator.FromHtml(Colour)); } else if (BrushType.ToLower() == BrushTypes.SolidBrush.ToString().ToLower()) { brush = new HatchBrush(GetHatchStyle(HatchStyle), Color.Black, ColorTranslator.FromHtml(Colour)); } else if (BrushType.ToLower() == BrushTypes.TextureBrush.ToString().ToLower()) { brush = new HatchBrush(GetHatchStyle(HatchStyle), Color.Black, ColorTranslator.FromHtml(Colour)); } else { brush = new HatchBrush(GetHatchStyle(HatchStyle), Color.Black, ColorTranslator.FromHtml(Colour)); } return brush; } 

返回填充样式的函数:

  //=================================== private HatchStyle GetHatchStyle(string FillStyle) //=================================== { //Loop through each hatch tyle and return the correct one. foreach (HatchStyle style in Enum.GetValues(typeof(HatchStyle))) { if (style.ToString().ToLower() == FillStyle.ToLower()) { return style; } } return HatchStyle.Vertical; } 

正如您在下图中看到的那样,舱口样式并不清晰。

在此处输入图像描述

最直接但可能不是非常有用的答案是:不,你无法缩放HatchBrush的填充图案。

它意味着在像素级别始终看起来很清晰,甚至不会受到缩放Graphics对象的影响。

看看你的问题,我想知道:你确定你真的在使用HatchBrush吗? 你从GetBoreholeBrush函数中获取画笔。 如果你真的已经存储了50个HatchStyle的索引,那么我猜你真的使用了HatchBrush

现在因为使用HatchBrush不起作用我想你可以使用TextureBrush代替..

您可以通过缩放它们将填充图案转换为更大的版本; 这不是一个简单的转换。 通过整数因子绘制较大且没有抗锯齿的直接方法很简单,并且可能足够好。

但是你可能需要对它们进行微调,因为这样所有像素,即线像素背景像素都会变大,所有对角线看起来都会呈锯齿状。

因此,您需要平衡影线尺寸和笔触宽度,并从较大尺寸重新创建所需的所有图案。

这是一个例子,说明了简单解决方案的问题; 第一行是原始填充图案,其他是简单的纹理画笔结果,按1x,2x和3x缩放..:

在此处输入图像描述

首先是将HatchBrush转换为TextureBrush

 TextureBrush TBrush(HatchBrush HBrush) { using (Bitmap bmp = new Bitmap(8,8)) using (Graphics G = Graphics.FromImage(bmp)) { G.FillRectangle(HBrush, 0, 0, 8, 8); TextureBrush tb = new TextureBrush(bmp); return tb; } } 

请注意,填充图案为8x8像素。

现在用于上图的Paint代码:

 private void panel1_Paint(object sender, PaintEventArgs e) { var hs = (HatchStyle[])Enum.GetValues(typeof(HatchStyle)); for (int i = 0; i < hs.Length; i++) using (HatchBrush hbr = new HatchBrush(hs[i], Color.GreenYellow)) using (HatchBrush hbr2 = new HatchBrush(hs[i], Color.LightCyan)) { e.Graphics.FillRectangle(hbr, new Rectangle(i * 20, 10,16,60)); using (TextureBrush tbr = TBrush(hbr2)) { e.Graphics.FillRectangle(tbr, new Rectangle(i * 20, 80, 16, 60)); tbr.ScaleTransform(2, 2); e.Graphics.FillRectangle(tbr, new Rectangle(i * 20, 150, 16, 60)); tbr.ResetTransform(); tbr.ScaleTransform(3,3); e.Graphics.FillRectangle(tbr, new Rectangle(i * 20, 220, 16, 60)); } } } 

请注意,虽然TextureBrush有很好的方法来修改纹理,但HatchBrush完全没有这样的东西。