从.NET中的图像文件读取像素数据
我试图从图像文件中读取像素数据作为字节[],以便在内存中存储。字节数组稍后将被馈送到位图图像对象,但我希望内存中的数据不会出现I/O阻塞 这就是我目前正在做的:从.NET中的图像文件读取像素数据,.net,image,streaming,bitmap,.net,Image,Streaming,Bitmap,我试图从图像文件中读取像素数据作为字节[],以便在内存中存储。字节数组稍后将被馈送到位图图像对象,但我希望内存中的数据不会出现I/O阻塞 这就是我目前正在做的: private byte[] GetImageBytes(Uri imageUri) { //arraySize and stride previously defined var pixelArray = new byte[arraySize]; new BitmapImage(imageUri).Cop
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,但这带来了其他内容,如图像元数据,但没有起作用。您在System.Drawing中使用过ImageConverter类吗 你可以做一些类似的事情
private byte[] GetImageBytes(Uri imageUri)
{
ImageConverter ic = new ImageConverter();
return (byte[])ic.ConvertTo(imageUri, typeof(byte[]));
}
在System.Drawing中的ImageConverter类或类似类中可能存在一些与复制像素相关的方法。Drawing您是否在System.Drawing中使用过ImageConverter类 你可以做一些类似的事情
private byte[] GetImageBytes(Uri imageUri)
{
ImageConverter ic = new ImageConverter();
return (byte[])ic.ConvertTo(imageUri, typeof(byte[]));
}
可能有一些方法与在ImageConverter类或系统中的类似类中复制像素有关。Drawing您是否考虑过只将图像加载到CachedBitmap中,而不使用自己的缓存机制
您是否考虑过只将图像加载到CachedBitmap中,而不使用自己的缓存机制
我将回答我自己的问题,以防其他人发现它有用: 我最初希望将数据读入字节数组的原因是,我可以在后台线程上执行文件或网络IO。但我后来了解了冻结方法,它允许在后台线程上读取图像,然后跨线程共享
因此,如果我冻结位图图像,将数据临时存储在字节[]中的动力就消失了,问题就解决了。我将回答我自己的问题,以防其他人发现它有用: 我最初希望将数据读入字节数组的原因是,我可以在后台线程上执行文件或网络IO。但我后来了解了冻结方法,它允许在后台线程上读取图像,然后跨线程共享
因此,如果我冻结位图图像,将数据临时存储在字节[]中的动力就消失了,问题就解决了。在.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[]));
在.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[]));
不,不幸的是,这不起作用。它抛出一个InvalidCastException。不,不幸的是,这不起作用。它抛出一个InvalidCastException。我将它们读取到一个字节数组,然后再从中生成一个图像的原因是,图像需要在主UI线程上创建,但我想在后台线程上获取图像数据,因为它们是通过网络传入的,我不想占用获取数据的UI线程。我看不到从CachedBitmap创建新位图源的方法,所以我仍然需要创建CachedBitmap,将像素复制到数组中,然后从中创建新图像。CachedBitmap是BitmapSourceRight。。。也许我不明白你的答案。我的目标是对图像进行一些内存表示,然后我可以使用这些表示创建真实的图像,即稍后显示的图像。关键是显示的图像不能与I/O同时创建,我正在寻找一种方便有效的方法,在I/O读取时将数据放入内存。CachedBitmap如何帮助我?您应该能够创建CachedBitmap而不显示它。在需要开始加载数据时创建它。当您想向用户显示图像时,可以显示已创建的位图。i、 e.只要让你的GetImageFunction返回一个CachedBitmap,当我有时间时,我会创建一个代码示例。我将它们读取到一个字节数组,然后用它生成一个图像的原因是,图像需要在主UI线程上创建,但我想在后台线程上获取图像数据,因为它们是通过网络传入的,我不想占用获取数据的UI线程。我看不到从CachedBitmap创建新位图源的方法,所以我仍然需要创建CachedBitmap,将像素复制到数组中,然后从中创建新图像。CachedBitmap是BitmapSourceRight。。。也许我不明白你的答案。我的目标是对图像进行一些内存表示,然后我可以使用这些表示创建真实的图像,即稍后显示的图像。关键是显示的图像不能与I/O同时创建,我正在寻找一种方便有效的方法,在I/O读取时将数据放入内存。CachedBitmap如何帮助我?您应该能够创建CachedBitmap而不显示它。在需要开始加载数据时创建它。当您要向用户显示图像时 用户可以显示已创建的位图。i、 只要让你的GetImageFunction返回一个CachedBitmap,当我有时间的时候,我会创建一个代码示例。