我正在尝试将图像文件中的像素数据读作byte[]
,用于内存存储。 (字节数组稍后会被送到位图图像对象,但我想要内存中的数据,以便没有I / O持有量。)
这就是我目前正在做的事情:
private byte[] GetImageBytes(Uri imageUri) {
//arraySize and stride previously defined
var pixelArray = new byte[arraySize];
new BitmapImage(imageUri).CopyPixels(pixelArray , stride, 0);
return pixelArray ;
}
我想知道是否有人知道获取byte[]
数据的方法,而不是制作BitmapImage
然后复制所有字节。即是否有一个.NET类只会从文件中流式传输像素数据? (我最初使用的是File.ReadAllBytes
,但是它带来了其他内容,比如图像元数据,但是没有用完。)
答案 0 :(得分:0)
您是否曾在System.Drawing中使用过ImageConverter类?
你可以做一些像
这样的事情private byte[] GetImageBytes(Uri imageUri)
{
ImageConverter ic = new ImageConverter();
return (byte[])ic.ConvertTo(imageUri, typeof(byte[]));
}
可能有一些与ImageConverter类或System.Drawing中类似类中的像素复制有关的方法
答案 1 :(得分:0)
您是否考虑过将图像加载到CachedBitmap而不是使用自己的缓存机制?
http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.cachedbitmap.aspx
答案 2 :(得分:0)
我会回答我自己的问题,以防其他人认为有用:
我原本想将数据读入字节数组的原因是我可以在后台线程上执行文件或网络IO。但我已经了解了Freeze()
方法,它允许在后台线程上读取图像,然后跨线程共享。
因此,如果我冻结BitmapImage
,暂时将数据存储在byte[]
中的动力消失了,问题就解决了。
答案 3 :(得分:0)
在.NET 4.5中,以下实际可行:
ImageConverter ic = new ImageConverter();
return (byte[])ic.ConvertTo(imageUri, typeof(byte[]));
我的实际实施是:
Image img;
img = Image.FromFile(fi.FullName);
ImageConverter ic = new ImageConverter();
byte[] pixels = (byte[])ic.ConvertTo(img, typeof(byte[]));