Home > Net >  How can i convert a file .png to a Bitmap? Nothing works for me. Error "'Failed to decode
How can i convert a file .png to a Bitmap? Nothing works for me. Error "'Failed to decode

Time:02-08

I'm working with Xamarin in the part of Xamarin.Forms i need to convert a file ("image.png") to a Bitmap because when project run its enter in "break mode" and show me this message "Java.Lang.IllegalArgumentException: 'Failed to decode image. The provided image must be a Bitmap.'". So i tried to convert the file in many ways like:

1_ Using methods from System.Drawing.Bitmap but it's show this exception "This operation is not supported in this platform"

2_ Cannot use Android.Graphics because i'm working in xamarin.forms not in xamarin.android.

3_ I tried to convert the "image.png" into a base64 or byte[] array and then into a bitmap but the problem is the same like in first problem because to convert from byte[] array or base64 to a Bitmap i have use methods from System.Drawing.Bitmap.

4_ I tried using the library SkiaSharp but i don't have success because i don't found so much information about how to convert .png to SKBitmap and then convert SKBitmap to Bitmap (even i don't know if this is possible).

5_ Finally i converted "image.png" to a "image.bmp" with an app and use the file .bmp in my project but it doesn't work too.

the "image.png" i have to save in a string variable, well that's the idea.

If you have a solution with SkiaSharp o whatever i will glad

CodePudding user response:

Use ffmpeg command for this: ffmpeg -i image.png image.bmp

CodePudding user response:

To open your file and convert it to byte array:

string directory = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads); 
// or your image directory, just replace it
var stream = File.OpenWrite(Path.Combine(directory, "image.png"));
byte[] buff = ConvertStreamToByteArray(stream);
            stream.Close();

public static byte[] ConvertStreamToByteArray(Stream stream)
        {
            byte[] byteArray = new byte[16 * 1024];
            using (MemoryStream mStream = new MemoryStream())
            {
                int bit;
                while ((bit = stream.Read(byteArray, 0, byteArray.Length)) > 0)
                {
                    mStream.Write(byteArray, 0, bit);
                }
                return mStream.ToArray();
            }
        }

then, to pass this byte array to SKBitmap:


SKBitmap bmp = SKBitmap.Decode(buff);
  •  Tags:  
  • Related