Как преобразовать структуру, подобную gdi + Bitmap, в HDC?

Как преобразовать структуру, подобную Bitmap, в HDC?

Сейчас я пишу программу обработки изображений на c ++, gdi.

Если бы у меня был HDC. Я могу нарисовать все, что мне нравится, на HDC в gdi с помощью следующего кода.

// HDC is handy.
HDC dc;
dc.DrawXXX       // I can draw using gdi method.
Graphics gr(dc); // now I can also draw on the dc using gdi+ method.

Мое приложение основано на FreeImage. Я делаю из fipImage. (используйте структуру данных, например Bitmap)

Однако, если я хочу рисовать на fipWinImage, теперь мне нужно скопировать fipWinImageto Bitmap, затем нарисовать на Bitmap и, наконец, снова преобразовать растровое изображение в fipImage, что требует времени и памяти.

Преобразование fipImage в растровое изображение -> Рисование на растровом изображении -> преобразование растрового изображения в fipWinImage

fipWinImage imagefip;
Bitmap* tempImg = new Bitmap(imagefip->GetWidth(), imagefip.GetHeigt(), PixelFormat24bppRGB); // memory comsuming is image is large
Graphics *pGr = Graphics::FromImage(tempImg);

HDC dc = pGr->GetHDC();

RECT rec;
rec.left = 0;
rec.top = 0;
rec.right = imagefip.GetWidth();
rec.bottom = imagefip.GetHeight();
fipImage.draw(dc, rec); // using stretchdibits()
pGr->ReleaseHDC(dc);

Graphics gr(tempImg);
HDC dc = gr.GetHDC();         // Get an Hdc, draw using gdi method
gr.ReleaseHDC(tempDC);     //
gr.drawXXX                            // Draw using gdi+ method.


fipWinImage fipImg;             // final result fipWinImage.
HBITMAP temp;
Color color;
tempImg->GetHBITMAP(color, &temp);
fipImg->copyFromBitmap(temp);

Я хочу создать HDC прямо из fipImage. и рисовать прямо на fipWinImage Как мне это сделать?


person user25749    schedule 23.07.2009    source источник


Ответы (2)


Сначала несколько пояснений:

Контекст устройства - это в основном структура, которая запоминает такие вещи, как цвета переднего плана и фона, кисти, информацию о шрифте и физическую поверхность рисования (растровое изображение).

Это удобная вещь, так что вам не нужно постоянно указывать все эти вещи, когда вы выполняете одну графическую операцию за другой. Таким образом вы также можете легко передать все эти настройки. Это все, что на самом деле представляет собой DC - просто набор параметров рисования, включая поверхность, на которой нужно рисовать.

HDC - это просто дескриптор (ссылка) на одну из этих структур. «Ручка» позволяет окну перемещать структуру в памяти для управления свободным пространством, не допуская нарушения указателя на нее.

Если у вас есть доступ к исходному коду используемой библиотеки, изучите метод fipWinImage :: draw (...). Если они используют StretchDIBits, то в какой-то момент им необходимо преобразовать свои необработанные растровые данные в совместимый формат. Также возможно, что класс fipWinImage является оболочкой для базового BITMAP или DIB и т. Д.

Последний шаг к получению собственного HDC ...

Битовая карта «ВЫБИРАЕТСЯ» в контексте устройства и может быть выбрана только в один DC за один раз. Если вы можете получить внутренний HBITMAP из fipWinImage, вы можете выбрать его в другом DC (при условии, что он еще не выбран в другом HC).

Когда вы создаете DC, Windows автоматически создает для него растровое изображение 1x1 (так как DC должен всегда иметь выбранное растровое изображение). Когда вы выбираете новое растровое изображение, вы получаете дескриптор ранее выбранного растрового изображения, возвращаемого вам. Держитесь за это, потому что вам нужно будет вернуть его, когда вы закончите.

Надеюсь, это поможет.

person Scott Smith    schedule 04.02.2010

Я не знаю FreeImage, но если вы можете получить из него указатель на фактические данные пикселей (раздел DIB), вы можете просто создать HBITMAP, который будет совместно использовать его, без необходимости каждый раз копировать данные.

person Tal Pressman    schedule 23.07.2009