c++ 如何使用Wincodec. h(WIC)将图像写入STDOUT

kkbh8khc  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(81)

我遇到了this example,不知道如何将stream->InitializeFromFilename更改为输出到STDOUT的东西,在HRESULT SavePixelsToFile32bppPBGRA(UINT width, UINT height, UINT stride, LPBYTE pixels, LPWSTR filePath, const GUID &format)函数中。尝试使用stream->InitializeFromMemory,但由于C++经验不足而碰壁。
这背后的原因是,我正在构建一些东西,并希望使用其他东西来管道示例的标准输出。

at0kjp5o

at0kjp5o1#

多亏了@ SimonMackay,我能够更新他的代码来实现所需的功能。

SavePixelsToFile 32 bppPBGRA现在将数据写入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, nullptr, &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;
}

字符串

sendIStream ToOutput从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;
 }

相关问题