如何使用 CanvasBitmap.SaveAsync 方法?
How do I use the CanvasBitmap.SaveAsync method?
在 Win2D API 文档中他们说
Saves the entire bitmap to a file with the specified file name, using
a default quality level of 0.9 and CanvasBitmapFileFormat.Auto.
它没有说明文件的保存位置或如何选择文件的保存位置。
我尝试使用该方法来弄清楚,但每次调用它时都会收到 "Access denied" 异常错误。
string filename = "Test pic test.png";
StorageFile TestFile = await PictureFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
using (IRandomAccessStream strem = await TestFile.OpenAsync(FileAccessMode.ReadWrite))
{
await CanvasImage.SaveAsync(filename);
}
首先,以上描述是针对CanvasBitmap.SaveAsync
方法的。由于 Win2D 还包含 CanvasImage
class,我建议避免将实例命名为 CanvasImage
.
In general you can't pass around paths in the user's filesystem (as opposed to special folders like the app package directory) because of the UWP security model:
https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions
因此您需要将流直接传递到 SaveAsync
,而不仅仅是作为字符串的路径。在您的代码片段中,您打开文件流但没有将流保存到文件中。只需将流保存到文件即可。例如:
CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, 300, 300, 96);
using (var ds = renderTarget.CreateDrawingSession())
{
ds.Clear(Colors.White);
ds.DrawRectangle(155, 115, 80, 30, Colors.Black);
}
CanvasBitmap bit = renderTarget;
string filename = "Test pic test.png";
StorageFolder pictureFolder = KnownFolders.SavedPictures;
var file = await pictureFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
await bit.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f);
}
更多细节你可以参考this blog。
在 Win2D API 文档中他们说
Saves the entire bitmap to a file with the specified file name, using a default quality level of 0.9 and CanvasBitmapFileFormat.Auto.
它没有说明文件的保存位置或如何选择文件的保存位置。 我尝试使用该方法来弄清楚,但每次调用它时都会收到 "Access denied" 异常错误。
string filename = "Test pic test.png";
StorageFile TestFile = await PictureFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
using (IRandomAccessStream strem = await TestFile.OpenAsync(FileAccessMode.ReadWrite))
{
await CanvasImage.SaveAsync(filename);
}
首先,以上描述是针对CanvasBitmap.SaveAsync
方法的。由于 Win2D 还包含 CanvasImage
class,我建议避免将实例命名为 CanvasImage
.
In general you can't pass around paths in the user's filesystem (as opposed to special folders like the app package directory) because of the UWP security model: https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions
因此您需要将流直接传递到 SaveAsync
,而不仅仅是作为字符串的路径。在您的代码片段中,您打开文件流但没有将流保存到文件中。只需将流保存到文件即可。例如:
CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, 300, 300, 96);
using (var ds = renderTarget.CreateDrawingSession())
{
ds.Clear(Colors.White);
ds.DrawRectangle(155, 115, 80, 30, Colors.Black);
}
CanvasBitmap bit = renderTarget;
string filename = "Test pic test.png";
StorageFolder pictureFolder = KnownFolders.SavedPictures;
var file = await pictureFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
await bit.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f);
}
更多细节你可以参考this blog。