通过 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
没有修复它?
- 我是否遗漏了 D2D 示例代码正在做的事情?
- 我是不是漏掉了 SharpDX 的一些技巧?
- 这是 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 甚至在此之前就失败了。
相应地扩展了使用范围并修复了它。
我正在使用 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
没有修复它?
- 我是否遗漏了 D2D 示例代码正在做的事情?
- 我是不是漏掉了 SharpDX 的一些技巧?
- 这是 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 甚至在此之前就失败了。
相应地扩展了使用范围并修复了它。