代码之家  ›  专栏  ›  技术社区  ›  Hank

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

  •  2
  • Hank  · 技术社区  · 14 年前

    我正在尝试将图像文件中的像素数据作为 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 ;
    }
    

    我想知道是否有人知道 字节[] 数据而不是 BitmapImage 然后复制所有字节。例如,是否有一个.NET类只从文件中传输像素数据?(我最初使用 File.ReadAllBytes ,但这带来了其他东西,比如图像元数据,但没有解决。)

    4 回复  |  直到 8 年前
        1
  •  0
  •   Darryl Braaten    14 年前

    是否考虑将图像加载到cachedbitmap而不是使用自己的缓存机制?

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

        2
  •  0
  •   Hank    14 年前

    我会回答我自己的问题,以防其他人发现它有用:

    我最初想将数据读取到字节数组中的原因是为了在后台线程上执行文件或网络IO。但从那以后我就知道了 Freeze() 方法,它允许在后台线程上读取图像,然后在线程间共享。

    所以如果我冻结 BitmapImage 将数据临时存储在 byte[] 走了,问题解决了。

        3
  •  0
  •   JasonMArcher TWE    9 年前

    在.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[]));
    
        4
  •  0
  •   Mats Fredriksson    8 年前

    你玩过System.Drawing中的ImageConverter类吗?

    你可能会做一些像

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

    可能有一些方法与在ImageConverter类或在System.Drawing中的类似类中复制像素有关。