【问题标题】:Crash of BitmapDecoder when processing DDS files处理 DDS 文件时 BitmapDecoder 崩溃
【发布时间】:2017-05-10 15:30:17
【问题描述】:

我想在朋友的计算机上测试我的应用程序,以检查我的工作是否在其他人的计算机上运行。 (我是否包含了所有库?等等)

但是,当我加载 *.dds 纹理时,我的应用程序崩溃了。我在场景的 2D 背景中使用它们。这是我用来加载 DDS 纹理并将它们转换为位图的代码:

using (SharpDX.WIC.BitmapDecoder bitmapDecoder = new SharpDX.WIC.BitmapDecoder(ImagingFactory, new MemoryStream(iconInfo.Data, false), SharpDX.WIC.DecodeOptions.CacheOnDemand))
{
    using (SharpDX.WIC.FormatConverter formatConverter = new SharpDX.WIC.FormatConverter(ImagingFactory))
    {
        formatConverter.Initialize(bitmapDecoder.GetFrame(0), SharpDX.WIC.PixelFormat.Format32bppPRGBA, SharpDX.WIC.BitmapDitherType.None, null, 0.0, SharpDX.WIC.BitmapPaletteType.Custom);

        SharpDX.DataStream dataStream = new SharpDX.DataStream(formatConverter.Size.Height * formatConverter.Size.Width * 4, true, true);
        formatConverter.CopyPixels(formatConverter.Size.Width * 4, dataStream);

        _icons.Add(iconInfo.Name, new SharpDX.Direct2D1.Bitmap(renderTarget, new SharpDX.Size2(formatConverter.Size.Width, formatConverter.Size.Height), dataStream,
            formatConverter.Size.Width * 4, bitmapProperties));
    }
}

“iconInfo.Data”是 DDS 纹理的数据字节。

抛出的异常是

SharpDX.SharpDXException: HRESULT: [0x88982F50], Module: [SharpDX.WIC], ApiCode: [WINCODEC_ERR_COMPONENTNOTFOUND/Componentnotfound], Message: Unknown
   at SharpDX.Result.CheckError()
   at SharpDX.WIC.ImagingFactory.CreateDecoderFromStream_(IntPtr streamRef, Nullable`1 guidVendorRef, DecodeOptions metadataOptions, BitmapDecoder decoderOut)
   at SharpDX.WIC.BitmapDecoder..ctor(ImagingFactory factory, Stream streamRef, DecodeOptions metadataOptions)

您知道导致问题的原因吗?

【问题讨论】:

  • 没有想法?没有人? :'-(
  • WINCODEC_ERR_COMPONENTNOTFOUND 表示您已尝试解码图像但未安装合适的编解码器。您在哪个版本的 Windows 上进行测试?您可以在 Windows 照片查看器中打开 DDS 文件吗?
  • 在我的机器上(Win10 包括所有更新)一切都很好。我的朋友使用“Microsoft Windows 7 Home Premium, 64-Bit, Version 6.1.7601”在他的电脑上测试了我的游戏。

标签: bitmap textures bitmapfactory sharpdx wic


【解决方案1】:

DDS 文件的 WIC 编解码器有许多重要限制。首先,它仅包含在 Windows 8.1 或更高版本中。其次,它只支持 BC1/BC2/BC3(又名 DXT1-DXT5)格式。见MSDN

一般来说,最好使用专门的 DDS 纹理加载器。

【讨论】:

  • 我使用名为 Compressonator 的工具将所有纹理从 *.png 转换为 *.dds BC3。在此更改后加载纹理时,我的速度提高了 95%。我为模型纹理编写了一个 DDS-Importer,但我将这种方法用于 UI 纹理。你能推荐一个装载机吗?
猜你喜欢
  • 2018-06-13
  • 2015-04-10
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2021-05-16
  • 2010-12-29
  • 2019-01-19
相关资源
最近更新 更多