有沒有方法將InkCanvas
中的筆畫保存爲Windows 10(UWP應用程序)中的png/jpg圖像?在Windows 10中將InkCanvas筆畫保存爲png/jpg圖像
1
A
回答
1
我知道這是一箇舊帖子,但這裏是我發現爲其他人可能需要它。
如果您不想將InkCanvas保存爲文件或GIF,請在內存中對其進行處理。我實際上有三個選項。請注意,對於其中的一些內容,您需要添加一個對Win2D.uwp的引用,它可以在NuGet上搜索確切的名稱。它由微軟提供。
轉換的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; } }
希望這有助於在Windows 10使用的通用時InkCanvas提供一些替代品。
0
當然,只需將筆畫容器保存到一個流中並將其寫入文件即可。
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。
0
相關問題
- 1. 將Windows Ink保存爲透明PNG圖像 - 缺失熒光筆筆畫
- 2. UWP InkCanvas在OnNavigated上還原筆畫爲
- 3. 在不使用SaveFileDialog(UWP)的情況下保存InkCanvas筆畫
- 4. 將inkCanvas中的圖像保存爲png或jpeg文件
- 5. Inkcanvas筆畫擦除事件
- 6. 將WPF InkCanvas保存爲JPG - 圖像被裁剪
- 7. 如何將畫布保存爲圖像?
- 8. 如何使筆畫在InkCanvas上消失
- 9. 如何擦除通用Windows平臺(Windows 10)應用程序中的InkCanvas筆劃?
- 10. 保存inkcanvas
- 11. FabricJS - 從圖像中刪除筆畫用於保存
- 12. 通過套接字發送inkcanvas筆畫
- 13. 熒光筆InkCanvas
- 14. 將圖像添加到畫布不允許將畫布保存爲圖像
- 15. 在畫布中繪製並將其保存爲較大圖像
- 16. 在localStorage中保存InkManager筆畫 - windows 8應用程序
- 17. 如何在DC.js中將畫筆選擇舍入爲10或10k
- 18. 在Windows運行時將文件縮略圖保存爲圖像
- 19. 將畫布圖像保存到mysql
- 20. 將畫布圖像保存到SQLite?
- 21. 將流保存爲圖像
- 22. 將圖像保存爲Tiff
- 23. 如何將圖像保存爲圖像
- 24. 如何將畫布保存爲Spring Rest中的圖像webservice
- 25. 將畫布保存爲ASP.net中的服務器的圖像
- 26. iPhone:如何將視圖保存爲圖像? (ex.save你畫什麼)
- 27. 如何將顫動畫布保存爲位圖圖像?
- 28. 保存Inkcanvas控制內容爲pdf
- 29. 將圖像保存在Azure存儲中
- 30. Android - 如何將畫布保存到內存中的圖像
http://stackoverflow.com/questions/32153880/how-to-render-inkcanvas-to-an-image-in-uwp-windows-10-application – crazyphoton