【发布时间】:2011-04-24 20:01:03
【问题描述】:
我想在 WPF 应用程序中对图像进行一些处理。但是,我想在运行时修改内存中 BitmapSource 的像素。
我目前正在设法使用针对老式 System.Drawing.Bitmap 的“不安全”代码来执行此操作,并且它可以完成一项工作(锁定工作区域,摆弄像素)。这篇文章中描述了该方法:http://blogs.msdn.com/b/ericgu/archive/2007/06/20/lost-column-2-unsafe-image-processing.aspx
为了让它在 WPF 中工作,我使用这种方法创建了一个 WPF BitmapSource:
BitmapSource destination;
IntPtr hBitmap = bitmap.GetHbitmap();
BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions();
destination = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions);
destination.Freeze();
return destination;
但是,这会在内存中创建大量副本,我真的很想进入那里并摆弄 BitmapSource 中的底层位,就像 EricGu 在 Bitmap 示例中显示的那样。这可能吗?
我知道 PixelShaders 可能可以做到这一点,但这是一个涉及多个线程的学术练习(在不安全模式下编辑位图时支持)。
提前致谢
【问题讨论】:
-
我在另一台机器上有一些很好的代码。如果你在几个小时内没有得到回复,我会抓住它。我相信我虽然使用了 BitmapImage。它派生自 BitmapSource。我不记得了,但我有一种感觉,你总是需要将它转换为位图。不过,还有更优雅的转换方式。
标签: c# wpf bitmap imaging bitmapsource