Jas*_*rod 4 .net c# wpf visual-studio
所以我在WinForms .NET 3.5中这样做...我现在正在使用WPF .NET 4.0 ......我无法弄清楚如何做到这一点.
这就是我在Windows .NET 3.5中所做的
using (Bitmap eventImg = new Bitmap("input.png"))
{
Graphics eventGfx = Graphics.FromImage(eventImg);
buildText(eventGfx, this.event1.Text);
eventImg.Save("output.png", ImageFormat.Png);
eventGfx.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将现有图像带到"input.png",从中创建一个新图像,从中写入文本,然后将新图像保存在"output.png".使用以下函数编写文本:
private void buildText(Graphics graphic, string text)
{
if (text.Length == 0) { return; }
FontStyle weight = FontStyle.Regular;
switch (this.font_style)
{
case "regular": weight = FontStyle.Regular; break;
case "bold": weight = FontStyle.Bold; break;
case "italic": weight = FontStyle.Italic; break;
case "underline": weight = FontStyle.Underline; break;
case "strikeout": weight = FontStyle.Strikeout; break;
}
using (Font font = new Font(this.font_family, this.font_size, weight, GraphicsUnit.Pixel))
{
Rectangle rect = new Rectangle(this.left, this.top, this.width, this.height);
Brush brush = new SolidBrush(Color.FromArgb(this.font_color));
StringFormat format = new StringFormat();
switch (this.align_x)
{
case "left": format.Alignment = StringAlignment.Near; break;
case "right": format.Alignment = StringAlignment.Far; break;
default: format.Alignment = StringAlignment.Center; break;
}
switch (this.align_y)
{
case "top": format.LineAlignment = StringAlignment.Near; break;
case "bottom": format.LineAlignment = StringAlignment.Far; break;
default: format.LineAlignment = StringAlignment.Center; break;
}
graphic.TextRenderingHint = TextRenderingHint.AntiAlias;
graphic.DrawString(text, font, brush, rect, format);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于WPF .NET 4.0中不存在System.Drawing,因此我不能再使用这些函数了.我如何在WPF .NET 4.0中做我想做的事情?为了完成基于旧图像制作图像的第一步,我已经达到了下面的代码:
using (var fileStream = new FileStream(@"z:\ouput.png", FileMode.Create))
{
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(new Uri(@"z:\input.png")));
encoder.Save(fileStream);
}
Run Code Online (Sandbox Code Playgroud)
在这里阅读了答案和评论后,我想你可能会欣赏更全面的解决方案.这是一个完成这项工作的小方法:
public static void WriteTextToImage(string inputFile, string outputFile, FormattedText text, Point position)
{
BitmapImage bitmap = new BitmapImage(new Uri(inputFile)); // inputFile must be absolute path
DrawingVisual visual = new DrawingVisual();
using (DrawingContext dc = visual.RenderOpen())
{
dc.DrawImage(bitmap, new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));
dc.DrawText(text, position);
}
RenderTargetBitmap target = new RenderTargetBitmap(bitmap.PixelWidth, bitmap.PixelHeight,
bitmap.DpiX, bitmap.DpiY, PixelFormats.Default);
target.Render(visual);
BitmapEncoder encoder = null;
switch (Path.GetExtension(outputFile))
{
case ".png":
encoder = new PngBitmapEncoder();
break;
// more encoders here
}
if (encoder != null)
{
encoder.Frames.Add(BitmapFrame.Create(target));
using (FileStream outputStream = new FileStream(outputFile, FileMode.Create))
{
encoder.Save(outputStream);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将此方法与FormattedText对象和位置一起使用:
FormattedText text = new FormattedText(
"Hello",
CultureInfo.InvariantCulture,
FlowDirection.LeftToRight,
new Typeface("Segeo UI"),
20,
Brushes.Red);
WriteTextToImage(
@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg",
"Desert.png",
text,
new Point(10, 10));
Run Code Online (Sandbox Code Playgroud)
编辑:如果要相对于某个矩形水平和垂直对齐绘制文本,可以用该position矩形和两个对齐参数替换参数,并计算文本位置,如下所示:
public static void WriteTextToImage(string inputFile, string outputFile, FormattedText text,
Rect textRect, HorizontalAlignment hAlign, VerticalAlignment vAlign)
{
BitmapImage bitmap = new BitmapImage(new Uri(inputFile));
DrawingVisual visual = new DrawingVisual();
Point position = textRect.Location;
switch (hAlign)
{
case HorizontalAlignment.Center:
position.X += (textRect.Width - text.Width) / 2;
break;
case HorizontalAlignment.Right:
position.X += textRect.Width - text.Width;
break;
}
switch (vAlign)
{
case VerticalAlignment.Center:
position.Y += (textRect.Height - text.Height) / 2;
break;
case VerticalAlignment.Bottom:
position.Y += textRect.Height - text.Height;
break;
}
using (DrawingContext dc = visual.RenderOpen())
{
dc.DrawImage(bitmap, new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));
dc.DrawText(text, position);
}
RenderTargetBitmap target = new RenderTargetBitmap(bitmap.PixelWidth, bitmap.PixelHeight,
bitmap.DpiX, bitmap.DpiY, PixelFormats.Default);
target.Render(visual);
BitmapEncoder encoder = null;
switch (Path.GetExtension(outputFile))
{
case ".png":
encoder = new PngBitmapEncoder();
break;
case ".jpg":
encoder = new JpegBitmapEncoder();
break;
}
if (encoder != null)
{
encoder.Frames.Add(BitmapFrame.Create(target));
using (FileStream outputStream = new FileStream(outputFile, FileMode.Create))
{
encoder.Save(outputStream);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以使用这样的方法:
WriteTextToImage(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg", "Desert.png", text,
new Rect(80, 50, 430, 200),
HorizontalAlignment.Center, VerticalAlignment.Center);
Run Code Online (Sandbox Code Playgroud)