2012-10-16 5 views
0

StretchDIBits 기능을 사용하는 데 문제가 있습니다. 버퍼에서 만든 비트 맵을 그립니다. 그러나 버퍼에서 정의한 색상은 화면의 결과와 다릅니다. 설명서를 읽었으며 BITMAPINFOHEADER의 biCompression (BI_RGB 및 BI_BITFIELDS) 및 biClrUsed (0/3) 매개 변수로 작업했습니다. 나는 그들의 가치에 따라 약간의 차이를 볼 수 있지만, 결과는 내가 기대하는 것과는 여전히 다르다.StretchDIBits를 사용할 때 색이 잘못됨

다음 코드는 내가 사용하고있는 코드입니다 (문제를 설명하기 위해 템플릿 SDI 프로젝트의 OnDraw 메서드에 삽입 할 수 있습니다).

void CTestStretchDIBitsView::OnDraw(CDC* /*pDC*/) 
{ 
    ... 

    CClientDC dc(this); 
    CRect rect; 
    GetClientRect(&rect); 

    DWORD* pBuffer = new DWORD[500 * 500]; 
    memset(pBuffer, RGB(255, 255, 0), 500 * 500 * sizeof(DWORD)); 

    LPBITMAPINFO pBmpInfo = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)]; 

    pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    pBmpInfo->bmiHeader.biWidth = 500; 
    pBmpInfo->bmiHeader.biHeight = 500; 
    pBmpInfo->bmiHeader.biPlanes = 1; 
    pBmpInfo->bmiHeader.biBitCount = 32; 
    pBmpInfo->bmiHeader.biCompression = BI_BITFIELDS; 
    pBmpInfo->bmiHeader.biSizeImage = 500 * 500; 
    pBmpInfo->bmiHeader.biXPelsPerMeter = 0; 
    pBmpInfo->bmiHeader.biYPelsPerMeter = 0; 
    pBmpInfo->bmiHeader.biClrUsed = 0; 
    pBmpInfo->bmiHeader.biClrImportant = 0; 

    SetStretchBltMode(dc.m_hDC, STRETCH_DELETESCANS); 
    StretchDIBits(dc.m_hDC, 
        0, 
        rect.Height(), 
        rect.Width(), 
        -rect.Height(), 
        0, 
        0, 
        500, 
        500, 
        pBuffer, 
        pBmpInfo, 
        DIB_RGB_COLORS, 
        SRCCOPY); 

    delete[] pBmpInfo; 
    delete[] pBuffer; 
} 

답변

0

문제는 StretchDIBits 함수에서 가져온 것이 아니라 여기서 비트 맵으로 사용 된 버퍼 초기화에서 왔습니다. memset (...) 함수를 잘못 사용했습니다. 같은 초기화와 : 예상대로

int Color = RGB(255, 0, 0); 

for (int i = 0 ; i < 500 * 500 ; i++) 
    pBuffer[i] = Color; 

나는 완벽 파란색 이미지를 얻을.

0

당신은 하프 톤은 내 연구에 따라 최적의 모드이기 때문에 다음과 같은 모드 대신

SetStretchBltMode(dc.m_hDC, STRETCH_DELETESCANS); 

SetStretchBltMode(hdcWindow,HALFTONE);

을 사용해야합니다.

관련 문제