Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将.dds转换为.png:XNA真的这么复杂吗?_C#_Xna_Png_Image Conversion - Fatal编程技术网

C# 将.dds转换为.png: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

我有一个.dds文件,我想要一个.png文件。虽然我已经知道了,但是一个静态类的API设计并没有并行化,所以我希望找到另一种方法。这让我想到了XNA

但是,这就是我对这个想法的理解程度

  • 好的,看起来我想要这个
    Texture2D
    类;然后我可以调用
    myTexture2D.SaveAsPng
  • 但是如何从.dds文件中获取其中一个呢?文档似乎表明我想使用
    myContentManager.Load
  • 哦,糟了,那不是,那是某种游戏内容管理系统。嗯,我的搜索似乎发现了很多使用
    myTexture2D.LoadFile
    ;我会同意的
  • 呃,我是不是错过了一个集会的参考资料?哦,不,我明白了,他们在3.1和4.0之间删除了这个方法,太棒了。好吧,这有点烦人,但是
    myTexture2D.LoadStream
    并不是一个真正的问题
  • 等等,这是什么?它需要一个
    图形设备
    ?嗯,看起来人们通常通过
    GraphicsDeviceManager
    获取其中一个。。。哦,等等,我再也不走那条路了,我再也没有
    Manager
    s了
  • 我想我应该手动实例化这个东西。好吧,这并不难
    var myGraphicsDevice=new GraphicsDevice(GraphicsAdapter.DefaultAdapter,GraphicsProfile.HiDef,
    (哦,这是什么?
    PresentationParameters
    好吧,我试试
    new PresentationParameters());
  • 这引发了一个异常。他们希望在我的
    PresentationParameters
    中有一个
    DeviceWindowHandle
    但我正在运行一个控制台应用程序!!
所以我真的希望有一种不那么复杂的方法来实现这一点;也许我可以使用某种默认的
GraphicsDevice
。仅仅为了将.dds转换为.png而创建一个完整的窗口感觉非常愚蠢

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

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

  • 数据类型转换不是XNA的常见场景。它希望通过内容管道对所有资产进行预处理
  • XNA希望图形设备经常出现,而无窗口应用程序超出了XNAs的范围
在我看来,你在工作中使用了错误的工具,尽管我无法说出除DevIL之外的另一个工具,而DevIL已经被你解雇了。

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

  • 数据类型转换不是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中测试过它,但我怀疑它只需很少或根本没有修改就可以工作