J’utilise Windows (à la fois 7 et XP – à la fois 32 bits) et le codage en C ++
Je reçois des bitmaps d’une source externe. Ces bitmaps ont une résolution fixe (384×288)
Après avoir reçu un bitmap, je dois le redimensionner en fonction d’une disposition de taille variable. J’utilise actuellement StretchBlt pour effectuer ces tâches.
Si je redimensionne l’image bitmap sur une image plus grande à l’écran, cela fonctionne très bien.
Cependant, si je réduis le bitmap entrant à une version plus petite à placer sur l’écran, j’obtiens un effet de type «boxe» étrange sur l’image.
Dans l’exemple suivant, l’image source est la même pour chacun des trois panneaux. Mais la main gauche deux (redimensionner plus petit) ont tous deux l’effet boxe / lignes sur eux.
Pour l’appel actuel de StretchBlt, je le fais:
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 );
Mais je me demande si le problème est peut-être ailleurs.
Quelqu’un d’autre a-t-il eu l’expérience de ce type de corruption d’image redimensionnée qui sait comment résoudre ce problème?
StretchBlt
-vous le mode SetStretchBltMode
avec SetStretchBltMode
?
HALFTONE
Mappe les pixels du rectangle source en blocs de pixels dans le rectangle de destination. La couleur moyenne sur le bloc de pixels de destination est proche de la couleur des pixels sources.
Après avoir défini le mode d’étirement HALFTONE, une application doit appeler la fonction SetBrushOrgEx pour définir l’origine du pinceau. Si cela ne réussit pas, un mauvais alignement se produit.
Code OnPaint basé sur une palette de travail compatible avec 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 ); } } }