1

Win2Dを使ってペイントっぽいプログラムを作っています。MyCanvasControlには、ユーザーが描いたテキスト、画像、および線が含まれています。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
    }
4

3 に答える 3

2

これが私が私のためにこれをした方法です。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();
}
于 2015-09-15T10:57:37.370 に答える
0

これを試して:

    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());
    }
于 2015-09-15T09:57:29.593 に答える
0

CanvasControl の内容を直接保存することはできません。

ただし、中間の CanvasRenderTarget に描画する場合は、 SaveAsync を使用して保存できます

オフスクリーンでの描画の詳細については、http://microsoft.github.io/Win2D/html/Offscreen.htm を参照してください。

CanvasControl に直接描画するのではなく、CanvasRenderTarget に描画することには、他にも利点があります。最も明白なのは、毎回ディスプレイ全体を再描画するのではなく、追加のレンダリングを実行できることです。

于 2015-09-15T17:21:01.293 に答える