Zobrazení Base64 obrázku v Xamarin.Forms

Xamarin Development WinUI

6 years ago

Kódování Base64 je poměrně často využíváno pro ukládání binárních dat jako řetězců, například obrázků na webu. Práce s Base64 je zabudována do .NETu a tak se podíváme, jak lze Base64 obrázek dekódovat a následně zobrazit v Xamarin.Forms aplikaci.

Ukázkový obrázek

Jako ukázkový obrázek jsem vybral PNG verzi loga Xamarinu. Pokud chcete, jeho Base64 verzi si můžete stáhnout jako součást zdrojového kódu na GitHubu.

Xamarin logo, soon to be Base64

Xamarin logo, již brzy jako Base64

Dekódování

Když přijde na konverzi "čehokoliv na cokoliv", třída System.Convert je většinou nejlepší místo, kde začít. Má čtyři metody týkající se Base64:

  • ToBase64String

  • FromBase64String

  • ToBase64CharArray

  • FromBase64CharArray

    Pro naše účely je nejvhodnější metoda FromBase64String, které poskytneme string zakódovaný v Base64 a zpět dostaneme zkonvertované pole bytů.

var byteArray = Convert.FromBase64String(source);

Zobrazení obrázku

Pro zobrazení obrázku potřebujeme instanci Xamarin.Forms.ImageSource. Tu můžeme vytvořit pomocí Streamu. A protože již máme pole bytů v paměti, MemoryStream je jasná volba.

Stream stream = new MemoryStream(byteArray);
var imageSource = ImageSource.FromStream(()=>stream);
MyImage.Source = imageSource;

A to je vše! Obrázek je nyní zobrazen a funguje na všech platformách.

Image served!

Zobrazené logo

Bonus – jen pro UWP

Pokud vyvíjíte jen UWP aplikaci, máte dvě alternativy pro vytvoření BitmapImage z Base64 stringu:

public async Task<BitmapImage> Base64StringToBitmapLongerAsync(string source)
{
    var inMemoryStream = new InMemoryRandomAccessStream();
    var byteArray = Convert.FromBase64String(source);
    var dataWriter = new DataWriter(inMemoryStream);
    dataWriter.WriteBytes(byteArray);
    await dataWriter.StoreAsync();
    inMemoryStream.Seek(0);
    var bitmapImage = new BitmapImage();
    bitmapImage.SetSourceAsync(inMemoryStream);
    return bitmapImage;
}

public async Task<BitmapImage> Base64StringToBitmapSimplerAsync(string source)
{
    var byteArray = Convert.FromBase64String(source);            
    BitmapImage bitmap = new BitmapImage();
    using (MemoryStream stream = new MemoryStream(byteArray))
    {
        await bitmap.SetSourceAsync(stream.AsRandomAccessStream());
    }
    return bitmap;
}

Obě řešení fungují stejně dobře, ale narozdíl od Xamarin.Forms využívají async/await s SetSourceAsync, což je doporučený postup v UWP.

Zdrojový kód

Ukázkový zdrojový kód si můžete prohlédnout na mém GitHubu.

Shrnutí

Ukázali jsme si, jak dekodovat Base64 obrázek a zobrazit jej v Xamarin.Forms aplikaci. Také jsme se podívali na alternativní přístupy v UWP s pomocí async.