Изображение дрожит, когда StretchDIBits частично - PullRequest
0 голосов
/ 09 июля 2009

Я использую C ++ GDI, StretchDIBits для рисования изображений на DC.

Поскольку исходное изображение большое, и требуется высокое качество. Я использую режим HAFTONE, для рисования всего изображения на постоянном токе (увеличения изображения) требуется много времени.

Поэтому я решил частично рисовать, используя StretchDIBits. Но есть серьезная проблема с StretchDIBits.

Я могу нарисовать прямоугольник только в целых числах в области в целых числах (ширина и высота, а верхняя левая точка x, y - целые числа)

    ::SetStretchBltMode(hdc, HALFTONE);
    ::StretchDIBits(hdc,
        realDrawRect.left, 
        realDrawRect.top, 
        realDrawRect.right - realDrawRect.left, 
        realDrawRect.bottom - realDrawRect.top,
        left, 
        top, 
        width, 
        height,
        pImageDIB,
        pImageHead, 
        DIB_RGB_COLORS, SRCCOPY);

, если изображение 21 * 21. Сейчас я рисую (5, 5, 7, 7) в DC, в (20, 20, 60, 60), в следующий раз, когда я хочу рисовать в (21, 20, 61, 60). на исходном изображении нет соответствующего местоположения. Так что я могу только нарисовать аппроксимацию прямоугольника к DC. Теперь проблема происходит, изображение дрожит !!

Меня раздражает эта проблема. Как я могу избежать тряски?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Это нормальная проблема, с которой я столкнулся, когда я использовал stretchDIBits в C ++, а также в C #. Чтобы преодолеть эту проблему, у нас была функция исправления ширины и высоты изображения перед вызовом функции stretchDIBits:

if (m_currentImage.Width % 2 != 0) // check for odd number
{
     if (((m_currentImage.Width - 1) / 2) % 2 != 0)
           m_currentImage = m_currentImage.Resize(m_currentImage.Width - 3, m_currentImage.Height - 2, Emgu.CV.CvEnum.Inter.Linear);
     else
           m_currentImage = m_currentImage.Resize(m_currentImage.Width - 1, m_currentImage.Height, Emgu.CV.CvEnum.Inter.Linear);
}
else if ((m_currentImage.Width / 2) % 2 != 0) // else check fraction of width is odd number
     m_currentImage = m_currentImage.Resize(m_currentImage.Width - 2, m_currentImage.Height - 1, Emgu.CV.CvEnum.Inter.Linear);
0 голосов
/ 09 июля 2009

Если встряхивание происходит из-за округления целого числа, попробуйте округлить его до ближайшего целого числа. Смотрите это .

В противном случае я бы порекомендовал вам перейти на GDI +, с которым намного проще работать. С GDI + вы можете нарисовать растровое изображение с точностью с плавающей точкой. Смотрите документацию Графика :: DrawImage .

Я перешел с GDI на GDI + в нескольких проектах MFC Active-X, и это совсем не сложно.

...