1

我有一个 .dds 文件,我想要一个 .png 文件。虽然我已经了解DevIL.NET 库,但是那里的一个静态类的 API 设计并没有并行化,所以我希望找到另一种方法。这使我选择了 XNA。

但是,这就是我对这个想法的了解......

  • 好的,看起来我想要这Texture2D门课;然后我可以打电话myTexture2D.SaveAsPng
  • 但是如何从我的 .dds 文件中获取其中之一呢?那么文档似乎表明我想使用myContentManager.Load<Texture2D>.
  • 哦,废话,不是它,那是某种游戏内容管理系统。好吧,我的搜索似乎发现了很多myTexture2D.LoadFile; 我会去的。
  • 呃,我错过了程序集参考还是什么?哦不,我明白了,他们在 3.1 和 4.0 之间删除了该方法,太棒了。好吧,好吧,这有点烦人,但myTexture2D.LoadStream不是真正的问题。
  • 等等这是什么?它想要一个GraphicsDevice? 嗯,看起来人们通常会通过GraphicsDeviceManager……哦等等,我不会再走那条路了,Manager对我来说没有更多的东西了。
  • 我想我应该手动实例化这个东西。好吧,这不是太难...... var myGraphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.HiDef,(呃哦这是什么PresentationParameters东西好吧好吧我试试new PresentationParameters());
  • 好吧,这引发了异常。他们想要……DeviceWindowHandle在我的PresentationParameters但我正在运行一个控制台应用程序!

所以我真的希望有一种不那么复杂的方式来做到这一点;GraphicsDevice也许我可以使用某种默认值。创建一个完整的窗口只是为了将.dds转换为.png感觉很傻。

我想,欢迎对我的转换问题提出替代建议,尽管一般来说了解如何从非 XNA 代码中使用 XNA 可能是值得的。

4

2 回答 2

4

如果您有一个需要创建 XNA 图形设备的命令行应用程序,那么这个答案中的代码应该会有所帮助。

简而言之,您需要WinForms 示例中的一些类,以避免在创建图形设备服务等(特别是类ServiceContainerGraphicsDeviceService)时遇到麻烦。

然后你可以这样做:

Form form = new Form(); // Dummy form for creating a graphics device
GraphicsDeviceService gds = GraphicsDeviceService.AddRef(form.Handle,
        form.ClientSize.Width, form.ClientSize.Height);

ServiceContainer services = new ServiceContainer();
services.AddService<IGraphicsDeviceService>(gds);
content = new ContentManager(services, "Content");

Tada - 现在你有了一个ContentManager可以用来加载东西的工作。我相信您也应该能够GraphicsDeviceGraphicsDeviceService.

您创建的表单永远不会显示。记得System.Windows.Forms.dll在你的项目中引用。

免责声明:这是为 XNA 3.1 编写的。我还没有在 4.0 中测试过它,但我怀疑它几乎不需要修改就可以工作。

于 2010-10-04T10:05:25.710 回答
3

从我的头顶(有一段时间没有使用XNA):

  • 数据类型的转换不是 XNA 的常见场景。它希望通过内容管道对所有资产进行预处理。
  • XNA 经常需要图形设备,无窗口应用程序超出了 XNA 的范围。

在我看来,您使用了错误的工具来完成这项工作,尽管除了 DevIL,我无法告诉另一个人,您已经解雇了它。

于 2010-10-03T09:02:26.120 回答