StretchDIBits кажется медленным, есть ли API быстрее? - PullRequest
5 голосов
/ 13 мая 2009

Я хочу нарисовать чур на HDC, того же размера. Я использую : des и src имеют одинаковый размер.

   ::StretchDIBits(hdc,
                des.left,des.top,des.right - des.left,des.bottom - des.top,
                src.left, GetHeight() - src.bottom, src.right - src.left,src.bottom - src.top,
                m_pImg->accessPixels(),m_pImg->getInfo(), DIB_RGB_COLORS, SRCCOPY);

но я нахожу это медленным, потому что размер des один и тот же, мне просто нужно скопировать DIB на DC. Есть ли способ быстрее, чем StretchDIBits?

так же, как

StretchBlt (slow)  vs  Bitblt.(faster)
StretchDIBits (slow ) vs ?(faster)

1 Ответ

8 голосов
/ 14 мая 2009

Разница в скорости происходит от выполнения любого необходимого преобразования цвета в дополнение к общности, необходимой для обработки растяжения (даже если ваш целевой размер совпадает с вашим исходным размером).

Если вы просто рисуете изображение только один раз, то я думаю, что функция, которую вы ищете, это SetDIBitsToDevice.

Если вам важна скорость, потому что вы рисуете один и тот же DIB несколько раз, то вы можете улучшить производительность, скопировав DIB в совместимый DC памяти один раз, а затем BitBlt -ing из DC памяти на экран (или принтер) каждый раз, когда вам это нужно. Используйте CreateCompatibleDC для создания DC памяти, а затем используйте StretchDIBits или SetDIBitsToDevice, чтобы получить изображение на нем. После этого вы можете использовать BitBlt напрямую. Вы также можете использовать DIBSECTION, который дает компромисс в производительности между настоящим DIB и совместимым DC.

...