Сохранение jpg-файла с помощью WIC
От: Melamed Россия  
Дата: 19.04.19 20:26
Оценка:
Я сохраняю графику в jpg-Формате с помощью Windows Image Component. Реализую это в следующем коде

HRESULT ImageViewWnd::SaveToJPG(LPCTSTR pszFileName, float fQuality)
{
    IWICBitmap *pBitmap = NULL;
    IWICBitmapEncoder *pEncoder = NULL;
    IWICBitmapFrameEncode *pFrame = NULL;
    IPropertyBag2 *pPropertyBag = NULL;
    IWICStream *pStream = NULL;
    PROPBAG2 Property;
    HRESULT hRes;
    if (m_pImageFactory == NULL)
    {
        return E_NOINTERFACE;
    }
    hRes = m_pImageFactory->CreateBitmapFromHBITMAP(m_hBitmap, NULL, WICBitmapIgnoreAlpha, &pBitmap);
    if (FAILED(hRes))
    {
        return hRes;
    }
    hRes = m_pImageFactory->CreateEncoder(GUID_ContainerFormatJpeg, NULL, &pEncoder);
    if (FAILED(hRes))
    {
        SAFERELEASE(pBitmap);
        return hRes;
    }
    hRes = m_pImageFactory->CreateStream(&pStream);
    if (FAILED(hRes))
    {
        SAFERELEASE(pBitmap);
        SAFERELEASE(pEncoder);
        return hRes;
    }
    hRes = pStream->InitializeFromFilename(pszFileName, GENERIC_WRITE);
    if (SUCCEEDED(hRes))
    {
        hRes = pEncoder->Initialize(pStream, WICBitmapEncoderNoCache);
    }
    if (SUCCEEDED(hRes))
    {
        hRes = pEncoder->CreateNewFrame(&pFrame, &pPropertyBag);
    }
    if (FAILED(hRes))
    {
        SAFERELEASE(pBitmap);
        SAFERELEASE(pEncoder);
        SAFERELEASE(pStream);
        return hRes;
    }
    ZeroMemory(&Property, sizeof(PROPBAG2));
    Property.pstrName = L"ImageQuality";
    VARIANT vQuality;
//    ZeroMemory(&vQuality, sizeof(VARIANT));
    VariantInit(&vQuality);
    vQuality.vt =  VT_R4;
    vQuality.fltVal = fQuality;
    hRes = pPropertyBag->Write(1, &Property, &vQuality);
    if (SUCCEEDED(hRes))
    {
        hRes = pFrame->Initialize(pPropertyBag);
        if (SUCCEEDED(hRes))
        {
            hRes = pFrame->WriteSource(pBitmap, NULL);
            if (SUCCEEDED(hRes))
            {
                hRes = pFrame->Commit();
                if (SUCCEEDED(hRes))
                {
                    hRes = pEncoder->Commit();
                }
            }
        }
    }
    SAFERELEASE(pPropertyBag);
    SAFERELEASE(pEncoder);
    SAFERELEASE(pStream);
    SAFERELEASE(pBitmap);
    return hRes;
}


Картинка сохраняется правильно.
Есть подозрение, что данный код не закрывает файл, так как невозможно открыть полученный файл в любой программе, пока данная программа не будет выгружена. Что это: очередной баг от Microsoft, или это как-то лечится?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.