是什么原因导致IWICBitmapFrameEncode :: SetPixelFormat返回与请求的格式不同的格式?

时间:2013-07-17 23:06:38

标签: c++ encoding wic jpeg-xr

我一直在使用WIC将多个图像编码为JPEGXR格式。 有时,我的程序会在我的编码功能的以下片段中记录最后一个LogAssert的错误。

hr = m_pFactory->CreateEncoder(GUID_ContainerFormatWmp, NULL, &pEncoder);
LogAssert(SUCCEEDED(hr),"Failed to create encoder. Err: 0x%x", hr);

hr = pEncoder->Initialize(pOutputStream, WICBitmapEncoderNoCache);
LogAssert(SUCCEEDED(hr),"Failed to initialize encoder. Err: 0x%x", hr);

hr = pEncoder->CreateNewFrame(&pBitmapFrame, &pPropertyBag);
LogAssert(SUCCEEDED(hr),"Encoder failed to create new frame. Err: 0x%x", hr);

SetEncodingProperties(pPropertyBag);

hr = pBitmapFrame->Initialize(pPropertyBag);
LogAssert(SUCCEEDED(hr),"Failed to initialize pBitmapFrame with the given properties. Err: 0x%x", hr);

hr = pBitmapFrame->SetSize(rawWidth, rawHeight);
LogAssert(SUCCEEDED(hr),"Failed to set bitmap size. Err: 0x%x", hr);

WICPixelFormatGUID formatGUID = GUID_WICPixelFormat24bppBGR;
hr = pBitmapFrame->SetPixelFormat(&formatGUID);
if(FAILED(hr) || !IsEqualGUID(formatGUID, GUID_WICPixelFormat24bppBGR))
{ 
    LogAssert(false,"Failed to set pixel format to GUID_WICPixelFormat24bppBGR. Err: 0x%x", hr);
}

我检查了转储文件,似乎返回的formatGUID是GUID_WICPixelFormat24bpp RGB

我有以下问题:

  1. SetPixel格式何时返回不同的版本?有哪些因素可能导致它返回不同的GUID?

  2. 我总是编码为JPEGXR,并始终应用相同的属性。为什么SetPixelFormat的行为是非确定性的?它不应该总是成功,或者总是返回GUID_WICPixelFormat24bppRGB?

  3. 如果支持RGB格式,为什么不是BGR?这只是改变了顺序。

  4. 我的代码是在这里的示例的帮助下编写的:

    http://msdn.microsoft.com/en-us/library/windows/desktop/ee719871(v=vs.85).aspx

1 个答案:

答案 0 :(得分:0)

这是对SetPixelFormat的并发调用可能发生的问题。我听说它将在Windows 8.1中修复。