StretchBlt Shrink Corruption - PullRequest
       25

StretchBlt Shrink Corruption

2 голосов
/ 31 января 2012

Я использую Windows (как 7 & XP - как 32-битная) и пишу на C ++

Я получаю растровые изображения из внешнего источника. Эти растровые изображения имеют фиксированное разрешение (384x288)

После получения растрового изображения мне нужно изменить его размер на основе макета переменного размера, поэтому в настоящее время я использую StretchBlt для выполнения этих задач.

Если я изменю размер растрового изображения до большего на экране, это прекрасно работает.

Однако, если я уменьшу входящее растровое изображение до уменьшенной версии, чтобы разместить его на экране, я получу странный эффект типа «бокса», возникающий над изображением.

В следующем примере исходное изображение одинаково для каждой из трех панелей. Но две левой руки (меньше по размеру) имеют эффект бокса / линий.

enter image description here

Для реального вызова StretchBlt я делаю это:

        memcpy(at_TempPointer[PortNo], // Destination
          (void *)VideoBufferAddress, // Source
          FIXED_IMAGE_WIDTH * FIXED_IMAGE_HEIGHT * BYTES_PER_PIXEL // Number of bytes
          );

    StretchBlt(at_ImageDC[PortNo], // HDC Dest
               0, // X Origin Dest
               0, // Y Origin Dest
               at_Width[PortNo], // Width Dest
               at_Height[PortNo], // Height Dest
               at_GhDC[PortNo], // HDC Source
               0, // X Origin Source
               0, // Y Origin Source
               FIXED_IMAGE_WIDTH, // Width Source
               FIXED_IMAGE_HEIGHT, // Height Source
               SRCCOPY // Graphic Operation
               );

Но мне интересно, возможно, проблема в другом месте.

Кто-нибудь еще имел опыт такого изменения размера изображения, который знает, как я могу это исправить?

Ответы [ 2 ]

7 голосов
/ 31 января 2012

Вы устанавливаете режим StretchBlt, используя SetStretchBltMode?

HALFTONE

Отображение пикселей из исходного прямоугольника в блоки пикселей в месте назначенияпрямоугольник.Средний цвет по целевому блоку пикселей приблизительно соответствует цвету исходных пикселей.

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

1 голос
/ 09 июня 2014

Рабочий код OnPaint на основе палитры, совместимый с VS 2013:

 void CMyView::paint_image(CDC* pDC)
 {

 CPalette * pal = &m_Palette;

    if (pal->m_hObject != NULL && m_Bitmap.m_hObject != NULL)
    {
        if (pDC != NULL)
        {
            CPalette *pOldPalette;
            pOldPalette = pDC->SelectPalette( pal, FALSE );
            pDC->RealizePalette();

            SetStretchBltMode(pDC->GetSafeHdc(), HALFTONE);

            if(flip)
                pDC->StretchBlt( 0, 0, x*zoomx, y*zoomy, m_pMemDC, x, y, -x, -y, SRCCOPY );
            else
                pDC->StretchBlt( 0, 0, x*zoomx, y*zoomy, m_pMemDC, 0, 0, x, y, SRCCOPY );
            pDC->SelectPalette( pOldPalette, TRUE );
        }
        else
        {
            CClientDC m_pWinDC(this);
            OnPrepareDC(&m_pWinDC);
            m_pWinDC.SelectPalette( pal, FALSE );
            m_pWinDC.RealizePalette();

            SetStretchBltMode(m_pWinDC, HALFTONE);

            if(flip)
                m_pWinDC.StretchBlt( 0, 0, x*zoomx, y*zoomy, m_pMemDC, x, y, -x, -y, SRCCOPY );
            else
                m_pWinDC.StretchBlt( 0, 0, x*zoomx, y*zoomy, m_pMemDC, 0, 0, x, y, SRCCOPY );
        }   

      }
  }
...