0

我正在寻找扩展我的“简单”摄影事件系统,以添加向我们拍摄的图像添加自定义文本的功能。从技术上讲,我使用现有的图片框控件来显示图像和一个可以在其中输入文本的文本框,这将被添加到正在显示的图像中。

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

我可能只是受制于我正在使用 winforms 的事实,这可能通过 WPF 可以实现,但 WPF 并不是关于我何时停止成为某个职业的程序员并因此坚持我所知道的技术......我' m 在系统中也太远了,无法在 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;

    }
4

0 回答 0