使用指针进行BitmapSource访问

时间:2014-01-26 16:22:55

标签: c# wpf image-processing bitmap bitmapsource

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

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

我只需要读取像素阵列。

是否可以像System.Drawing.Bitmap中那样直接处理像素?

我为System.Drawing.Bitmap写了一个快速位图访问,但是当我使用WPF时,我需要BitmapSource的相同功能。否则我必须复制图像加载(我的旧方法的位图和BitmapSource以在WPF中显示图像)需要大量的内存和时间。

谢谢 洛伦佐

1 个答案:

答案 0 :(得分:1)

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

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

我认为无论什么操作都不需要一次访问整个图像。如果是这样,您可以将CopyPixels调用到较小的缓冲区,并停止对图像的访问。当请求单个像素时,大多数解码器将缓冲整个步幅,或者在JPEG的情况下缓冲整个块。

我不确定CCLA是什么,并且找不到合适的定义,但如果它是源图像的某种变换,则可以将其实现为BitmapSource。这样,你可以compose a full chain

仔细关注源图像上使用的CacheOption以及变换的顺序,您应该能够访问任意大的图像而不会对内存造成重大影响。

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