如何将CanvasControl的内容另存为图像文件

阿尼鲁达·瓦玛(Aniruddha Varma)

我正在使用Win2D制作类似绘画的程序“我的”CanvasControl包含用户绘制的一些文本,图像和某些线条。我想将其全部内容保存CanvasControl为磁盘上的文件(任何标准图像格式)。我要执行此操作,因为我想在以后的标准Image控件中显示它

我该怎么做?我尝试使用RenderTargetBitmap加载CanvasControl(下面代码),但由于某种原因,它会裁剪图像,并且仅制作了一个小的水平顶部图像。


async private void Button_Click(object sender, RoutedEventArgs e)
    {
        #region (c) rendering UIElement to bitmap code

        var bitmap = new RenderTargetBitmap();
        await bitmap.RenderAsync(ccDraw); // ccDraw is CanvasControl

        // get the pixels
        IBuffer pixelBuffer = await bitmap.GetPixelsAsync();
        byte[] pixels = pixelBuffer.ToArray();

        // write the pixels to a InMemoryRandomAccessStream
        var stream = new InMemoryRandomAccessStream();
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, stream);
        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96, 96, pixels);

        await encoder.FlushAsync();
        stream.Seek(0);

        Image iNew = new Image();
        iNew.Stretch = Stretch.None;
        iNew.Source = bitmap;
        gOuter.Children.Add(iNew);
        ccDraw.Visibility = Visibility.Collapsed; // hide CanvasControl so we can see added image 

     #endregion
    }
仁迪申

这是我为我做的事情。imageSize是图片的大小,例如var imageSize = new Size(500,500);

var displayInformation = DisplayInformation.GetForCurrentView();

ccDraw.Measure(imageSize);
ccDraw.UpdateLayout();
ccDraw.Arrange(new Rect(0, 0, imageSize.Width, imageSize.Height));

var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(ccDraw, Convert.ToInt32(imageSize.Width), Convert.ToInt32(imageSize.Height));

var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("Screen.jpg", CreationCollisionOption.ReplaceExisting);
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
      var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, fileStream);

      encoder.SetPixelData(
              BitmapPixelFormat.Bgra8,
              BitmapAlphaMode.Ignore,
              (uint)renderTargetBitmap.PixelWidth,
              (uint)renderTargetBitmap.PixelHeight,
              displayInformation.LogicalDpi,
              displayInformation.LogicalDpi,
              pixelBuffer.ToArray());

      await encoder.FlushAsync();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章