DotNetRussell
DotNetRussell

Reputation: 9857

Convert Image into Byte[]

I want to start learning about how to tear images apart to find patterns in them but in order to do that I need to first see what makes it up. I want to take a png and convert it into a byte array so I can print it out and see if I can recognize simple patterns in the array values.

So far I have this

public MainWindow()
{
    InitializeComponent();
    System.Drawing.Image image;
    image = System.Drawing.Image.FromFile("one.png");            

    byte[] imArray = imageToByteArray(image);

    String bytes = "";
    foreach (Char bite in imArray)
    {
        bytes += "-"+bite;
    }
    MessageBox.Show(bytes);


}

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
    return ms.ToArray();
}

But it doesn't seem to be working. It gives me a null error when the conversion method is called. I have NO clue why this isn't working because my understanding of the compenents is nill.

If you can suggest an easier way to make this conversion feel free to post it. Im not stuck on this code I just want a working example so I have a starting point.

Thanks!

Upvotes: 0

Views: 6811

Answers (3)

dvallejo
dvallejo

Reputation: 1053

Or you can just open the file in a binary editor.

Upvotes: -1

Alexei Levenkov
Alexei Levenkov

Reputation: 100547

I'd recommend starting with Bitmap to look at binary data - most other formats store data compressed, so you have no chance to understand what is inside an image by looking at the bytes.

The method you want is Bitmap.LockBits. The article also includes complete sample how to read from file and look t bits, excerpt below:

Bitmap bmp = new Bitmap("c:\\fakePhoto.jpg");
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData =
   bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);

int bytes  = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] rgbValues = new byte[bytes];

// Copy the RGB values into the array.
Marshal.Copy(bmpData.Scan0, rgbValues, 0, bytes);

Upvotes: 2

ArthasNed_StarkGimli
ArthasNed_StarkGimli

Reputation: 42

you could try converting the image to a dataURI then converting it to a blob, heres an example of how you can convert dataURIs to blobs Blob from DataURL?

function dataURItoBlob(dataURI) {

var byteString = atob(dataURI.split(',')[1]);
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);

for (var i = 0; i < byteString.length; i++) {
    ia[i] = byteString.charCodeAt(i);
  }

var bb = new BlobBuilder();
bb.append(ab); return bb.getBlob(mimeString);
}

Upvotes: 0

Related Questions