【问题标题】:How to write an image to STDOUT with Wincodec.h (WIC)如何使用 Wincodec.h (WIC) 将图像写入 STDOUT
【发布时间】:2020-12-26 09:29:01
【问题描述】:

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

这背后的原因是我正在构建一些东西,并希望使用其他东西来管道示例的标准输出。

提前问候

【问题讨论】:

  • 这能回答你的问题吗? How to display an image using C++ right in console window? 如果您愿意使用像 Qt 这样的框架,那么代码少于 10 行。但我不认为你会在stdout 上输出它。这将是一个不同的屏幕。
  • 在 Windows 上下文中“输出到 STDOUT”是什么意思?你想在控制台中“显示”图像还是输出它的位?
  • 想做类似 cout
  • 您无法将 WIC 解码流式传输到输出。但是您可以使用 CreateStreamOnHGlobal 构建内存缓冲区,然后 InitializeFromIStream 然后使用 WIC 写入示例,然后将 IStream 转换为 std::osstream:cplusplus.com/forum/windows/193777
  • 感谢@SimonMourier 恶意尝试

标签: c++ image image-processing stdout wic


【解决方案1】:

感谢@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, 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;
}

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;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2020-10-23
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多