2017-10-06 196 views
0

有没有办法将ImageSource(从api调用拉出)转换为设备上的实际png文件,然后在需要时将其作为FileImageSource访问?我想实现图像缓存,以便我的应用程序不依赖网络。Xamarin Forms将ImageSource转换为实际的png图像并存储在设备上

+0

FFImageLoading软件包会为你做这件事。如果您确实需要自己做,在加载它之后但在将其分配给图像源之前缓存它会更加高效。 – Jason

回答

1

的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); 
相关问题