Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从.NET中的图像文件读取像素数据_.net_Image_Streaming_Bitmap - Fatal编程技术网

从.NET中的图像文件读取像素数据

从.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

我试图从图像文件中读取像素数据作为字节[],以便在内存中存储。字节数组稍后将被馈送到位图图像对象,但我希望内存中的数据不会出现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,但这带来了其他内容,如图像元数据,但没有起作用。

您在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,当我有时间的时候,我会创建一个代码示例。