所以我在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();
}
上面的代码将现有图像带到“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);
}
}
但是,由于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);
}
答案 0 :(得分:8)
在这里阅读了答案和评论后,我想您可能会欣赏更全面的解决方案。这是一个完成这项工作的小方法:
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);
}
}
}
您可以将此方法与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));
编辑:如果要相对于某个矩形水平和垂直对齐绘制文本,可以用该矩形和两个对齐参数替换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);
}
}
}
现在你可以使用这样的方法:
WriteTextToImage(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg", "Desert.png", text,
new Rect(80, 50, 430, 200),
HorizontalAlignment.Center, VerticalAlignment.Center);
答案 1 :(得分:1)
您可以通过以下方式使用网格或任何其他适合您需求的面板
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image x:name="My image" .. bind it to the bintmap
Grid.row="0"
Grid.colomn="0"/>
<TextBlock x:name="MyText"
Text="....."
Grid.row="0"
Grid.colomn="0"/>
</Grid>
文本和图像在网格中的相同空间中绘制,您可以随意操纵对齐
答案 2 :(得分:-4)
在WPF中,您不能使用Graphics,因为wpf提供了新的tec。要做到这一点。 图形引用旧的Windows API,但WPF使用DirectX。例如,WPF不再适用于像素等等。
http://msdn.microsoft.com/de-de/library/system.windows.media.drawingcontext.aspx