2015-09-15 4 views
1

Я делаю краскоподобную программу, используя Win2D. Мой CanvasControl содержит текст, изображения и некоторые строки, которые пользователь нарисовал. Я хочу сохранить все содержимое этого CanvasControl в виде файла на диске (в любом стандартном формате изображения). Я хочу сделать это, поскольку я хочу отобразить его (позже) внутри стандартного элемента управления Image.Как сохранить содержимое CanvasControl в качестве файла изображения

Как мне это сделать? Я попытался использовать 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 
    } 
+0

Можете ли вы показать код, где вы пытались «RenderTargetBitmap»? – RenDishen

+0

@RenDishen Я добавил код, который я использую –

+0

Посмотрите мой ответ ниже. Я думаю, вы говорили, что в основном вы хотите сохранить холст, как изображение правильно? – thewisegod

ответ

1

Вот как я это сделал для меня. 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(); 
} 
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()); 
    } 
+0

Спасибо, но он, похоже, не подходит для приложения Windows Store/WinRT. Это код WPF? Он говорит, что «RenderTargetBitmap» не имеет определения для метода «Render». –

+0

Да, это WPF извините. – thewisegod

0

Вы не можете напрямую сохранить содержимое CanvasControl.

Однако, если вы рисуете на промежуточном CanvasRenderTarget, вы можете сохранить его с помощью SaveAsync.

Дополнительную информацию о рисовании заставкой можно найти по адресу http://microsoft.github.io/Win2D/html/Offscreen.htm.

Есть другие преимущества для рисования на CanvasRenderTarget, а не для прямого рисования CanvasControl - наиболее очевидным является то, что он позволяет выполнять добавочный рендеринг, а не перерисовывать весь экран каждый раз.

+1

Спасибо, мне также понадобится снять с экрана. Но я смог получить файл изображения его содержимого (состоящий из строк, не тестировавших изображения), используя код, который упоминал RenDishen. –

+1

Не знаю, почему этот ответ был опущен. –