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