Xamarin Forms将ImageSource转换为实际的png图像并存储在设备上
问题描述:
有没有办法将ImageSource(从api调用拉出)转换为设备上的实际png文件,然后在需要时将其作为FileImageSource访问?我想实现图像缓存,以便我的应用程序不依赖网络。Xamarin Forms将ImageSource转换为实际的png图像并存储在设备上
答
的iOS
NSData imgData = null;
var renderer = new Xamarin.Forms.Platform.iOS.StreamImagesourceHandler();
UIKit.UIImage photo = await renderer.LoadImageAsync (img);
var savedImageFilename = System.IO.Path.Combine (directory, filename);
NSFileManager.DefaultManager.CreateDirectory(directory, true, null);
if (System.IO.Path.GetExtension (filename).ToLower() == ".png")
imgData = photo.AsPNG();
else
imgData = photo.AsJPEG (100);
NSError err = null;
imgData.Save (savedImageFilename, NSDataWritingOptions.Atomic, out err)
的Android
System.IO.Stream outputStream = null;
var renderer = new Xamarin.Forms.Platform.Android.StreamImagesourceHandler();
Bitmap photo = await renderer.LoadImageAsync (img, Forms.Context);
var savedImageFilename = System.IO.Path.Combine (directory, filename);
System.IO.Directory.CreateDirectory(directory);
bool success = false;
using (outputStream = new System.IO.FileStream(savedImageFilename, System.IO.FileMode.Create))
{
if (System.IO.Path.GetExtension (filename).ToLower() == ".png")
success = await photo.CompressAsync(Bitmap.CompressFormat.Png, 100, outputStream);
else
success = await photo.CompressAsync(Bitmap.CompressFormat.Jpeg, 100, outputStream);
}
也许你会想将它申报为依存服务抽象出共同的项目,并在每一个平台上实现,这将有一个方法,如:
Task<bool> SaveImage(string directory, string filename, ImageSource img);
FFImageLoading软件包会为你做这件事。如果您确实需要自己做,在加载它之后但在将其分配给图像源之前缓存它会更加高效。 – Jason