C++ Windows图像组件-如何从HBITMAP获取编码器?
我有一个由第三方库提供的HBITMAP,需要将其重新缩放为JPEG格式写入磁盘 我从未使用过WIC,因此我一直遵循本教程: 我已经从我的HBITMAP创建了一个WicBitmap 在清单9中,很明显我需要一个解码器,但我找到的创建它的唯一方法是使用IwicMagingFactory::CreateDecoderFromFilename。有一个Initialize方法接收IStream,但我不确定使用它的正确方法C++ Windows图像组件-如何从HBITMAP获取编码器?,c++,windows,com,atl,wic,C++,Windows,Com,Atl,Wic,我有一个由第三方库提供的HBITMAP,需要将其重新缩放为JPEG格式写入磁盘 我从未使用过WIC,因此我一直遵循本教程: 我已经从我的HBITMAP创建了一个WicBitmap 在清单9中,很明显我需要一个解码器,但我找到的创建它的唯一方法是使用IwicMagingFactory::CreateDecoderFromFilename。有一个Initialize方法接收IStream,但我不确定使用它的正确方法 这是将HBITMAP保存到磁盘的正确方法吗?如果是这样,我如何从我的HBITMAP或
这是将HBITMAP保存到磁盘的正确方法吗?如果是这样,我如何从我的HBITMAP或WicBitmap获取解码器?IwicMagingFactory::CreateBitmapFromHBITMAP将GDI位图作为解码位图导入WIC,您已经不需要解码器了。也就是说,您可以使用编码部分并保存到磁盘 下面的代码片段确实完整地完成了:从桌面左上角以
HBITMAP
的形式显示800x600位图,然后保存到JPEG文件中
#include "stdafx.h"
#include <wincodecsdk.h>
#include <atlbase.h>
#define __C ATLENSURE_SUCCEEDED
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
{
HBITMAP hBitmap;
{
HDC hDc = GetDC(NULL);
hBitmap = CreateCompatibleBitmap(hDc, 800, 600);
HDC hBitmapDc = CreateCompatibleDC(hDc);
HGDIOBJ hPreviousBitmap = SelectObject(hBitmapDc, hBitmap);
BitBlt(hBitmapDc, 0, 0, 800, 600, hDc, 0, 0, SRCCOPY);
SelectObject(hBitmapDc, hPreviousBitmap);
DeleteDC(hBitmapDc);
ReleaseDC(NULL, hDc);
}
CComPtr<IWICImagingFactory> pFactory;
__C(pFactory.CoCreateInstance(CLSID_WICImagingFactory));
CComPtr<IWICBitmap> pBitmap;
__C(pFactory->CreateBitmapFromHBITMAP(hBitmap, NULL, WICBitmapIgnoreAlpha, &pBitmap));
CComPtr<IWICBitmapEncoder> pBitmapEncoder;
__C(pFactory->CreateEncoder(GUID_ContainerFormatJpeg, NULL, &pBitmapEncoder));
CComPtr<IWICStream> pFileStream;
__C(pFactory->CreateStream(&pFileStream));
__C(pFileStream->InitializeFromFilename(L"D:\\Output.jpg", GENERIC_WRITE));
__C(pBitmapEncoder->Initialize(pFileStream, WICBitmapEncoderNoCache));
CComPtr<IWICBitmapFrameEncode> pBitmapFrameEncode;
CComPtr<IPropertyBag2> pPropertyBag;
__C(pBitmapEncoder->CreateNewFrame(&pBitmapFrameEncode, &pPropertyBag));
PROPBAG2 Property;
ZeroMemory(&Property, sizeof Property);
Property.pstrName = L"ImageQuality";
CComVariant vQuality(0.85f);
__C(pPropertyBag->Write(1, &Property, &vQuality));
__C(pBitmapFrameEncode->Initialize(pPropertyBag));
__C(pBitmapFrameEncode->WriteSource(pBitmap, NULL));
__C(pBitmapFrameEncode->Commit());
__C(pBitmapEncoder->Commit());
}
CoUninitialize();
return 0;
}
#包括“stdafx.h”
#包括
#包括
#定义uu C atl确保u成功
int _tmain(int argc,_TCHAR*argv[]
{
共初始化(空);
{
HBITMAP HBITMAP;
{
HDC HDC=GetDC(空);
hBitmap=CreateCompatibleBitmap(hDc,800600);
HDC hBitmapDc=创建兼容的数据中心(HDC);
HGDIOBJ hPreviousBitmap=SelectObject(hBitmapDc,hBitmap);
BitBlt(hBitmapDc,0,0,800,600,hDc,0,0,SRCCOPY);
选择对象(hBitmapDc、HPPreviousBitmap);
DeleteDC(hBitmapDc);
ReleaseDC(空,hDc);
}
采购商工厂;
__C(pFactory.CoCreateInstance(CLSID_WICImagingFactory));
CComPtr pBitmap;
__C(pFactory->CreateBitmapFromHBITMAP(hBitmap,NULL,WICBitmapIgnoreAlpha,&pBitmap));
CComPtr pBitmapEncoder;
__C(pFactory->CreateEncoder(GUID_ContainerFormatJpeg、NULL和pBitmapEncoder));
Cmpter pFileStream;
__C(pFactory->CreateStream(&pFileStream));
__C(pFileStream->InitializeFromFilename(L“D:\\Output.jpg”,通用_WRITE));
__C(pBitmapEncoder->Initialize(pFileStream,WICBitmapEncoderNoCache));
CComPtr pBitmapFrameEncode;
C采购商pPropertyBag;
__C(pBitmapEncoder->CreateNewFrame(&pBitmapFrameEncode,&ppPropertyBag));
PROPBAG2财产;
零内存(&Property,sizeof属性);
Property.pstrName=L“ImageQuality”;
cOMV可变V4质量(0.85f);
__C(pPropertyBag->写入(1、属性和vQuality));
__C(pBitmapFrameEncode->初始化(PPPropertyBag));
__C(pBitmapFrameEncode->WriteSource(pBitmap,NULL));
__C(pBitmapFrameEncode->Commit());
__C(pbitmapcoder->Commit());
}
coninitialize();
返回0;
}
Hmm,不,HBITMAP已经解码。如果你想写一个JPEG文件,那么你需要一个编码器。谢谢!我很难找到IWICFormatConverter继承自IWICSourceBitmap,但在那之后,做我需要的事情就变得微不足道了。你的例子完美无瑕。