Read pixel data from an image file in .NET
I am trying to read in the pixel data from an image file as a byte[]
, for in开发者_如何学JAVA-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.)
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
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.
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[]));
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
精彩评论