2017-10-06 4 views
0

Existe-t-il un moyen de convertir un ImageSource (tiré de l'appel api) en un fichier png réel sur le périphérique et y accéder plus tard en tant que FileImageSource lorsque cela est nécessaire? Je voudrais implémenter la mise en cache des images afin que mon application ne dépende pas du réseau.Xamarin Forms convertit ImageSource en image png réelle et stocke sur le périphérique

+0

Si vous devez le faire vous-même, il serait beaucoup plus efficace de le mettre en cache après l'avoir chargé, mais avant de l'assigner à une source d'image. – Jason

Répondre

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); 
} 

Probablement vous voulez déclarer en tant que service de dépendance abstraire dans le projet commun et mis en œuvre dans chaque plate-forme, ce qui aurait une méthode comme:

Le paquetage FFImageLoading le fera pour vous.
Task<bool> SaveImage(string directory, string filename, ImageSource img);