0
votes

I need to convert a BitmapImage in a byte[] but I don't find how to do it in C# web. I found examples but none of them work (JpegBitmapEncoder doesn't exist, BitmapImageObject.StreamSource doesn't exist, there isn't WriteableBitmap constructor with BitmapImage as parameter, Extensions.SaveJpeg(parameters) doesn't exist ...).

Examples I found:

Constructor new WriteableBitmap(bitmapImage) doesn't exist.

public static byte[] ConvertToBytes(this BitmapImage bitmapImage)
{
    byte[] data;
    // Get an Image Stream
    using (MemoryStream ms = new MemoryStream())
    {
        WriteableBitmap btmMap = new WriteableBitmap(bitmapImage);

        // write an image into the stream
        Extensions.SaveJpeg(btmMap, ms,
            bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100);

        // reset the stream pointer to the beginning
        ms.Seek(0, 0);
        //read the stream into a byte array
        data = new byte[ms.Length];
        ms.Read(data, 0, data.Length);
    }
    //data now holds the bytes of the image
    return data;
}

new WriteableBitmap(img), System.Windows.Media.Imaging.Extensions.SaveJpeg don't exist.

public static byte[] ImageToBytes(BitmapImage img)
{
    using (MemoryStream ms = new MemoryStream())
    {
        WriteableBitmap btmMap = new WriteableBitmap(img);
        System.Windows.Media.Imaging.Extensions.SaveJpeg(btmMap, ms, img.PixelWidth, img.PixelHeight, 0, 100);
        img = null;
        return ms.ToArray();
    }
}

imageSource.StreamSource doesn't exist.

public static byte[] ImageToByte(BitmapImage imageSource)
{
    Stream stream = imageSource.StreamSource;
    Byte[] buffer = null;
    if (stream != null && stream.Length > 0)
    {
        using (BinaryReader br = new BinaryReader(stream))
        {
            buffer = br.ReadBytes((Int32)stream.Length);
        }
    }

    return buffer;
}

JpegBitmapEncoder doesn't exist.

byte[] data;
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
using(MemoryStream ms = new MemoryStream())
{
    encoder.Save(ms);
    data = ms.ToArray();
}
4
It seems you will need to link some external libraries. Read about that and you might be able to solve this problem afterwards.Lajos Arpad
Could you share your code to github?Jacob Phan

4 Answers

1
votes

Try with the using statement to a namespace in the beginning of your code. Otherwise there should be some Nuget packages which you could install to achieve your goal.

using System.Drawing;

In Main method

Image img = Image.FromFile("path to the file");
var byteArray = ImageToByte(img);

public static byte[] ImageToByte(Image img)
{
   ImageConverter converter = new ImageConverter();
   return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
1
votes

Try this I think this will help...

public byte[] ConvertBitMapToByteArray(Bitmap bitmap)
{
  byte[] result = null;
  if (bitmap != null)
   {
     MemoryStream stream = new MemoryStream();
     bitmap.Save(stream, bitmap.RawFormat);
     result = stream.ToArray();
   }
 return result;
}
1
votes
byte[] foo = System.IO.File.ReadAllBytes("bitmap path");

Or

byte[] foo;
Object obj = YourBitmap;
BinaryFormatter bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
    bf.Serialize(ms, obj);
    foo = ms.ToArray();
}

Or

ImageConverter foocon = new ImageConverter();
byte[] foo = (byte[])foocon.ConvertTo(YourBitmap, typeof(byte[]));

Or

MemoryStream ms = new MemoryStream();
Bitmap.Save(ms, YourBitmap.RawFormat);
byte[] foo = ms.ToArray();
0
votes

Finally, it seems that, obviously, it missed some libraries but we are limited with our application, so we decided to recover our pictures by another way. Anyway, thank you all.