2017-02-17 33 views
0

Я успешно загрузил изображение в компонент Windows Imaging, как показано ниже. Но я застрял на последнем шаге , Как сохранить изображение, которое теперь доступно в переменной pWICBitmap.Я пытаюсь загрузить 32-битное изображение с помощью компонента Windows Imaging Component, перевернуть его, а затем сохранить его обратно в том же файле

Также я хочу знать, является ли ниже хороший способ перевернуть изображение растрового изображения?

Вот мой код:

IWICImagingFactory *pIWICFactory = NULL; 
IWICFormatConverter* pWICConv = NULL;   //WIC converter 
IWICBitmapDecoder *pIDecoder = NULL; 
IWICBitmapFrameDecode *pIDecoderFrame = NULL; 
IWICBitmapFlipRotator *pIFlipRotator = NULL; 
IWICBitmap *pWICBitmap = NULL; 

CoInitializeEx(0, COINIT_MULTITHREADED); 
HRESULT hr = CoCreateInstance(
      CLSID_WICImagingFactory, 
      NULL, 
      CLSCTX_INPROC_SERVER, 
      IID_PPV_ARGS(&pIWICFactory) 
      ); 


hr = pIWICFactory->CreateDecoderFromFilename(
    //(LPCWSTR)pszBMPFilePath,     // Image to be decoded 
    L"Bitmap.bmp", 
    NULL,       // Do not prefer a particular vendor 
    GENERIC_READ,     // Desired read access to the file 
    WICDecodeMetadataCacheOnDemand, // Cache metadata when needed 
    &pIDecoder      // Pointer to the decoder 
    ); 

if (SUCCEEDED(hr)) 
{ 
    hr = pIDecoder->GetFrame(0, &pIDecoderFrame); 
} 

//Create a format converter using the IWICImagingFactory to convert the 
//image data from one pixel format to another, handling dithering and 
//halftoning to indexed formats, palette translation and alpha thresholding. 
if (SUCCEEDED(hr)) { 
    hr = pIWICFactory->CreateFormatConverter(&pWICConv); 
} 

//Initialize the format converter with all sorts of information, including the frame that was 
//decoded above 
if (SUCCEEDED(hr)) 
    hr = pWICConv->Initialize(pIDecoderFrame, 
     GUID_WICPixelFormat32bppPBGRA, // Destination pixel format 
     WICBitmapDitherTypeNone, 
     NULL, 
     0.f, 
     WICBitmapPaletteTypeMedianCut); 


if (SUCCEEDED(hr)) 
{ 
    hr = pIWICFactory->CreateBitmapFlipRotator(&pIFlipRotator); 
} 

    // Initialize the flip/rotator to flip the original source horizontally. 
if (SUCCEEDED(hr)) 
{ 
    //hr = pIFlipRotator->Initialize(
    // pIDecoderFrame,      // Bitmap source to flip. 
    // WICBitmapTransformFlipHorizontal); // Flip the pixels along the vertical y-axis. 
    hr = pIFlipRotator->Initialize(
     pWICConv,      // Bitmap source to flip. 
     WICBitmapTransformFlipHorizontal); // Flip the pixels along the vertical y-axis. 

    /*hr = pIFlipRotator->Initialize(
     pIDecoderFrame, 
     WICBitmapTransformFlipVertical);*/ 
    /*hr = pIFlipRotator->Initialize(
     pIDecoderFrame, 
     WICBitmapTransformRotate180);*/ 
} 

//Create the WICBitmap (mpImgWIC) from the Bitmap source (WIC Flip rotator) 
hr = pIWICFactory->CreateBitmapFromSource(pIFlipRotator, WICBitmapCacheOnLoad, &pWICBitmap); 

ответ

0

Создание WICBitmap не нужно. IWICBitmapFlipRotator - это IWICBitmapSource, который вы можете использовать для создания своего изображения.

Вам необходимо создать объект IWICBitmapEncoder и IWICBitmapFrameEncode.

MSDN есть пример здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/gg430021(v=vs.85).aspx

пример MSDN ожидает, что вы будете вручную предоставить данные изображения, но вы можете использовать метод IWICBitmapFrameEncode :: WriteSource писать от вашего IWICBitmapFlipRotator непосредственно: https://msdn.microsoft.com/en-us/library/windows/desktop/ee690159(v=vs.85).aspx