代码之家  ›  专栏  ›  技术社区  ›  Arctic Vowel

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

  •  1
  • Arctic Vowel  · 技术社区  · 9 年前

    我正在使用 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
        }
    
    3 回复  |  直到 8 年前
        1
  •  2
  •   RenDishen    9 年前

    这是我为我做的。 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();
    }
    
        2
  •  0
  •   thewisegod    9 年前

    试试看:

        private void SaveCanvasAsImage()
        {
            Rect yourRect = new Rect(ccDraw.RenderSize);
            RenderTargetBitmap rtBitmap = new RenderTargetBitmap((int)yourRect.Right,
            (int)yourRect.Bottom, 100d, 100d, System.Windows.Media.PixelFormats.Default);
            rtBitmap.Render(ccDraw);
    
            BitmapEncoder pngEncoder = new PngBitmapEncoder();
            pngEncoder.Frames.Add(BitmapFrame.Create(rtBitmap));
    
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
    
            pngEncoder.Save(ms);
            ms.Close();
            System.IO.File.WriteAllBytes("yourPng.png", ms.ToArray());
        }
    
        3
  •  0
  •   Damyan    9 年前

    您不能直接保存CanvasControl的内容。

    但是,如果绘制到中间CanvasRenderTarget,则可以使用 SaveAsync .

    有关屏幕外绘图的更多信息,请访问 http://microsoft.github.io/Win2D/html/Offscreen.htm .

    绘制到CanvasRenderTarget而不是直接绘制到Canvas Control还有其他好处——最明显的是,它允许您进行加法渲染,而不是每次都必须重新绘制整个显示。