C#:相当于 C# 中的 HTML5 Canvas

Posted

技术标签:

【中文标题】C#:相当于 C# 中的 HTML5 Canvas【英文标题】:C#: Equivalent to HTML5 Canvas in C# 【发布时间】:2014-11-06 02:40:54 【问题描述】:

我的目标是通过 URI 加载具有透明度的 .png 图像,裁剪它们并将它们绘制在画布上,然后将画布图像保存为 png 文件。

javascript 中,它看起来像:

var canvas = document.createElement("canvas");
var ctx = canvas.getContext('2d');

var img = new Image();
img.src = "a.png";

ctx.drawImage(img,10,10,20,20,30,30,10,10);

//drawing more images...

something(canvas.toDataURL('image/png'));

如何在 C# Visual Studios 2013 中做到这一点?什么最接近这个 JS 代码?

我不介意使用 WPF 或 Winforms。我不需要能够显示图像。我只需要能够保存它。

【问题讨论】:

【参考方案1】:

一种方法是使用 GDI+(假设 using System.Drawing;):

using (var b = new Bitmap())             // This is your canvas
    Graphics g = Graphics.FromImage(b);   // This is your graphics context

    g.DrawImage(Image.FromFile("a.png"),
                new Rectangle(30, 30, 10, 10), 10, 10, 20, 20,
                GraphicsUnit.Pixel);

    // Do something with b (e.g. b.Save(…))

如果你想要相同的数据 URI,它是(假设 using System.Drawing.Imaging;):

using (var ms = new MemoryStream()) 
    using (var b = new Bitmap()) 
        // …

        b.Save(ms, ImageFormat.Png);
    

    string base64 = Convert.ToBase64String(ms.ToArray());
    something("data:image/png;base64," + base64);

【讨论】:

非常感谢!顺便说一句,您编写的 g.DrawImage 方法无效。这是正确的形式:g.DrawImage(img,new Rectangle(30, 30, 10, 10),new Rectangle(10, 10, 20, 20),GraphicsUnit.Pixel); @RainingChain:啊,对不起。 (请注意,对于第二个矩形,您不必严格创建 Rectangle 对象。只是缺少 GraphicsUnit.Pixel。)【参考方案2】:

您可以将 WPF 用作图像生成器。

您需要的命名空间包括:

using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

还有一个示例 sn-p 代码可以帮助您入门:

DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();

// Let's draw a rectangle!
var gradientBrush = new LinearGradientBrush();
gradientBrush.GradientStops.Add(new GradientStop(Colors.Azure, 0.0));
gradientBrush.GradientStops.Add(new GradientStop(Colors.SteelBlue, 1.0));
drawingContext.DrawRectangle(gradientBrush, null, new Rect(0, 0, _imageWidth, _imageHeight));



drawingContext.Close();

// Now to save it
RenderTargetBitmap bmp = new RenderTargetBitmap(_imageWidth, _imageHeight, 96, 96, PixelFormats.Pbgra32);
bmp.Render(drawingVisual);

PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(bmp));

byte[] imageBinary = null;
using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream())

    png.Save(memoryStream);
    imageBinary = memoryStream.GetBuffer();

【讨论】:

以上是关于C#:相当于 C# 中的 HTML5 Canvas的主要内容,如果未能解决你的问题,请参考以下文章

HTML5中的Canvas

如何在 UWP C# 中使用 BezierSegment 在 Canvas 上渲染 InkStroke

C# WPF 可拖动用户控件在 Canvas 上的 ListBox 中

Unity:如何使用 C# 使 Canvas UI 响应所有屏幕

相当于 C# 中的 C 结构

用Html5/CSS3做Winform,一步一步教你搭建CefSharp开发环境(附JavaScript异步调用C#例子,及全部源代码)上