【问题标题】:Load Bitmap into memory in Unity using System.Drawing使用 System.Drawing 将位图加载到 Unity 中的内存中
【发布时间】:2020-05-22 17:04:31
【问题描述】:

使用 Unity 2017.4.33f1-Personal。

我正在尝试使用 System.Drawing 命名空间中的 Image.FromFile 方法在游戏对象的逻辑中加载位图。请注意,我对将此 bmp 保存为资产或类似的东西不感兴趣。我只是想把它加载到我可以做一些计算的 RAM 中。我尝试了以下方法:

var result = Image.FromFile(
    AssetDatabase.GetAssetPath(mainImg)
) as Bitmap;

但我收到以下错误:

InvalidProgramException: Invalid IL code in System.Drawing.Image:FromFile (string): IL_0000: ret    

仅供参考,

  • mainImg 是对 Texture2D 资源的引用
  • AssetDatabase.GetAssetPath(mainImg) 解析为 Assets/CustomPackages/SeededConstruction/PuzzleBuilder/Input/main.bmp

我还尝试了许多其他愚蠢的事情,包括获取绝对路径和用反斜杠替换正斜杠,如下所示:

var result = Image.FromFile(    
    Directory.GetCurrentDirectory() 
    + "\\" 
    + AssetDatabase.GetAssetPath(mainTileset)
    .Replace('/', '\\')
) as Bitmap;

在这种情况下,路径解析为D:\_Projects\2dGenerator\PlatformGeneration\Assets\CustomPackages\SeededConstruction\PuzzleBuilder\Input\main.bmp。但是,这会返回与上述相同的错误。

我在这里做错了什么?看起来这种方法在普通的 .Net 应用程序中运行良好,为什么在 Unity 中不行?

【问题讨论】:

  • 在 Unity 中开始使用 System.Drawing 并不是一个好主意。相反,使用它的(非常广泛和强大的)纹理工具。见docs.unity3d.com/ScriptReference/ImageConversion.LoadImage.html
  • 无效的 IL 代码意味着 .Net 引擎本身无法解析您调用的任何函数。这就像灾难性的糟糕程度。它与路径或其他无关,您尝试执行的 .Net 程序集无效。
  • @3Dave 嗯,有道理。稍微改变一下这个问题,如果我有使用 System.Drawing 的 .dll 并且我想从 GameObject 调用这个 .dll,我有什么选择?
  • 程序集需要针对您的 Unity 应用程序使用的相同框架和版本构建。但是,我没有看到任何使用 System.Drawing 的 Unity 标题,因为通常没有理由这样做。如果这是第三方程序集,我会问它提供的哪些功能尚不可用。
  • 我不知道为什么这个问题被否决了。如果投反对票的人再次出现,请就您投反对票的原因留下一些反馈。

标签: c# unity3d


【解决方案1】:

事实证明这不是任何类型的文件路径问题。为了在 Unity 2017.4.33f1-Personal 中正确引用 System.Drawing,我采取了以下步骤:

  1. 转到编辑 -> 项目设置 -> 播放器。将 API 兼容性级别从 .NET 2.0 子集更改为 .NET 2.0。
  2. mcs.rsp 添加到我的统一项目根资源文件夹中。在文本编辑器中打开它,在第一行输入:-r:System.Drawing.dll。保存。
  3. 关闭并重新打开 Unity。

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 2019-09-22
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    相关资源
    最近更新 更多