如何使用Wincodec.hWIC将图像写入STDOUT

问题描述

我碰到了this example,却不知道如何在stream->InitializefromFilename函数内部将HRESULT SavePixelsToFile32bppPBGRA(UINT width,UINT height,UINT stride,LPBYTE pixels,LPWSTR filePath,const GUID &format)更改为输出到STDOUT的内容。使用stream->InitializefromMemory尝试过,但由于最少的C ++经验而碰壁。

这背后的原因是我正在构建某些内容,并希望使用其他内容来传递示例的标准输出

提前考虑

解决方法

由于@SimonMourier,我得以更新他的代码来实现所需的功能。

SavePixelsToFile32bppPBGRA 现在将数据写入IStream指针streamOut。最后,它还会调用一个新函数来输出数据。

HRESULT SavePixelsToFile32bppPBGRA(UINT width,UINT height,UINT stride,LPBYTE pixels,const GUID& format)
{
    if (!pixels)
        return E_INVALIDARG;

    HRESULT hr = S_OK;
    IWICImagingFactory* factory = nullptr;
    IWICBitmapEncoder* encoder = nullptr;
    IWICBitmapFrameEncode* frame = nullptr;
    IWICStream* streamOut = nullptr;
    IStream * streamIn = nullptr;
    GUID pf = GUID_WICPixelFormat32bppPBGRA;
    BOOL coInit = CoInitialize(nullptr);

    HRCHECK(CoCreateInstance(CLSID_WICImagingFactory,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&factory)));
    HRCHECK(factory->CreateStream(&streamOut));
    HRCHECK(CreateStreamOnHGlobal(NULL,true,&streamIn));
    HRCHECK(streamOut->InitializeFromIStream(streamIn));
    HRCHECK(factory->CreateEncoder(format,&encoder));
    HRCHECK(encoder->Initialize(streamOut,WICBitmapEncoderNoCache));
    HRCHECK(encoder->CreateNewFrame(&frame,nullptr)); // we don't use options here
    HRCHECK(frame->Initialize(nullptr)); // we dont' use any options here
    HRCHECK(frame->SetSize(width,height));
    HRCHECK(frame->SetPixelFormat(&pf));
    HRCHECK(frame->WritePixels(height,stride,stride * height,pixels));
    HRCHECK(frame->Commit());
    HRCHECK(encoder->Commit());

    sendIStreamToOutput(streamOut);

cleanup:
    RELEASE(streamIn);
    RELEASE(streamOut);
    RELEASE(frame);
    RELEASE(encoder);
    RELEASE(factory);
    if (coInit) CoUninitialize();
    return hr;
}

sendIStreamToOutput 从IStream读取数据并将其写入std :: cout(启用二进制模式)。

void sendIStreamToOutput (IStream * pIStream) {

    STATSTG sts;
    pIStream->Stat(&sts,STATFLAG_DEFAULT);
    ULARGE_INTEGER uli = sts.cbSize;
    LARGE_INTEGER zero;
    zero.QuadPart = 0;
    ULONG size = (ULONG)uli.QuadPart;
    char* bits = new char[size];
    ULONG written;
    pIStream->Seek(zero,STREAM_SEEK_SET,NULL);
    pIStream->Read(bits,size,&written);
    
    std::ostream& lhs = std::cout;

    _setmode(_fileno(stdout),_O_BINARY);

    lhs.write(bits,size);

    fflush(stdout);

    delete[] bits;
 }