Есть ли способ сохранить штрихи от InkCanvas
в png/jpg изображение в Windows 10 (приложение UWP)?Сохранить чернила InkCanvas как изображение png/jpg в Windows 10
ответ
Я знаю, что это старый пост, но вот как я нашел, чтобы сделать это для других, кому это может понадобиться.
Если вы не хотите сохранять InkCanvas в файл или как GIF, чтобы манипулировать им в памяти. У меня есть три варианта ниже. Обратите внимание, что для некоторых из них вам нужно будет добавить ссылку на Win2D.uwp, которую можно найти на NuGet, выполнив поиск именно этого имени. Он предоставляется Microsoft.
Преобразование InkCanvas в массив байтов:
private byte[] ConvertInkCanvasToByteArray() { var canvasStrokes = cvsSignature.InkPresenter.StrokeContainer.GetStrokes(); if (canvasStrokes.Count > 0) { var width = (int)cvsSignature.ActualWidth; var height = (int)cvsSignature.ActualHeight; var device = CanvasDevice.GetSharedDevice(); var renderTarget = new CanvasRenderTarget(device, width, height, 96); using (var ds = renderTarget.CreateDrawingSession()) { ds.Clear(Windows.UI.Colors.White); ds.DrawInk(cvsSignature.InkPresenter.StrokeContainer.GetStrokes()); } return renderTarget.GetPixelBytes(); } else { return null; } }
Если все, что вам нужно, это байтовый массив пикселей, вы сделали. Однако, если вы хотите генерировать изображение, вы можете использовать WriteableBitmap для этого. Ниже приведены методы синхронизации и асинхронизации, которые можно вызвать для этого.
private WriteableBitmap GetSignatureBitmapFull() { var bytes = ConvertInkCanvasToByteArray(); if (bytes != null) { var width = (int)cvsSignature.ActualWidth; var height = (int)cvsSignature.ActualHeight; var bmp = new WriteableBitmap(width, height); using (var stream = bmp.PixelBuffer.AsStream()) { stream.Write(bytes, 0, bytes.Length); return bmp; } } else return null; } private async Task<WriteableBitmap> GetSignatureBitmapFullAsync() { var bytes = ConvertInkCanvasToByteArray(); if (bytes != null) { var width = (int)cvsSignature.ActualWidth; var height = (int)cvsSignature.ActualHeight; var bmp = new WriteableBitmap(width, height); using (var stream = bmp.PixelBuffer.AsStream()) { await stream.WriteAsync(bytes, 0, bytes.Length); return bmp; } } else return null; }
Наконец, здесь метод асинхронной, который я использую, чтобы быть в состоянии сделать посев на растровом изображении, если вы хотите, чтобы сделать это. Ключевым моментом этого метода является уведомление о том, как при таком подходе вам не нужно сначала получать байты пикселей в виде массива. Вы просто получаете штрихи из холста, а затем он сохраняется непосредственно в поток памяти
private async Task<WriteableBitmap> GetSignatureBitmapCropped() { try { var canvasStrokes = cvsSignature.InkPresenter.StrokeContainer.GetStrokes(); if (canvasStrokes.Count > 0) { var bounds = cvsSignature.InkPresenter.StrokeContainer.BoundingRect; var xOffset = (uint)Math.Round(bounds.X); var yOffset = (uint)Math.Round(bounds.Y); var pixelWidth = (int)Math.Round(bounds.Width); var pixelHeight = (int)Math.Round(bounds.Height); using (var memStream = new InMemoryRandomAccessStream()) { await cvsSignature.InkPresenter.StrokeContainer.SaveAsync(memStream); var decoder = await BitmapDecoder.CreateAsync(memStream); var transform = new BitmapTransform(); var newBounds = new BitmapBounds(); newBounds.X = 0; newBounds.Y = 0; newBounds.Width = (uint)pixelWidth; newBounds.Height = (uint)pixelHeight; transform.Bounds = newBounds; var pdp = await decoder.GetPixelDataAsync( BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, transform, ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.DoNotColorManage); var pixels = pdp.DetachPixelData(); var cropBmp = new WriteableBitmap(pixelWidth, pixelHeight); using (var stream = cropBmp.PixelBuffer.AsStream()) { await stream.WriteAsync(pixels, 0, pixels.Length); } return cropBmp; } } else { return null; } } catch (Exception ex) { return null; } }
Надежда это помогает обеспечить некоторые альтернативы при использовании InkCanvas в Windows 10 универсальных.
Конечно, просто сохраните контейнер с потоком в поток и напишите его в файл.
if (inkCanvas.InkPresenter.StrokeContainer.GetStrokes().Count > 0)
{
var savePicker = new Windows.Storage.Pickers.FileSavePicker();
savePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
savePicker.FileTypeChoices.Add("PNG", new System.Collections.Generic.List<string> { ".png" });
Windows.Storage.StorageFile file = await savePicker.PickSaveFileAsync();
if (null != file)
{
try
{
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
await inkCanvas.InkPresenter.StrokeContainer.SaveAsync(stream);
}
}
catch (Exception ex)
{
}
}
}
Больше образцов InkCanvas можно найти here.
Возможно ли включать в себя всю область InkCanvas в сохраненное изображение. Сохранение чернильных штрихов создает прямоугольник, который является лишь небольшим вырезом из всего холста. – pasul
Это создает файл, но, похоже, это формат gif, а не png или jpg. – tagy22
Как отмечает tagy22, он создает его в формате GIF, а не в PNG, хотя он сохраняет его с расширением .png, если вы выберете его в сборщике файлов. –
То, что вы просите, - это вид снимка экрана. В этом случае RenderTargetBitmap может помочь. Он может отображать произвольный UIElement в растровое изображение. Вы можете ссылаться на мой ответ в этом post.
Я уже пытался использовать RenderTargetBitmap для сохранения содержимого InkCanvas как изображения, проблемы в том, что он не работает для InkCanvas в UWP (Windows 10). – pasul
- 1. Чернила InkCanvas, выходящие из области видимости
- 2. Как сохранить Inkcanvas с помощью savefiledialog в wpf
- 3. сохранение WPF InkCanvas в JPG - изображение обрезается
- 4. InkCanvas в Windows Phone 8
- 5. InkPicture control - Как сохранить как чернила, так и изображение в файл изображения
- 6. WPF: как сохранить инсульт в растровое изображение?
- 7. Как показать изображение за пределами inkcanvas
- 8. Сохранение inkcanvas
- 9. Как сохранить изображение в Windows CE?
- 10. Шаблон управления InkCanvas
- 11. Универсальные штрихи InkCanvas Windows исчезают на RenderTargetBitmap.RenderAsync
- 12. OpenCV и Windows, 10 прозрачное изображение
- 13. Как сохранить WAV-файл в Windows 10 с помощью NAudio
- 14. Отправить подпись InkCanvas с использованием вызова WCF
- 15. Сохранить изображение в галерее. {Windows Phone 8.1}
- 16. Windows 10 Universal Remove Lock Screen Изображение
- 17. InkCanvas to BitMap
- 18. Как изменить загрузочное изображение в Windows 10 IoT?
- 19. Сохранить изображение в C# Windows Store приложения
- 20. Функциональность Redo на InkCanvas
- 21. IE 10 открыть сохранить и сохранить как
- 22. Камера чернила после возобновления
- 23. Как разрешить чернила в защищенном листе?
- 24. Добавление TextBlock в InkCanvas
- 25. Crop inkCanvas рисунок из определенной области, Windows Universal App
- 26. Как переопределить меню «Сохранить изображение» WKWebView на iOS 10
- 27. Кадрирование поглаженной области как растровое изображение из контейнера InkCanvas
- 28. Как сохранить изображение PictureBox в SQL в VB.NET (форма Windows)
- 29. Как сохранить изображение в папке проекта в Windows Phone 8?
- 30. Получить удаленные элементы в InkCanvas
дубликат http://stackoverflow.com/questions/32153880/how-to-render-inkcanvas-to-an-image-in-uwp-windows-10-application – crazyphoton