2015-06-29 5 views
0

Я работаю над программой, которая должна изменить то, что уже есть на экране. Поэтому у меня есть только ID2D1Bitmap, который я создал с помощью pRenderTarget->CopyFromRenderTarget.Direct2D: конвертировать ID2D1Image в ID2D1Bitmap

Что я пытаюсь сделать, применяя эффекты к этому растровому изображению. Эффект возвращает ID2D1Image, но мне нужно иметь ID2D1Bitmap.

Есть ли способ сделать это?

Edit1:

ID2D1Bitmap* myBitmap //the bitmap I want to apply the effect to 
ID2D1Effect* effect = NULL; 
pDeviceContext->CreateEffect(CLSID_D2D1Saturation, &effect); 
effect->SetValue(D2D1_SATURATION_PROP_SATURATION, 0.0f); 
effect->SetInput(0, myBitmap); 

ID2D1Image* pImg = NULL; 
effect->GetOutput(&pImg); 

Если я бросаю эту картинку, getPixelSize() вызывает нарушение доступа.

+0

просто бросить ID2D1Image как ID2D1Bitmap –

+0

Нет, это бросает нарушение доступа. Можно отливать из ID2D1Bitmap в ID2D1Image, поскольку интерфейс ID2D1Bitmap наследуется от ID2D1Image. Но не наоборот. –

+0

Просьба поделиться фрагментом кода, как вы создаете и применяете эффект (ы). –

ответ

2

я решил. Это грязно, но это работает.

ID2D1Bitmap* convertImageToBitmap(ID2D1Image* pImg, D2D1_SIZE_U size) 
{ 
    ID2D1Image* oldTarget = NULL; 
    ID2D1Bitmap1* targetBitmap = NULL; 

    //Create a Bitmap with "D2D1_BITMAP_OPTIONS_TARGET" 
    D2D1_BITMAP_PROPERTIES1 bitmapProperties = 
     D2D1::BitmapProperties1(
     D2D1_BITMAP_OPTIONS_TARGET, 
     D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED) 
    ); 
    pDeviceContext->CreateBitmap(size, 0, 0, bitmapProperties, &targetBitmap); 

    //Save current Target, replace by ID2D1Bitmap 
    pDeviceContext->GetTarget(&oldTarget); 
    pDeviceContext->SetTarget(targetBitmap); 
    //Draw Image on Target (if currently not drawing also call Begin/EndDraw) 
    pDeviceContext->DrawImage(pImg); 

    //Set previous Target 
    pDeviceContext->SetTarget(oldTarget); 

    oldTarget->Release(); 

    return targetBitmap; 
} 
+0

Это на самом деле правильный способ сделать это (хотя с обработкой ошибок :) – Trillian

-1

попробовать:

ID2D1Image* existingImage; 
ID2D1Bitmap* myBitmap; // the bitmap I'm looking for 
existingImage->QueryInterface(IID_PPV_ARGS(&myBitmap)); 
+0

Это возвращает: 'E_NOINTERFACE Нет такого интерфейса. Есть ли какие-то ограничения? –

+0

Для дальнейшего использования ID2D1Image, который вы получаете из ID2D1Effect, представляет собой ленивую реализацию графа эффектов. Он не подкрепляется пикселями до тех пор, пока это не будет, и поэтому не может быть добавлено в ID2D1Bitmap. – Trillian

 Смежные вопросы

  • Нет связанных вопросов^_^