возможно ли добиться скошенного текста и отбрасывания теней с помощью GDI в c #?

#c# #winforms #gdi #graphicspath

#c# #winforms #gdi #graphicspath

Вопрос:

Я хочу расширить свою «простую» систему фотосъемки, чтобы добавить возможность добавлять пользовательский текст к снимаемым изображениям. Технически я использую этот аспект, используя существующий элемент управления picturebox для отображения изображения и текстового поля, в которое можно ввести текст, и это будет добавлено к отображаемому изображению.

Однако, будучи фотографом, я бы хотел, чтобы текст выглядел немного лучше, и поэтому я хочу подражать тому, что я могу делать в 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;

    }
  

Комментарии:

1. Действительно простой способ — написать текст 3 раза: один раз черным цветом и дважды со смещением на 1 пиксель в верхнем левом и нижнем правом углу в цветах подсветки и тени.. Далеко от совершенства, но довольно дешево.

2. приветствую, я попробую 🙂

3. Отбрасывание тени отличается от скоса. Каковы ваши требования к этому вопросу? Также можете ли вы поделиться образцом изображения о требовании?