如何解决如何使用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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。