Компонент Windows Imaging - Direct2D C ++ - рисование, сохранение

0

Используя компонент Windows Image Component (WIC), я хочу сделать следующее для моего рабочего стола Windows (Direct2D/C++ с Windows 7 SP1 - Visual Studio 2013)

  1. Выберите любой тип RenderTarget (Direct2D Hwnd/Bitmap/WICBitmap - и т.д.) Для рисования

  2. Создайте пустую растровое изображение (D2D1Bitmap или IWICBitmap - в зависимости от того, что применимо)

  3. Начните рисовать - заполните цвет, нарисуйте несколько линий и эллипсов - Конец рисунка ==> (Все в растровом изображении)

  4. В некоторый момент времени мне нужно сохранить рисованный контент в растровом изображении в качестве изображения на моем компьютере

  5. Поместите растровое изображение в координатах x1, y1 (верхний левый - xy) и x2, y2 (координаты вправо-вправо) объекта рендеринга. Потому что остальная часть окна будет использоваться панелью инструментов.

Как достичь этого с помощью C++/Direct2D?

GDI+ Код для моей функциональности:

Bitmap* pBmp = NULL; //create null or empty bitmap
Graphics* pGrBuf = NULL; //initialise graphics to null

pBmp = new Bitmap((INT)rectClient.Width, (INT)rectClient.Height);
pGrBuf = new Graphics(pBmp);

На этой графике я всегда мог рисовать линии, прямоугольники и т.д.

pGrBuf.DrawRectangle(....)
pGrBuf.DrawLine(...)

В конце концов, для достижения точки 5

//leave some space (30, 30 in xy co-ordinates) for putting the toolbox in the top
pGrBuf.DrawImage(m_pBmp, 30.0f, 30.0f);

Код для пункта 4 намеренно опущен.

Теги:
graphics
bitmap
direct2d

1 ответ

2

Вопрос имеет простой, недвусмысленный ответ, но есть некоторые детали, которые вы должны (пере) рассмотреть.

Direct2D не является инфраструктурой панацеи, которая будет легко превосходить других. Это не очень понятно, каковы ваши рисунки и какова их цель, но бывают случаи, когда использование Direct2D не очень подходит. Если вы замените GDI (+) на D2D, некоторые из ваших страданий будут:

  • (официальная) ограниченная поддержка ОС, в соответствии с версией DirectX и/или функциями, которые вы будете использовать. Вам придется забыть о Windows XP (возможно,) Windows Vista и (возможно,) Windows 7
  • производительность (по сравнению с GDI+, GDI) не всегда больше. В основном зависит от того, как вы используете D2D. Бывают случаи, когда D2D имеет очень низкую производительность (обычно это неправильное использование или непонятые понятия).

Но также преимущества, которые Direct2D может обеспечить, бесчисленны.

Грубо говоря, Direct2D - это не что иное, как обертка вокруг Direct3D. Он был представлен с DirectX 10, и его использование было очень похоже на GDI (+). Но с DirectX 11 (1), Direct2D "принципы" были изменены, и теперь его больше похоже на D3D. Он добавляет другие подходы и отбрасывает старые. Сначала это может быть немного запутанным. Сбивает с толку, потому что все учебники, статьи и любые ресурсы D2D (включая MSDN) в сети смешиваются между версиями D2D. Некоторые из них предназначены для старой версии и рекомендуют одну вещь (подход), другие описывают новую версию.

Во всяком случае, я рекомендую новую версию - то есть Direct2D 11.1.

На ваш вопрос...

  1. "RenderTarget" представляет собой концепцию из "старого" D2D. Новый - это DeviceContext
  2. У DeviceContext есть цель, которая может быть D2D1Bitmap (1) - внеэкранная, резервный буфер подкачки.
  3. Наиболее типичный подход к рисованию - вызов функций рисования в блоке DeviceContext.BeginScene --- DeviceContext.EndScene. Функции рисования очень похожи на GDI (+).
  4. Существует несколько способов сделать это. Вы можете сделать это с помощью WIC. Кроме того, вы можете скопировать данные D2D1Bitmap в DIBBitmap, или вы даже можете перерисовать его в контексте GDI.
  5. Существует функция DeviceContext.DrawImage, но способ, которым вы это сделаете, зависит от многих факторов. Например, у вас может быть два растровых изображения, которые нарисованы поверх двух разных HWnd (один для панели инструментов, другой для другого чертежа).

Вот некоторые ресурсы, которые могут вам помочь:

Ещё вопросы

Сообщество Overcoder
Наверх
Меню