本文整理汇总了C++中IWICBitmapDecoder::GetContainerFormat方法的典型用法代码示例。如果您正苦于以下问题:C++ IWICBitmapDecoder::GetContainerFormat方法的具体用法?C++ IWICBitmapDecoder::GetContainerFormat怎么用?C++ IWICBitmapDecoder::GetContainerFormat使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IWICBitmapDecoder
的用法示例。
在下文中一共展示了IWICBitmapDecoder::GetContainerFormat方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DecodeFrame
// 解码照片的基础位图文件的.
HRESULT VideoEncoder::DecodeFrame(Photo* pPhoto, BYTE** ppOutputBitmap, int* pBitmapSize)
{
HRESULT hr = S_OK;
IWICBitmapDecoder *pDecoder = nullptr;
IWICBitmapFrameDecode *pFrame = nullptr;
IWICBitmap* pSourceBitmap = nullptr;
IWICBitmapLock* pLock = nullptr;
BYTE* pSourceBuffer = nullptr;
BYTE* pDestinationBuffer = nullptr;
UINT pixelWidth;
UINT pixelHeight;
WICRect lockRect;
*ppOutputBitmap = nullptr;
hr = m_pIWICFactory->CreateDecoderFromFilename(
pPhoto->GetFile().c_str(),
nullptr,
GENERIC_READ,
WICDecodeMetadataCacheOnDemand,
&pDecoder
);
CheckHR(hr);
this->m_logFileStream << "WIC解码器创建成功." << endl;
GUID containerFormat;
CheckHR(pDecoder->GetContainerFormat(&containerFormat));
// 我们仅支持jpg 文件.
if (containerFormat != GUID_ContainerFormatJpeg)
{
this->m_logFileStream << "仅支持jpeg文件." << endl;
return E_NOTSUPPORTEDFORMAT;
}
// 我们仅支持jpg 文件. 因此只有一桢.
CheckHR(pDecoder->GetFrame(0, &pFrame));
// TODO: 目前我们需要所有照片有相同的大小.
// 如果需求在将来发生变化,修改代码.
pFrame->GetSize(&pixelWidth, &pixelHeight);
if (pixelWidth != this->m_frameWidth || pixelHeight != this->m_frameHeight)
{
this->m_logFileStream << "所有的照片必须使用固定的大小." << endl;
return E_IMAGESIZEINCORRECT;
}
// 创建源位图对象.
CheckHR(this->m_pIWICFactory->CreateBitmapFromSource(pFrame, WICBitmapCacheOnLoad, &pSourceBitmap));
this->m_logFileStream << "位图资源创建成功." << endl;
lockRect.X = 0;
lockRect.Y = 0;
lockRect.Width = pixelWidth;
lockRect.Height = pixelHeight;
CheckHR(pSourceBitmap->Lock(&lockRect, WICBitmapLockWrite, &pLock));
UINT sourceBufferSize;
CheckHR(pLock->GetDataPointer(&sourceBufferSize, &pSourceBuffer));
// Jpg BGR 位图转换 RGBA 格式.
UINT destinationBufferSize = sourceBufferSize / 3 * 4;
pDestinationBuffer = new BYTE[destinationBufferSize];
for (UINT i = 0, j = 0; i < sourceBufferSize; i+=3, j+=4)
{
pDestinationBuffer[j] = pSourceBuffer[i]; // R
pDestinationBuffer[j + 1] = pSourceBuffer[i + 1]; // G
pDestinationBuffer[j + 2] = pSourceBuffer[i + 2]; // B
pDestinationBuffer[j + 3] = 255; // A
}
*ppOutputBitmap = pDestinationBuffer;
*pBitmapSize = destinationBufferSize;
cleanup:
if (!SUCCEEDED(hr))
{
DWORD error = GetLastError();
this->m_logFileStream << "意外错误: " << error << endl;
this->m_logFileStream << "HResult是: " << hr << endl;
}
if (pSourceBuffer != nullptr)
{
// 删除pSourceBuffer;
}
SafeRelease(&pDecoder);
SafeRelease(&pFrame);
SafeRelease(&pSourceBitmap);
SafeRelease(&pLock);
return hr;
}