4

私はWindows(7とXPの両方-両方とも32ビット)を使用しており、C++でコーディングしています

外部ソースからビットマップを受信して​​います。これらのビットマップは固定解像度(384x288)です

ビットマップを受け取った後、可変サイズのレイアウトに基づいてサイズを変更する必要があるため、現在、StretchBltを使用してこれらのタスクを実行しています。

画面上の画像でビットマップのサイズを大きくすると、これはうまく機能します。

ただし、着信ビットマップを小さいバージョンに縮小して画面に配置すると、画像上で発生する奇妙な「ボクシング」タイプの効果が得られます。

次の例では、ソース画像は3つのパネルのそれぞれで同じです。ただし、左側の2つ(サイズを小さく)は両方ともボクシング/ライン効果があります。

ここに画像の説明を入力してください

実際の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
               );

しかし、おそらく問題は他の場所にあるのだろうかと思います。

他の誰かが、私がそれを修正する方法を知っているこの種のサイズ変更画像の破損の経験がありますか?

4

2 に答える 2

8

StretchBltを使用してモードを設定していますSetStretchBltModeか?

HALFTONE

ソース長方形のピクセルを宛先長方形のピクセルのブロックにマップします。ピクセルの宛先ブロックの平均色は、ソースピクセルの色に近似しています。

HALFTONEストレッチモードを設定した後、アプリケーションはSetBrushOrgEx関数を呼び出してブラシの原点を設定する必要があります。そうしないと、ブラシのずれが発生します。

于 2012-01-31T12:55:12.503 に答える
2

VS 2013と互換性のある作業パレットベースのOnPaintコード:

 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 );
        }   

      }
  }
于 2014-06-09T03:39:50.973 に答える