有没有办法用c#指针访问BitmapImage
对象的底层内存?
我知道有一个CopyPixels
方法,但它会将像素数组的副本复制到一个新数组中(复制内存要求)。如果你打开一个大图像(2gb),它会分配很多无用的东西。如果你想进行某种细化,比如CCLA,它需要大量的内存。
我只需要读取像素阵列。
是否可以像System.Drawing.Bitmap
中那样直接处理像素?
我为System.Drawing.Bitmap
写了一个快速位图访问,但是当我使用WPF时,我需要BitmapSource
的相同功能。否则我必须复制图像加载(我的旧方法的位图和BitmapSource
以在WPF中显示图像)需要大量的内存和时间。
谢谢 洛伦佐
答案 0 :(得分:1)
位图源不一定具有整个图像的后备内存。例如,它不是磁盘上的图像文件,它是延迟加载的。
您对WIC以及WPF的唯一访问权限是CopyPixels
方法。某些BitmapSource
的子类将允许访问缓冲区,但它们在内部只是分配内存并自己调用CopyPixels
。
我认为无论什么操作都不需要一次访问整个图像。如果是这样,您可以将CopyPixels
调用到较小的缓冲区,并停止对图像的访问。当请求单个像素时,大多数解码器将缓冲整个步幅,或者在JPEG的情况下缓冲整个块。
我不确定CCLA是什么,并且找不到合适的定义,但如果它是源图像的某种变换,则可以将其实现为BitmapSource
。这样,你可以compose a full chain
TiffBitmapEncoder
等)TransformedBitmap
)CroppedBitmap
)FormatConvertedBitmap
)CclaTransformBitmap
) WritableBitmap
,which gives you access to the buffer 仔细关注源图像上使用的CacheOption
以及变换的顺序,您应该能够访问任意大的图像而不会对内存造成重大影响。
如果您已经拥有GDI(System.Drawing
)的高性能算法,那么重新实现它是没有意义的。您仍然可以使用Imaging.CreateBitmapSourceFromHBitmap
或使用WindowsFormsHost
来托管您之前构建的控件来显示最终位图。