我有一个第三方dll生成一个Bitmap并发回它的引用.如果我立即生成一个System.Windows.Media.Imaging.BitmapSource,那么一切顺利.但是如果我保存引用并稍后(几秒钟之后和许多函数调用)我尝试生成Bitmapsource,我得到
用户代码未处理System.AccessViolationException
消息=尝试读取或写入受保护的内存.这通常表明其他内存已损坏.来源= "System.Drawing中"
做的时候:
System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bmp.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
Run Code Online (Sandbox Code Playgroud)
关于这里出错的任何线索?任何指针都会很有用.谢谢.
我在位图和访问冲突方面也遇到了大问题。我相信正在发生的事情是某些位图构造函数在不应该打开文件句柄的情况下将文件句柄打开。因此,您正在运行的程序会检测到这些文件正在使用,而实际上它们不应该使用。
我最终找到了一个解决方案,即复制原始位图,然后处理原始位图。这是我的代码,它保留了原始位图的分辨率:
Bitmap Temp = new Bitmap(inFullPathName);
Bitmap Copy = new Bitmap(Temp.Width, Temp.Height);
Copy.SetResolution(Temp.HorizontalResolution, Temp.VerticalResolution);
using (Graphics g = Graphics.FromImage(Copy))
{
g.DrawImageUnscaled(Temp, 0, 0);
}
Temp.Dispose();
return Copy;
Run Code Online (Sandbox Code Playgroud)
显然,对于第一行,您的应该是 Bitmap Temp = MyThirdPartyDLL.GetBitmap(); 或者其他的东西。如果你不关心分辨率,可以简化为:
Bitmap Temp = MyThirdPartyDLL.GetBitmap();
Bitmap Copy = new Bitmap(Temp, Temp.Width, Temp.Height);
Temp.Dispose();
return Copy;
Run Code Online (Sandbox Code Playgroud)
进行此更改后,我能够执行各种文件 I/O 等,非常好,希望您也能这样做。
| 归档时间: |
|
| 查看次数: |
2011 次 |
| 最近记录: |