【发布时间】:2018-08-05 13:40:28
【问题描述】:
我正在尝试使用 WIC 在 C# 中加载图像,并将 SharpDX 作为包装器(这是一个用 .NET 编写的 Direct2D 应用程序)。我可以通过像这样创建BitmapDecoder 来完美加载我的图像:
C# 代码:
new BitmapDecoder(Factory, fileName, NativeFileAccess.Read, DecodeOptions.CacheOnLoad)
C++ 等效项:
hr = m_pIWICFactory->CreateDecoderFromFilename(
fileName,
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnLoad,
&pIDecoder);
顺便说一句,fileName 包含 JPEG 图像的路径。现在,这工作得很好,但如果我尝试使用流加载图像,它就会崩溃:
C# 代码:
new BitmapDecoder(Factory, stream, DecodeOptions.CacheOnLoad)
C++ 等效项:
hr = m_pIWICFactory->CreateDecoderFromStream(
pIWICStream,
NULL,
WICDecodeMetadataCacheOnLoad,
&pIDecoder);
这与 JPEG 文件中的数据实际上是相同的,并且它在大多数情况下的工作方式与之前的方式一样。但是当我打电话给SharpDX.Direct2D1.Bitmap.FromWicBitmap() (ID2D1RenderTarget::CreateBitmapFromWicBitmap) 时它会中断。前一种方法完美无缺,而后一种方法导致此函数返回 HRESULT 0x88982F60 (WINCODEC_ERR_BADIMAGE)。
需要明确的是:除了从流而不是文件名加载图像之外,图像的加载方式没有区别。
为什么会发生这种情况,我该如何解决?我需要能够加载我只能作为流访问的图像,并且我不想将它们保存到临时文件中来实现这一点。
【问题讨论】:
-
旁注:有区别 - 与您使用
CacheOnLoad加载的文件和使用CacheOnDemand的流加载。 -
@Evk 这是一个错误,它们在我的代码中是一样的。