Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert byte array to image in wpf

Tags:

c#

wpf

I used

private BitmapImage byteArrayToImage(byte[] byteArrayIn)
{
    try
    {               
        MemoryStream stream = new MemoryStream();
        stream.Write(byteArrayIn, 0, byteArrayIn.Length);
        stream.Position = 0;
        System.Drawing.Image img = System.Drawing.Image.FromStream(stream);
        BitmapImage returnImage = new BitmapImage();
        returnImage.BeginInit();
        MemoryStream ms = new MemoryStream();
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        ms.Seek(0, SeekOrigin.Begin);
        returnImage.StreamSource = ms;
        returnImage.EndInit();

        return returnImage;
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return null;
}

This method in my application to convert byte array to an image. But it throws "Parameter is not valid" exception.. why it is happening..? Is there any alternative method.??

like image 389
Bijoy K Jose Avatar asked Mar 05 '12 09:03

Bijoy K Jose


3 Answers

Hi this should be working:

    private static BitmapImage LoadImage(byte[] imageData)
    {
        if (imageData == null || imageData.Length == 0) return null;
        var image = new BitmapImage();
        using (var mem = new MemoryStream(imageData))
        {
            mem.Position = 0;
            image.BeginInit();
            image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = null;
            image.StreamSource = mem;
            image.EndInit();
        }
        image.Freeze();
        return image;
    }
like image 155
Random Dev Avatar answered Oct 05 '22 10:10

Random Dev


If you have array like this:

byte[] byteArrayIn = new byte[] {255, 128, 0, 200};

And you want something like: enter image description here

Use:

BitmapSource bitmapSource = BitmapSource.Create(2, 2, 300, 300,PixelFormats.Indexed8,    BitmapPalettes.Gray256, byteArrayIn, 2);

Image.Source = bitmapSource;

In xaml:

<Image RenderOptions.BitmapScalingMode="NearestNeighbor" RenderOptions.EdgeMode="Aliased" x:Name="Image"></Image>   
like image 20
Alamakanambra Avatar answered Oct 05 '22 10:10

Alamakanambra


public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void btnBrowse_Click(object sender, RoutedEventArgs e)
    {
        var of = new OpenFileDialog();
        of.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";
        var res = of.ShowDialog();
        if (res.HasValue)
        {
            imgPreview.Source = new BitmapImage(new Uri(of.FileName));

            var t = Utils.ConvertBitmapSourceToByteArray(imgPreview.Source as BitmapSource);
            var d = Utils.ConvertBitmapSourceToByteArray(new BitmapImage(new Uri(of.FileName)));
            var s = Utils.ConvertBitmapSourceToByteArray(imgPreview.Source);
            var enc = Utils.ConvertBitmapSourceToByteArray(new PngBitmapEncoder(), imgPreview.Source);
            //imgPreview2.Source = Utils.ConvertByteArrayToBitmapImage(enc);
            imgPreview2.Source = Utils.ConvertByteArrayToBitmapImage2(enc);
            //var i = 0;


        }
        else
        {
            MessageBox.Show("Select a currect file...");

        }
    }

}

/util.cs/

public class Utils
{
    public static byte[] ConvertBitmapSourceToByteArray(BitmapEncoder encoder, ImageSource imageSource)
    {
        byte[] bytes = null;
        var bitmapSource = imageSource as BitmapSource;

        if (bitmapSource != null)
        {
            encoder.Frames.Add(BitmapFrame.Create(bitmapSource));

            using (var stream = new MemoryStream())
            {
                encoder.Save(stream);
                bytes = stream.ToArray();
            }
        }

        return bytes;
    }

    public static byte[] ConvertBitmapSourceToByteArray(BitmapSource image)
    {
        byte[] data;
        BitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(image));
        using (MemoryStream ms = new MemoryStream())
        {
            encoder.Save(ms);
            data = ms.ToArray();
        }
        return data;
    }
    public static byte[] ConvertBitmapSourceToByteArray(ImageSource imageSource)
    {
        var image = imageSource as BitmapSource;
        byte[] data;
        BitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(image));
        using (MemoryStream ms = new MemoryStream())
        {
            encoder.Save(ms);
            data = ms.ToArray();
        }
        return data;
    }
    public static byte[] ConvertBitmapSourceToByteArray(Uri uri)
    {
        var image = new BitmapImage(uri);
        byte[] data;
        BitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(image));
        using (MemoryStream ms = new MemoryStream())
        {
            encoder.Save(ms);
            data = ms.ToArray();
        }
        return data;
    }
    public static byte[] ConvertBitmapSourceToByteArray(string filepath)
    {
        var image = new BitmapImage(new Uri(filepath));
        byte[] data;
        BitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(image));
        using (MemoryStream ms = new MemoryStream())
        {
            encoder.Save(ms);
            data = ms.ToArray();
        }
        return data;
    }

    public static BitmapImage ConvertByteArrayToBitmapImage(Byte[] bytes)
    {
        var stream = new MemoryStream(bytes);
        stream.Seek(0, SeekOrigin.Begin);
        var image = new BitmapImage();
        image.BeginInit();
        image.StreamSource = stream;
        image.EndInit();
        return image;
    }
}
like image 5
Vahidshirzadi Avatar answered Oct 05 '22 09:10

Vahidshirzadi