Применение эффектов к выводу вместо растровых изображений?

Допустим, у меня есть эффект размытия по Гауссу ID2D1Effect *blur; и я хочу применить растровое изображение к эффекту, чтобы получить размытое изображение. Я могу передать растровое изображение с помощью эффекта blur->SetInput(0, bitmap); и получить вывод с blur->Get(), Теперь я не хочу размывать изображение, хранящееся на диске, я хочу размывать вывод, который я создал между renderTarget->BeginDraw() а также renderTarget->EndDraw(), Моя первая идея состояла в том, чтобы получить растровое изображение выходных данных, но я не мог найти ни функции для извлечения уже визуализированного выходного сигнала, ни найти способ применить эффект к renderTarget вместо загруженного растрового изображения.

Маленький пример:

ID2D1SolidColorBrush *brush;
ID2D1HwndRenderTarget *renderTarget; // Instantiated somewhere else in code

renderTarget->CreateSolidColorBrush(D2D1::ColorF(0.0f, 0.6f, 1.0f), &bush);

renderTarget->BeginDraw();
renderTarget->Clear(D2D1::ColorF(0.0f, 0.0f, 0.0f));
renderTarget->FillRectangle(D2D1::RectF(50.0f, 50.0f, 100.0f, 100.0f), brush);
// Apply gaussian blur?
renderTarget->EndDraw();

brush->Release();
// renderTarget gets released somewhere else

Как я могу размыть прямоугольник в этом примере?


РЕДАКТИРОВАТЬ (Благодаря enhzflep):

Я могу получить уже обработанный вывод в виде растрового изображения со следующим фрагментом:

ID2D1BitmapRenderTarget *bitmapRenderTarget;
hwndRenderTarget->CreateCompatibleRenderTarget(&bitmapRenderTarget);

ID2D1Bitmap *bitmap;
bitmapRenderTarget->GetBitmap(&bitmap);

В своем коде я уже проверил его, получив растровое изображение, нарисовав его и, наконец, нарисовав это растровое изображение на hwndRenderTarget и это сработало. Прежде чем рисовать растровое изображение обратно в hwndRenderTarget Я хочу применить к нему эффект (например, размытие по Гауссу). Но это приводит к следующей проблеме (я не знаю, должен ли я открыть новую тему, поэтому я публикую ее здесь): ID2D1Effect Интерфейс может быть создан только из экземпляра ID2D1DeviceContext который доступен только для Windows 8. Я не могу себе представить, что Microsoft ограничивает ID2D1Effect до Windows 8, поэтому должен быть другой путь. Кто-нибудь знает другой способ навязывания ID2D1Effect интерфейс?


РЕДАКТИРОВАТЬ 2:

Я также разместил этот вопрос на MSDN и, наконец, получил ответ. Я должен был установить Обновление платформы для Win7 SP1 (KB2670838) и Win8 SDK (также работает на Win7) для использования заголовков Win8 на Win7.

(Окончательное решение ниже как ответ)

2

Решение

Вот мое окончательное решение. Это проще, чем я, хотя это будет:

// Obtain already initialized ID2D1HwndRenderTarget
ID2D1HwndRenderTarget *hwndRenderTarget = Game::GetInstance()->gfx->hwndRenderTarget;

// COMs
ID2D1Bitmap *bitmap;
ID2D1BitmapRenderTarget *bitmapRenderTarget;
ID2D1DeviceContext *deviceContext;
ID2D1Effect *gaussianBlur;
ID2D1SolidColorBrush *solidColorBrush;

// Create bitmapRenderTarget
hwndRenderTarget->CreateCompatibleRenderTarget(&bitmapRenderTarget);

// Create solidColorBrush
bitmapRenderTarget->CreateSolidColorBrush(D2D1::ColorF(0.0f, 0.6f, 1.0f), &solidColorBrush);

// Draw onto bitmapRenderTarget
bitmapRenderTarget->BeginDraw();
bitmapRenderTarget->Clear(D2D1::ColorF(0.0f, 0.0f, 0.0f));
bitmapRenderTarget->FillEllipse(D2D1::Ellipse(D2D1::Point2F(400.0f, 300.0f), 100.0f, 100.0f), solidColorBrush);
bitmapRenderTarget->EndDraw();

// Obtain hwndRenderTarget's deviceContext
hwndRenderTarget->QueryInterface(&deviceContext);

// Create and apply gaussian blur
deviceContext->CreateEffect(CLSID_D2D1GaussianBlur, &gaussianBlur);

bitmapRenderTarget->GetBitmap(&bitmap);
gaussianBlur->SetInput(0, bitmap);
gaussianBlur->SetValue(D2D1_GAUSSIANBLUR_PROP_BORDER_MODE, D2D1_BORDER_MODE_SOFT);
gaussianBlur->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 5.0f);

// Draw resulting bitmap
deviceContext->DrawImage(
gaussianBlur,
D2D1_INTERPOLATION_MODE_LINEAR);

// Release
bitmap->Release();
bitmapRenderTarget->Release();
deviceContext->Release();
gaussianBlur->Release();
solidColorBrush->Release();
2

Другие решения


По вопросам рекламы [email protected]