通过 SharpDX 加载 Tiff CCITTv4 时出现 BadImage 错误。Direct2D1.Bitmap.FromWicBitmap

BadImage Error When Loading Tiff CCITTv4 Via SharpDX.Direct2D1.Bitmap.FromWicBitmap

我正在使用 SharpDX 及其附带的 WIC 和 Direct2D 包装器来进行一些服务器端图像处理。

以下代码适用于 JPEG 图像,并且是根据 SharpDX 文档和 this Microsoft sample using D2D directly via C++.

建模的

但是,当我尝试加载 TIFF CCITT(双色 1bpp)图像时出现 BadImage 错误。 BadImage 错误仅在 EndDraw 处抛出(稍后在注释的 DrawEndorsement 函数中发生),或者在我插入的这行代码中问题出现的点更明显:

SharpDX.Direct2D1.Bitmap bitmap = SharpDX.Direct2D1.Bitmap.FromWicBitmap(_renderTarget, _wicBitmap);

我传入的 JPEG 图像到达这一点并继续没有问题,但我传入的 TIFF 到达这一点并导致 FromWicBitmap 呕吐并出现 BadImage 错误。

我正在使用 FormatConverter 将 TIFF/JPEG 像素格式转换为适当且受支持的 D2D 像素格式,并且转换器确实更改了两个图像的像素格式 GUID,但是,同样, FromWicBitmap 只在 TIFF 上呕吐。

我以为我在转换或滥用 SharpDX/D2D 时做错了什么,但是当我构建并 运行 上述 Microsoft C++ D2D 图像查看器示例时,它加载并渲染了这个 same 没有错误的 TIFF 文件。我仔细检查了样本的代码,以验证我使用的是所有相同的像素格式、选项等,看起来我对 SharpDX 所做的事情与样本直接对 D2D 所做的几乎完全相同。

显然 Direct2D 不喜欢 WIC 提供给它的 TIFF 图像的像素格式,但为什么 MS 示例没有表现出相同的行为,为什么 FormatConverter 没有修复它?

  1. 我是否遗漏了 D2D 示例代码正在做的事情?
  2. 我是不是漏掉了 SharpDX 的一些技巧?
  3. 这是 SharpDX 的错误吗?

谢谢!

public byte[] BuildImage(byte[] image, Format saveFormat)
{
    SharpDX.WIC.Bitmap _wicBitmap;
    WicRenderTarget _renderTarget;
    BitmapFrameDecode bSource;
    FormatConverter converter = new FormatConverter(_factoryManager.WicFactory);


    using (MemoryStream systemStream = new MemoryStream(image))
        using (WICStream wicStream = new WICStream(_factoryManager.WicFactory, systemStream))
        {
            BitmapDecoder inDecoder = new BitmapDecoder(_factoryManager.WicFactory, wicStream, DecodeOptions.CacheOnLoad);
            if (inDecoder.FrameCount > 0)
            {
                bSource = inDecoder.GetFrame(0);
                converter.Initialize(bSource, SharpDX.WIC.PixelFormat.Format32bppPRGBA, BitmapDitherType.Solid, null, 0.0f, BitmapPaletteType.MedianCut);
                _imageWidth = bSource.Size.Width;
                _imageHeight = bSource.Size.Height;

            }
            else
            {
                throw new Exception("No frames found!");
            }
        }

    _wicBitmap = new SharpDX.WIC.Bitmap(
            _factoryManager.WicFactory,
            converter,
            BitmapCreateCacheOption.CacheOnDemand
            );

    _renderTarget = new WicRenderTarget(_factoryManager.D2DFactory, _wicBitmap, new RenderTargetProperties());

    SharpDX.Direct2D1.Bitmap bitmap = SharpDX.Direct2D1.Bitmap.FromWicBitmap(_renderTarget, _wicBitmap);

    //DrawEndorsement(_renderTarget);

    _renderTarget.Dispose();
    bSource.Dispose();
    converter.Dispose();

    return SaveImage(saveFormat, _wicBitmap);
}

正如 xoofx 所指出的,事实证明这是由于我在 FormatConverter 仍在使用时处理了 WIC/MemoryStreams 造成的。

这导致 JPEG 在写入时损坏,并且奇怪地导致 TIFF 甚至在此之前就失败了。

相应地扩展了使用范围并修复了它。