2
votes

I am trying to read in the pixel data from an image file as a byte[], for in-memory storage. (The byte array will later be fed to a bitmap image object, but I want the data in memory so that there's no I/O holdup.)

This is what I'm currently doing:

private byte[] GetImageBytes(Uri imageUri) {

     //arraySize and stride previously defined

    var pixelArray = new byte[arraySize];
    new BitmapImage(imageUri).CopyPixels(pixelArray , stride, 0);

    return pixelArray ;
}

I am wondering if someone knows of a way to get the byte[] data other than making a BitmapImage and then copying all of the bytes out. I.e. is there a .NET class that will just stream pixel data from the file? (I was originally using File.ReadAllBytes, but that brings in other stuff like the image metadata, and wasn't working out.)

4

4 Answers

0
votes

Have you considered just loading your image into a CachedBitmap instead of using your own caching mechanism?

http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.cachedbitmap.aspx

0
votes

I will answer my own question, in case anyone else finds it useful:

The reason I had originally wanted to read the data into a byte array was so that I could do the file or network IO on a background thread. But I have since learned about the Freeze() method, which lets the image be read on a background thread and then shared across threads.

So if I freeze the BitmapImage, the impetus for temporarily storing the data in a byte[] goes away, and the problem is solved.

0
votes

In .NET 4.5, the following actually works:

ImageConverter ic = new ImageConverter(); 
return (byte[])ic.ConvertTo(imageUri, typeof(byte[]));

My actual implementation was:

Image img;
img = Image.FromFile(fi.FullName);
ImageConverter ic = new ImageConverter();
byte[] pixels = (byte[])ic.ConvertTo(img, typeof(byte[]));
0
votes

Have you played around with the ImageConverter class in System.Drawing?

You might be able to do something like

private byte[] GetImageBytes(Uri imageUri) 
{
    ImageConverter ic = new ImageConverter();
    return (byte[])ic.ConvertTo(imageUri, typeof(byte[]));
}

There might be some methods relating to copying pixels in the ImageConverter class or in a similar class in System.Drawing