在 .net/c# 中生成服务器端图形



.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);

希望这有帮助。 如果您需要任何进一步的信息,请告诉我。

相关内容

  • 没有找到相关文章

最新更新