Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows图像组件-如何从HBITMAP获取编码器?_C++_Windows_Com_Atl_Wic - Fatal编程技术网

C++ Windows图像组件-如何从HBITMAP获取编码器?

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,需要将其重新缩放为JPEG格式写入磁盘

我从未使用过WIC,因此我一直遵循本教程:

我已经从我的HBITMAP创建了一个WicBitmap

在清单9中,很明显我需要一个解码器,但我找到的创建它的唯一方法是使用IwicMagingFactory::CreateDecoderFromFilename。有一个Initialize方法接收IStream,但我不确定使用它的正确方法


这是将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,但在那之后,做我需要的事情就变得微不足道了。你的例子完美无瑕。