.net(MVC/c#等)中是否有一种"正确"的方法,可以像这个网站那样动态地生成图像:http://www.fodey.com/generators/newspaper/snippet.asp和/或,是否有第三方工具包可以帮助解决这些事情?
我知道低级图形 api,但很好奇如何以不需要大量手动编码的方式处理更高级的东西,如字体布局、分页等。
市面上有很多成像库。IMO没有"最佳实践"的方式("正确","著名"库)。有一种"标准"方法,您需要自己编写所有代码(如您所说),只使用 GDI+(System.Drawing)库,或者您可以查看:
- 图像库
- imageresizing.net - 通过网络API,免费和商业
- aForge - 他们有一个图像处理库
- 铅工具 - 商业
唉,有时最好和最快的解决方案仍然是编写自己的代码 - 取决于你想要达到的结果,你将花费学习第三方库的API的时间,你可能会使用框架内置库自己创建解决方案。
编写一个服务器端库很简单,它引用了一些 WPF 程序集(PresentationFramework、PresentationCore、WindowsBase),然后在背景图像上覆盖和图形或文本,类似于以下内容:
public ImageSource ApplyTextToBitmapSource(ImageSource backgroundImageSource, string text, Point location, FontFamily font, double fontSize, Brush foreground)
{
TextBlock tb = new TextBlock();
tb.Text = text;
tb.FontFamily = font;
tb.FontSize = fontSize;
tb.Foreground = foreground;
tb.Margin = new Thickness(location.X, location.Y, 0.0d, 0.0d);
Image image = new Image();
image.Stretch = Stretch.Uniform;
image.Source = backgroundImageSource;
Grid container = new Grid();
container.Width = backgroundImageSource.Width;
container.Height = backgroundImageSource.Height;
container.Background = new ImageBrush(backgroundImageSource);
container.Children.Add(tb);
return RenderElementToBitmap(container, new Size(backgroundImageSource.Width, backgroundImageSource.Height));
}
private ImageSource RenderElementToBitmap(FrameworkElement element, Size maxSize)
{
element.Measure(maxSize);
element.Arrange(new Rect(element.DesiredSize));
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap((int)Math.Ceiling(element.ActualWidth),
(int)Math.Ceiling(element.ActualHeight), 96, 96, PixelFormats.Pbgra32);
DrawingVisual visual = new DrawingVisual();
using (DrawingContext ctx = visual.RenderOpen())
{
VisualBrush brush = new VisualBrush(element);
Rect bounds = VisualTreeHelper.GetDescendantBounds(element);
Rect targetRect = new Rect(0.0d, 0.0d, bounds.Width, bounds.Height);
ctx.DrawRectangle(brush, null, targetRect);
}
renderTargetBitmap.Render(visual);
return renderTargetBitmap;
}
这些调用将类似于以下内容:
FontFamily font = new FontFamily("Arial Bold");
ImageSource backgroundImageSource = new BitmapImage(new Uri("X:\Dev\WPF_Poster.png", UriKind.Absolute));
ImageSource imageSource = ApplyTextToBitmapSource(backgroundImageSource, "Overlayed Text", new Point(70.0d, 70.0d), font, 31.0d, Brushes.Blue);
希望这有帮助。 如果您需要任何进一步的信息,请告诉我。