我正在使用.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函数;画笔类型,阴影样式和颜色存储在数据库中,用于创建返回的画笔:
//===================================
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;
}
正如您在下图所示,舱口样式不明确。
答案 0 :(得分:7)
最直接但可能不是很有用的答案是:不,你不能缩放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
却没有这样的东西。