如何缩放矩形中绘制的阴影样式?

Ton*_*_89 5 .net c# system.drawing

我正在使用.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);
Run Code Online (Sandbox Code Playgroud)

和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;
    }
Run Code Online (Sandbox Code Playgroud)

返回填充样式的函数:

   //===================================
    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;
    }
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

TaW*_*TaW 7

最直接但可能不是很有用的答案是:不,你不能缩放a的填充图案HatchBrush.

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

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

现在使用a HatchBrush将无法工作,我想你可以用一个TextureBrush代替..

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

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

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

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

在此输入图像描述

首先一个函数变换HatchBrushTextureBrush

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,填充图案是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));
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

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