Можно ли добиться скошенного текста и теней с помощью GDI в C#?
Я хочу расширить свою "простую" систему событий фотографии, чтобы добавить возможность добавлять собственный текст к снимкам, которые мы снимали. Технически у меня есть этот аспект, работающий с использованием существующего элемента управления 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;
}