是否将位图图像保存到uwp中的本地图像文件?
我的应用程序中有一个图像控件,并且已经设置了它的源代码 如何将图像保存到本地图像文件 我尝试了以下代码,但没有成功是否将位图图像保存到uwp中的本地图像文件?,uwp,Uwp,我的应用程序中有一个图像控件,并且已经设置了它的源代码 如何将图像保存到本地图像文件 我尝试了以下代码,但没有成功 var saveFile = new FileSavePicker(); saveFile.SuggestedStartLocation = PickerLocationId.PicturesLibrary; saveFile.FileTypeChoices.Add("jpeg", new List<string> { "
var saveFile = new FileSavePicker();
saveFile.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
saveFile.FileTypeChoices.Add("jpeg", new List<string> { ".jpeg" });
saveFile.SuggestedFileName = MasterMenuItem.Title + " - " + MasterMenuItem.AlbumArtistsString;
StorageFile sFile = await saveFile.PickSaveFileAsync();
try
{
if (sFile != null)
{
Guid bitmapEncoderGuid = BitmapEncoder.JpegEncoderId;
IRandomAccessStream stream = await sFile.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.None);
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(bitmapEncoderGuid, stream);
BitmapImage bi = MasterMenuItem.Cover as BitmapImage;
WriteableBitmap wb = null;
wb = await BitmapFactory.New(1, 1).FromContent(bi.UriSource);
Stream pixelStream = wb.PixelBuffer.AsStream();
byte[] pixels = new byte[pixelStream.Length];
await pixelStream.ReadAsync(pixels, 0, pixels.Length);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
(uint)wb.PixelWidth,
(uint)wb.PixelHeight,
96.0,
96.0,
pixels);
await encoder.FlushAsync();
stream.Dispose();
pixelStream.Dispose();
}
}
catch { }
var saveFile=new FileSavePicker();
saveFile.SuggestedStartLocation=PickerLocationId.PicturesLibrary;
saveFile.FileTypeChoices.Add(“jpeg”,新列表{.jpeg});
saveFile.SuggestedFileName=MasterMenuItem.Title+“-”+MasterMenuItem.AlbumArtistString;
StorageFile sFile=wait saveFile.PickSaveFileAsync();
尝试
{
if(sFile!=null)
{
Guid bitmapEncoderGuid=BitmapEncoder.JpegEncoderId;
irandomaccesstream=wait sFile.OpenAsync(FileAccessMode.ReadWrite,StorageOpenOptions.None);
BitmapEncoder编码器=等待BitmapEncoder.CreateAsync(bitmapEncoderGuid,流);
BitmapImage bi=主菜单项。覆盖为BitmapImage;
WriteableBitmap wb=null;
wb=等待BitmapFactory.New(1,1).FromContent(bi.UriSource);
Stream pixelStream=wb.PixelBuffer.AsStream();
字节[]像素=新字节[pixelStream.Length];
等待pixelStream.ReadAsync(像素,0,像素,长度);
编码器.SetPixelData(BitmapPixelFormat.Bgra8,BitmapAlphaMode.Ignore,
(uint)wb.PixelWidth,
(uint)wb.PixelHeight,
96.0,
96.0,
像素);
等待编码器。FlushAsync();
stream.Dispose();
pixelStream.Dispose();
}
}
捕获{}
以下是我的一个应用程序的工作方法 基本上,我将
图像
控件转换为渲染目标位图
,然后使用文件保存选择器
保存图像
如果不想使用图像
控件,但想保存源
本身,则需要在呈现图像
控件时保存软件位图
,然后使用该位图保存图像
。例如
private async void按钮\u点击(对象发送器,点击路由Deventargs e)
{
var_bitmap=新的RenderTargetBitmap();
wait_bitmap.RenderAsync(myImageSource);//----->这是我的ImageControl。
var savePicker=new FileSavePicker();
savePicker.SuggestedStartLocation=PickerLocationId.PicturesLibrary;
savePicker.FileTypeChoices.Add(“Image”,newlist(){.jpg});
savePicker.SuggestedFileName=“Card”+DateTime.Now.ToString(“yyyyMMddhhmmss”);
StorageFile savefile=wait savePicker.PickSaveFileAsync();
if(savefile==null)
返回;
var pixels=wait_bitmap.GetPixelsAsync();
使用(irandomaccesstream=await savefile.OpenAsync(FileAccessMode.ReadWrite))
{
var编码器=等待
CreateAsync(BitmapEncoder.JpegEncoderId,流);
字节[]字节=像素。ToArray();
编码器.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode。忽略,
(uint)_bitmap.PixelWidth,
(uint)_bitmap.PixelHeight,
200,
200,
字节);
等待编码器。FlushAsync();
}
}
以下是我的一个应用程序的工作方法
基本上,我将图像
控件转换为渲染目标位图
,然后使用文件保存选择器
保存图像
如果不想使用图像
控件,但想保存源
本身,则需要在呈现图像
控件时保存软件位图
,然后使用该位图保存图像
。例如
private async void按钮\u点击(对象发送器,点击路由Deventargs e)
{
var_bitmap=新的RenderTargetBitmap();
wait_bitmap.RenderAsync(myImageSource);//----->这是我的ImageControl。
var savePicker=new FileSavePicker();
savePicker.SuggestedStartLocation=PickerLocationId.PicturesLibrary;
savePicker.FileTypeChoices.Add(“Image”,newlist(){.jpg});
savePicker.SuggestedFileName=“Card”+DateTime.Now.ToString(“yyyyMMddhhmmss”);
StorageFile savefile=wait savePicker.PickSaveFileAsync();
if(savefile==null)
返回;
var pixels=wait_bitmap.GetPixelsAsync();
使用(irandomaccesstream=await savefile.OpenAsync(FileAccessMode.ReadWrite))
{
var编码器=等待
CreateAsync(BitmapEncoder.JpegEncoderId,流);
字节[]字节=像素。ToArray();
编码器.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode。忽略,
(uint)_bitmap.PixelWidth,
(uint)_bitmap.PixelHeight,
200,
200,
字节);
等待编码器。FlushAsync();
}
}
这是我为处理UWP中的图像而提出的一个往返解决方案
此外,我还需要从base-64进行编码和解码
如果不想调用FileOpenPicker,则以下代码是执行此操作的唯一方法
另外,请注意:如果您不调用选择器,那么您在保存文件的位置上的选项是有限的,这就是为什么我默认为用户的下载di
using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Security.Cryptography;
using Windows.UI.Xaml.Media.Imaging;
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.Storage;
using Windows.Graphics.Imaging;
namespace Images
{
public static class ImageHelper
{
public static async Task<WriteableBitmap> TestImage()
{
// example base64-encoded icon in PNG format at 24x24, 32 bit color
string base64str = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAONSURBVEhLpVZZaxNRFJ6f4KNb3brZ1XSxrVq17pnpZDJpUxdUDIqgFKQPKhYF2xcXpBb6JPpQSDKZcY1L7YZYFbGKhfjkm/jkc37C8ftuMhBLG6098JHh3nO+s9xz7o1WTFbG9RWr4npsfaJztDJpzdQ6YQV+b0yYw9iz86pLExKvTRijm5OWND88LNHxC3L98125Mjsk/cDljzelB2twJjVOOLsu0TlAm7x5cYGiXZ4MZSNj52Ukc0/mfr0rittzI9Lx9AQd/VwVNwJ5moVlddyINXjdMjh7U6Z/PFkS+t5dlcZUJFuSWMQJ64nayq0vN+TR9/v/hYvv+6UJThDon05Qlg0sizV2Rh58u7MstDzukS2OnclT56QEXQIH0jvTK0Nfry0LRydPS7PbJaXJUEyRM3qWZl1Sl963Z2Xw04Vl4ejkcalMmXTyUzlA7fuq0W6bXV1OTh+TSx9OLwvd41Gp8nTZiixQmQ4NA5Mud0zZ8kiXQy9NlOnIf+Pc2yOy54UhAXA1uhGpSloDWrVjZUpQnqbHOjZ1sSdMib2JLBmnAHPcUBzNT3Spcy0JpOy0hgGR9Q5SwuJebB4aC0p40pCeaVMO/yOiQGhSl+DroOJoAVfAC0uL2zWjcdw3zHPQORGEAR0FxZ5CVkVgQYe6tFEOXuYcNPgOkEGGHdSERaZX6ICwpuBoEXDP16MNbcnBYOtRIgxdWitLhtKVOGQezO7nuhx4FRRjPCgmyfPGC5ETKgCAurQ5CAfkaMB5NnsRqXPsAW1N3OirT9lSjdba8UyX/a9ytSzMQhEVEBdGTvjloW07OGrAtQ13WkXSCqhB88+Bp9+BFBmJjoh8J34mC4E61KWNX54q15QdXjQ3aJRNCXO0NhVWWWxHBDyoQicswXxirvnkrP0+2NC25iF+vajUO3buqqDwsajDw1HqdKqBY6l8J0yd9SVZIbjGPeqQvD2N1oQt+7/N7f7zsqOsjRs2BkNKHUM5YTRMmXUlCaMkIcFvrnGPOgyI5LVuSHZ6PdnSRGjhNwFvb6whFZEyZMJUWU9G1oHO4IwwKwV8c4177Pla6DLyXSBH2xd/1fKZZHmXVKQMZdyItiNR29Mc+M017lW6hrShY3ComUUjny88E7TYcKvbnW3xujA0YZX+ppSuwGug0bOlFcTtuagH8qZLEzrCbRvDCzXMsUcJFFrxjSyH8Uj95W+Lpv0GtNxNNKdkcLwAAAAASUVORK5CYII=";
// First load the image from the base64 string
var img = await LoadImageFromBase64(base64str);
// Now test round-trip Base64 to Base64
string sTest = await SaveImageToBase64(img);
img = await LoadImageFromBase64(sTest);
// now save the round-trip image
var accTok = await SaveImageToFile("checkbox-round-trip.png", img);
// now load, round-trip, from disk.
img = await LoadImageFromFile(accTok, true);
return img;
}
public static async Task<WriteableBitmap> LoadImageFromBase64(string base64str)
{
try
{
var decodedBin = CryptographicBuffer.DecodeFromBase64String(base64str);
var readStream = new InMemoryRandomAccessStream();
await readStream.WriteAsync(decodedBin);
readStream.Seek(0);
var decoder = await BitmapDecoder.CreateAsync(readStream);
var workBmp = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
readStream.Seek(0);
await workBmp.SetSourceAsync(readStream);
return workBmp;
}
catch (Exception ex)
{
return null;
}
}
public static async Task<string> SaveImageToBase64(WriteableBitmap workBmp)
{
try
{
var writeStream = new InMemoryRandomAccessStream();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, writeStream);
// saving to a straight 32 bpp PNG, the dpiX and dpiY values are irrelevant, but also cannot be zero.
// We will use the default "since-the-beginning-of-time" 96 dpi.
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)workBmp.PixelWidth, (uint)workBmp.PixelHeight, 96, 96, workBmp.PixelBuffer.ToArray());
await encoder.FlushAsync();
writeStream.Seek(0);
var proxyStream = writeStream.AsStreamForRead();
byte[] b = new byte[proxyStream.Length];
await proxyStream.ReadAsync(b, 0, (int)proxyStream.Length);
proxyStream.Dispose();
return (string)CryptographicBuffer.EncodeToBase64String(b.AsBuffer());
}
catch (Exception ex)
{
return null;
}
}
public static async Task<WriteableBitmap> LoadImageFromFile(string fileName, bool isToken = false)
{
try
{
var xc = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList;
StorageFile decodedBin;
if (!isToken)
{
decodedBin = await StorageFile.GetFileFromPathAsync(fileName);
}
else
{
decodedBin = await xc.GetFileAsync(fileName, Windows.Storage.AccessCache.AccessCacheOptions.None);
}
var readStream = await decodedBin.OpenReadAsync();
var decoder = await BitmapDecoder.CreateAsync(readStream);
var workBmp = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
readStream.Seek(0);
await workBmp.SetSourceAsync(readStream);
readStream.Dispose();
return workBmp;
}
catch (Exception ex)
{
return null;
}
}
public static async Task<string> SaveImageToFile(string fileName, WriteableBitmap workBmp)
{
try
{
var writeStream = new InMemoryRandomAccessStream();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, writeStream);
// saving to a straight 32 bpp PNG, the dpiX and dpiY values are irrelevant, but also cannot be zero.
// We will use the default "since-the-beginning-of-time" 96 dpi.
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)workBmp.PixelWidth, (uint)workBmp.PixelHeight, 96, 96, workBmp.PixelBuffer.ToArray());
await encoder.FlushAsync();
writeStream.Seek(0);
var dl = await DownloadsFolder.CreateFileAsync(fileName, CreationCollisionOption.GenerateUniqueName);
var imgFileOut = await dl.OpenStreamForWriteAsync();
var fileProxyStream = writeStream.AsStreamForRead();
await fileProxyStream.CopyToAsync(imgFileOut);
await imgFileOut.FlushAsync();
fileProxyStream.Dispose();
imgFileOut.Dispose();
var xc = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList;
return xc.Add(dl);
}
catch (Exception ex)
{
return null;
}
}
}
}