1

有没有办法BitmapImage使用 c# 指针访问对象的底层内存?

我知道有一种CopyPixels方法,但它将像素数组的副本复制到一个新数组中(复制内存要求)。如果您打开一个大图像(2gb),它会分配很多无用的东西。如果你想操作某种精细化,比如 CCLA,它需要大量的内存。

我只需要读取像素阵列。

是否可以像在 中那样直接寻址像素System.Drawing.Bitmap

System.Drawing.BitmapBitmapSource. 否则我必须复制图像加载(我的旧方法的位图并BitmapSource在 WPF 中显示图像)占用大量内存和时间。

谢谢洛伦佐

4

1 回答 1

2

位图源不一定具有整个图像的后备内存。一个例子是磁盘上延迟加载的图像文件。

您对 WIC 以及 WPF 的唯一访问权限是CopyPixels方法。的某些子类BitmapSource将允许访问缓冲区,但它们在内部只是分配内存并调用CopyPixels自己。

我会假设任何操作都不需要一次访问整个图像。如果是这样,您可以调用CopyPixels一个较小的缓冲区,并窗口化您对图像的访问。大多数解码器,当请求单个像素时,将缓冲整个步幅,或者在 JPEG 的情况下,然后是整个块。

我不确定 CCLA 是什么,也找不到似乎合适的定义,但如果它是对源图像的某种变换,您可以将其实现为BitmapSource. 这样,您可以组成一个完整的链,它将

仔细注意CacheOption源图像上的使用以及转换的顺序,您应该能够访问任意大的图像而不会显着影响内存。

如果您已经有了 GDI ( System.Drawing) 的高性能算法,那么重新实现它是没有意义的。您仍然可以使用Imaging.CreateBitmapSourceFromHBitmap或使用 a来显示您的最终位图WindowsFormsHost来承载您之前构建的控件。

于 2014-01-26T17:16:53.230 回答