praeclarum / NGraphics

NGraphics is a cross platform library for rendering vector graphics on .NET. It provides a unified API for both immediate and retained mode graphics using high quality native renderers.
MIT License
705 stars 133 forks source link

Image from base64 string #84

Closed mapr-fr closed 7 years ago

mapr-fr commented 7 years ago

Hi,

I'm using NGraphics to create user's avatar in my Xamarin.Forms app. But I've an issue when I try to create an instance IImage from a MemoryStream created with a Base64 string. Here is my code :

var bytes = Convert.FromBase64String(Base64Image);
using(var ms = new MemoryStream(bytes))
{
     var img = Platform.LoadImage(ms);
     canvas.DrawImage(
          img,
          new Rect(
               new NGraphics.Rect(0, 0),
               new NGraphics.Size(Width, Height)
          )
     );
}

When I execute this code, NGraphics throw this Exception :

{System.ArgumentNullException: Value cannot be null. Parameter name: image at NGraphics.CGImageImage..ctor (CoreGraphics.CGImage image, System.Double scale) [0x0000c] in /Users/fak/Dropbox/Projects/NGraphics/Platforms/NGraphics.Mac/ApplePlatform.cs:138 at NGraphics.ApplePlatform.LoadImage (System.IO.Stream stream) [0x00057] in /Users/fak/Dropbox/Projects/NGraphics/Platforms/NGraphics.Mac/ApplePlatform.cs:82 at ... }

Is there something I forgot?

Thanks :)

mapr-fr commented 7 years ago

I bypassed the problem by creating an interface in my PCL project and depencies in device apps to create an instance of IImage from a base64 string.

iOS :

public IImage GetAvatarFromBase64string(string base64Avatar)
{
    UIImage img = new UIImage(
        Foundation.NSData.FromArray(
            Convert.FromBase64String(base64Avatar)
        )
    );
    return new CGImageImage(img.CGImage, 1);
}

Android :

public IImage GetAvatarFromBase64string(string base64Avatar)
{
    var img = Android.Util.Base64.Decode(base64Avatar, Android.Util.Base64Flags.Default);
    var avatar = Android.Graphics.BitmapFactory.DecodeByteArray(img, 0, img.Length);
    return new BitmapImage(avatar, 1);
}

Problem solved :)