如何扩大矩形中绘制的填充图案?

7
我正在使用.NET绘图来绘制一个图表,实际上是一个堆积条形图。 我的问题是,我想减少阴影样式中的线条数量,以便将其放大以使其更清晰。我已经搜索了一些内容,但没有找到任何可以帮助我的东西。 我画一个矩形,然后使用阴影刷填充它,但由于图像大小,阴影填充变得不够清晰。感谢您提供任何建议。 阴影样式和刷子类型存储在数据库中,我使用一个辅助函数来返回它们。因此,在绘制矩形并获取刷子后,我填充矩形。实质上,我想扩大阴影填充是否可行。
 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;
    }

正如您在下面的图片中所看到的那样,图案样式不够清晰。

enter image description here


1
随着图像尺寸的增加,您需要解释这个问题!如何增加图像大小?通过缩放图像吗?(显然,那么所有像素都会被缩放并变得不清晰,相反应该先以正确的尺寸绘制,然后再填充..) - TaW
抱歉,我那个解释不好。图片大小并没有改变。因为这是一张大图片,所以图案的清晰度变得不够明显,我想将其放大比例。 - Tony_89
所以,基本上,您有一个大图表,您的填充样式是像素小的,您想要扩大填充样式中线条和线之间的间隙宽度,以便当您的图像被打印或缩小时,填充/线条仍然可见为填充而不是“灰色的”? - quetzalcoatl
无论如何,你提供的代码并没有帮助。重要的部分是如何创建Brush对象。显然,它坐落在GetBoreholeBrush内部或更深处。 - quetzalcoatl
@quetzalcoatl 我已经包含了构建画笔的代码,是的,我想要扩大宽度,这样线条仍然可见。 - Tony_89
显示剩余2条评论
1个回答

10
最直接但可能不太有帮助的答案是:不能缩放HatchBrush的填充图案。它旨在始终在像素级别上保持清晰,甚至不受缩放Graphics对象的影响。
看着你的问题,我想知道:你确定你真的在使用一个HatchBrush吗?你从函数GetBoreholeBrush中获取画刷。如果你真的存储了50个HatchStyle的索引,那么我猜你真的使用了HatchBrush
由于使用HatchBrush行不通,我猜你可以使用TextureBrush代替。
你可以通过将填充图案放大来转换它们,但这并不是一个简单的转换。直接的方法是通过整数因子绘制更大的图案而不进行抗锯齿处理,这很简单,可能已经足够了。
但是您可能需要微调它们,因为这样所有像素,即线条像素背景像素都会变大,并且所有对角线看起来都会很锯齿状。
因此,您需要平衡填充大小和描边宽度,并从头开始重新创建所需的所有图案。
以下是一个示例,说明简单解决方案存在的问题;第一行是原始填充图案,其他行是简单纹理笔刷结果,缩放比例分别为1x、2x和3x..:

enter image description here

首先需要一个将 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完全没有这样的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接