是否有可能在c#中使用GDI实现斜角文本和阴影?

时间:2016-10-18 12:33:12

标签: c# winforms gdi graphicspath

我正在寻求扩展我的简单'摄影活动系统,可添加为我们拍摄的图像添加自定义文字的功能。我在技术上有这个方面使用现有的图片框控件来显示图像和一个文本框,在该文本框中可以输入文本,这将被添加到正在显示的图像。

然而,作为一名摄影师,我希望文本看起来更好一点,因此我希望模仿我在Photoshop中可以做的事情,即斜角/浮雕,为此文本添加内部发光和阴影但是我很难找到任何参考资料。

我可能只是受到了我使用winforms这一事实的限制,这可能是通过WPF实现的,但是当我不再是一名专业的程序员并因此坚持技术时,WPF并不是这样。我知道......我在系统中也太过分了,无法在WPF中重新编写它,所以如果它有一个限制,我只会考虑添加预先确定的叠加而不是自定义文本,我知道我可以实现。

我到目前为止的代码如下所示,如何扩展它以执行斜角/浮雕,发光等任何提示都将非常感激。

    public static Bitmap addTexttoImage(string imagename, string textnya)
    {

        float fontSize = 80;

        string imagepath = imagename;
        Image image = Image.FromStream(new MemoryStream(File.ReadAllBytes(imagepath)));
        //read the image we pass
        Bitmap bmp = (Bitmap)Image.FromFile(imagepath);
        Graphics g = Graphics.FromImage(bmp);

        //this will centre align our text at the bottom of the image
        StringFormat sf = new StringFormat();
        sf.Alignment = StringAlignment.Center;
        sf.LineAlignment = StringAlignment.Far;

        //define a font to use.
        Font f = new Font("Impact", fontSize, FontStyle.Bold, GraphicsUnit.Pixel);

        //pen for outline - set width parameter
        Pen p = new Pen(ColorTranslator.FromHtml("#77090C"), 8);
        p.LineJoin = LineJoin.Round; //prevent "spikes" at the path

        //this makes the gradient repeat for each text line
        Rectangle fr = new Rectangle(0, bmp.Height - f.Height, bmp.Width, f.Height);
        LinearGradientBrush b = new LinearGradientBrush(fr,
                                                        ColorTranslator.FromHtml("#FF6493"),
                                                        ColorTranslator.FromHtml("#D00F14"),
                                                        90);

        //this will be the rectangle used to draw and auto-wrap the text.
        //basically = image size
        Rectangle r = new Rectangle(0, 0, bmp.Width, bmp.Height);

        GraphicsPath gp = new GraphicsPath();

        gp.AddString(textnya, f.FontFamily, (int)FontStyle.Bold, fontSize, r, sf);

        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.DrawPath(p, gp);
        g.FillPath(b, gp);

        //cleanup
        gp.Dispose();
        b.Dispose();
        b.Dispose();
        f.Dispose();
        sf.Dispose();
        g.Dispose();
        return bmp;

    }

0 个答案:

没有答案