Convert Image into byte array in Xamarin.Forms

17,493

Solution 1

I was unable to convert it in X.Forms, instead I use the following code with a dependency service. Thank you to all.

    public async Task<byte[]> GetBytesFromImage(string filePath)
    {
        ConvertImageToBW(filePath);

        // Create another bitmap that will hold the results of the filter.
        Bitmap thresholdedBitmap = Bitmap.CreateBitmap (BitmapFactory.DecodeFile(filePath));

        thresholdedBitmap = BitmapFactory.DecodeFile (thresholdedImagePath);

        byte[] bitmapData;
        using (var stream = new MemoryStream())
        {
            thresholdedBitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
            bitmapData = stream.ToArray();
        }

        return bitmapData;
    }

Solution 2

Have you tried using converters?

 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        ImageSource retSource = null;
        if (value != null)
        {
            byte[] imageAsBytes = (byte[])value;
            retSource = ImageSource.FromStream(() => new MemoryStream(imageAsBytes));
        }
        return retSource;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

Solution 3

It turns out that you can convert the MediaFile object to a byte array. So no need to convert the file to ImageSource or Image.

var photo = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions() { });

byte[] imageArray = null;

using (MemoryStream memory = new MemoryStream()) {

    Stream stream = photo.GetStream();
    stream.CopyTo(memory);
    imageArray = memory.ToArray();
}

Source: https://forums.xamarin.com/discussion/156236/how-to-get-the-bytes-from-the-imagesource-in-xamarin-forms
Shoutout to user "ajaxer" in the Xamarin forums whose solution saved me after spending 3 days on this issue. 😁

Share:
17,493
Jonathan Zúñiga
Author by

Jonathan Zúñiga

Web developer, JavaScript enthusiast, also like information freedom, functional programming, an internet that respects humans, retro-futuristic interfaces, design, lettering, typography, creative coding, generative art, street art, electronic music, tea and dark chocolate, but not necessarily in this order.

Updated on June 28, 2022

Comments

  • Jonathan Zúñiga
    Jonathan Zúñiga almost 2 years

    I need to pass an image (Image _thresholdedImage) like byte array... I don't know how I can do this. Any idea? Thank you!

    _thresholdedImage.Source = ImageSource.FromStream (() => photo.Source);
    
    var tessResult = await _tesseractApi.SetImage(imageBytes);