Windows IWICBitmapScaler不';96bppRGBFloat格式不适用?

Windows IWICBitmapScaler不';96bppRGBFloat格式不适用?,windows,components,imaging,wic,Windows,Components,Imaging,Wic,我在使用WIC库时遇到了一个问题。我发现我不能用IWICBitmapScaler缩放R32G322图像。。。代码示例如下所示: { IWICImagingFactory* m_pWICFactory; HRESULT hr = S_OK; // Initialize COM hr = CoInitialize(nullptr); assert(SUCCEEDED(hr)); // Initialize Factory hr = CoCrea

我在使用WIC库时遇到了一个问题。我发现我不能用IWICBitmapScaler缩放R32G322图像。。。代码示例如下所示:

{
    IWICImagingFactory* m_pWICFactory;
    HRESULT hr = S_OK;
    // Initialize COM
    hr = CoInitialize(nullptr);
    assert(SUCCEEDED(hr));
    // Initialize Factory
    hr = CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER,
        __uuidof(IWICImagingFactory), (void**)&m_pWICFactory);
    assert(SUCCEEDED(hr));

    // 4x4 R32G32B32 image
    XMFLOAT3 srcImg[] = { XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1),
        XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1),
        XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), 
        XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), XMFLOAT3(1, 1, 1), };

    // 2x2 R32G32B32 image
    XMFLOAT3 dstImg[4];

    CComPtr<IWICBitmap> pSrcBitmap;
    hr = m_pWICFactory->CreateBitmapFromMemory(4, 4, GUID_WICPixelFormat96bppRGBFloat, 4 * sizeof(XMFLOAT3),
        4 * sizeof(XMFLOAT3)* 4, (BYTE*)srcImg, &pSrcBitmap);

    IWICBitmapSource *pSrcBitmapSource = pSrcBitmap.p;

    // scale to 2x2
    CComPtr<IWICBitmapScaler> pScaler;
    hr = m_pWICFactory->CreateBitmapScaler(&pScaler);
    hr = pScaler->Initialize(pSrcBitmapSource, 2, 2, WICBitmapInterpolationModeFant);
    pSrcBitmapSource = pScaler.p;

    // copy back
    WICRect rect = { 0, 0, 2, 2 };
    hr = pSrcBitmapSource->CopyPixels(&rect, 2 * sizeof(XMFLOAT3), 2 * sizeof(XMFLOAT3)* 2, (BYTE*)dstImg);

}
{
IwicingFactory*m_pWICFactory;
HRESULT hr=S_正常;
//初始化COM
hr=共同初始化(nullptr);
断言(成功(hr));
//初始化工厂
hr=CoCreateInstance(CLSID_WICImagingFactory、nullptr、CLSCTX_INPROC_服务器、,
__uuidof(IwicMagingFactory),(作废**)和m_pWICFactory);
断言(成功(hr));
//4x4 R32G32B32图像
XMFLOAT3 srcImg[]={XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),
XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),
XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),
XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),XMFLOAT3(1,1,1),};
//2x2 R32G322图像
XMFLOAT3-dstImg[4];
CComPtr-psrcr位图;
hr=m_pWICFactory->CreateBitmapFromMemory(4,4,GUID_WICPixelFormat96bppRGBFloat,4*sizeof(XMFLOAT3),
4*sizeof(XMFLOAT3)*4,(字节*)srcImg和pSrcBitmap);
IWICBitmapSource*pSrcBitmapSource=pSrcBitmap.p;
//缩放到2x2
会计核算员;
hr=m_pWICFactory->CreateBitmapScaler(&pScaler);
hr=pScaler->初始化(pSrcBitmapSource,2,2,WICBitmapInterpolationModeFant);
pSrcBitmapSource=pScaler.p;
//复写
WICRect rect={0,0,2,2};
hr=pSrcBitmapSource->CopyPixels(&rect,2*sizeof(XMFLOAT3),2*sizeof(XMFLOAT3)*2,(字节*)dstImg);
}
我在dstImg缓冲区中得到-1.#QNAN000:( 我不确定是我做错了什么,还是IWICBitmapScaler不支持这种格式

另一个问题是,当我使用IWICFormatConverter将R32G32B32A32(即128bppRGBFloat)图像转换为R32Gray(即32bppGrayFloat)格式时,它总是将值钳制为[0,1],这是一种需要的行为吗?(为什么?)


(我的平台:Win 8.1 64位+VS2013)

您错误地认为
IWICBitmapScaler
总是以与其输入相同的像素格式返回数据。事实并非如此。您必须调用
GetPixelFormat
以了解结果的格式。此外,在使用COM API时,必须检查每个返回结果的调用的HRESULT抓住问题

CComPtr<IWICBitmapScaler> pScaler;
hr = m_pWICFactory->CreateBitmapScaler(&pScaler);
if ( FAILED(hr) )
    ...
hr = pScaler->Initialize(pSrcBitmapSource, 2, 2, ICBitmapInterpolationModeFant);
if ( FAILED(hr) )
    ...
pSrcBitmapSource = pScaler.p;

WICPixelFormatGUID pfScaler;
hr = scaler->GetPixelFormat( &pfScaler );
if ( FAILED(hr) )
    ...

// In many cases, pfScaler will not be the same GUID as your pSrcBItmapSource.
CComPtr pScaler;
hr=m_pWICFactory->CreateBitmapScaler(&pScaler);
如果(失败(小时))
...
hr=pScaler->初始化(pSrcBitmapSource,2,2,ICBitmapInterpolationModeFant);
如果(失败(小时))
...
pSrcBitmapSource=pScaler.p;
WICPixelFormatGUID pfScaler;
hr=scaler->GetPixelFormat(&pfScaler);
如果(失败(小时))
...
//在许多情况下,pfScaler的GUID将与pSrcBItmapSource不同。

您应该查看大量使用WIC的示例。

I repo和Win81。我看不到任何缺陷,最好暂时不要使用像素格式。非常感谢您的回答。