#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. Отбрасывание тени отличается от скоса. Каковы ваши требования к этому вопросу? Также можете ли вы поделиться образцом изображения о требовании?