C# 将.dds转换为.png:XNA真的这么复杂吗?
我有一个.dds文件,我想要一个.png文件。虽然我已经知道了,但是一个静态类的API设计并没有并行化,所以我希望找到另一种方法。这让我想到了XNA 但是,这就是我对这个想法的理解程度C# 将.dds转换为.png:XNA真的这么复杂吗?,c#,xna,png,image-conversion,C#,Xna,Png,Image Conversion,我有一个.dds文件,我想要一个.png文件。虽然我已经知道了,但是一个静态类的API设计并没有并行化,所以我希望找到另一种方法。这让我想到了XNA 但是,这就是我对这个想法的理解程度 好的,看起来我想要这个Texture2D类;然后我可以调用myTexture2D.SaveAsPng 但是如何从.dds文件中获取其中一个呢?文档似乎表明我想使用myContentManager.Load 哦,糟了,那不是,那是某种游戏内容管理系统。嗯,我的搜索似乎发现了很多使用myTexture2D.Load
- 好的,看起来我想要这个
类;然后我可以调用Texture2D
myTexture2D.SaveAsPng
- 但是如何从.dds文件中获取其中一个呢?文档似乎表明我想使用
myContentManager.Load
- 哦,糟了,那不是,那是某种游戏内容管理系统。嗯,我的搜索似乎发现了很多使用
;我会同意的myTexture2D.LoadFile
- 呃,我是不是错过了一个集会的参考资料?哦,不,我明白了,他们在3.1和4.0之间删除了这个方法,太棒了。好吧,这有点烦人,但是
并不是一个真正的问题myTexture2D.LoadStream
- 等等,这是什么?它需要一个
?嗯,看起来人们通常通过图形设备
获取其中一个。。。哦,等等,我再也不走那条路了,我再也没有GraphicsDeviceManager
s了Manager
- 我想我应该手动实例化这个东西。好吧,这并不难
(哦,这是什么?var myGraphicsDevice=new GraphicsDevice(GraphicsAdapter.DefaultAdapter,GraphicsProfile.HiDef,
好吧,我试试PresentationParameters
new PresentationParameters());
- 这引发了一个异常。他们希望在我的
中有一个PresentationParameters
?但我正在运行一个控制台应用程序!!DeviceWindowHandle
GraphicsDevice
。仅仅为了将.dds转换为.png而创建一个完整的窗口感觉非常愚蠢
我想,对于我的转换问题,欢迎您提出其他建议,尽管一般来说,了解如何从非XNA代码中使用XNA可能是值得的。从我的头脑中(有一段时间没有使用XNA):
- 数据类型转换不是XNA的常见场景。它希望通过内容管道对所有资产进行预处理
- XNA希望图形设备经常出现,而无窗口应用程序超出了XNAs的范围
- 数据类型转换不是XNA的常见场景。它希望通过内容管道对所有资产进行预处理
- XNA希望图形设备经常出现,而无窗口应用程序超出了XNAs的范围
在我看来,你使用了错误的工具来完成这项工作,尽管我无法说出除DevIL之外的另一个工具,因为你已经拒绝了它。如果你有一个命令行应用程序需要创建XNA图形设备,中的代码应该会有所帮助 简而言之,您需要中的一些类来避免创建图形设备服务等等(特别是类
ServiceContainer
和GraphicsDeviceService
)
然后你可以这样做:
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");
Form Form=new Form();//用于创建图形设备的虚拟表单
GraphicsDeviceService gds=GraphicsDeviceService.AddRef(form.Handle,
form.ClientSize.Width、form.ClientSize.Height);
ServiceContainer服务=新ServiceContainer();
服务。添加服务(gds);
内容=新的ContentManager(服务,“内容”);
Tada-现在你有了一个可以工作的ContentManager
,你可以用它来加载东西。我相信你也应该能够从GraphicsDeviceService
获得实际的GraphicsDevice
您创建的表单永远不会显示。请记住在项目中引用System.Windows.Forms.dll
免责声明:这是为XNA 3.1编写的。我还没有在4.0中测试过它,但我怀疑它只需很少修改或不做任何修改即可工作。如果您有一个需要创建XNA图形设备的命令行应用程序,中的代码应该会有所帮助 简而言之,您需要中的一些类来避免创建图形设备服务等等(特别是类
ServiceContainer
和GraphicsDeviceService
)
然后你可以这样做:
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");
Form Form=new Form();//用于创建图形设备的虚拟表单
GraphicsDeviceService gds=GraphicsDeviceService.AddRef(form.Handle,
form.ClientSize.Width、form.ClientSize.Height);
ServiceContainer服务=新ServiceContainer();
服务。添加服务(gds);
内容=新的ContentManager(服务,“内容”);
Tada-现在你有了一个可以工作的ContentManager
,你可以用它来加载东西。我相信你也应该能够从GraphicsDeviceService
获得实际的GraphicsDevice
您创建的表单永远不会显示。请记住在项目中引用System.Windows.Forms.dll
免责声明:这是为XNA3.1编写的。我还没有在4.0中测试过它,但我怀疑它只需很少或根本没有修改就可以工作