Не удается отобразить растровое изображение с более высоким разрешением, чем область CDC - PullRequest
2 голосов
/ 14 мая 2010

Привет, дорогие гуру и опытные программисты.

Я не собираюсь начинать с новичка и не очень разбираюсь в имиджевом программировании, но, к сожалению, это факты: (

Я пытаюсь отобразить изображение из растрового указателя * ImageData, который имеет разрешение 1392x1032. Я пытаюсь нарисовать это в области разрешения или размера 627x474.

Однако повторные попытки, похоже, не работают. Это работает, когда я изменяю растровое изображение, которое я создал, с ширины и высоты * ImageData на разрешение или размер около 627x474

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

pDC - это CDC *, а memDC - это CDC, инициализированный ранее. Все, что здесь не было инициализировано, было инициализировано другими методами.

Вот мой код, дорогие смиренные гуру. Дай мне руководство, которое Йода и Оби-Ван предоставили Люку Скайуокеру.

void DemoControl::ShowImage( void *ImageData )
{


    int Width; //Width of Image From Camera
    int Height; //Height of Image From Camera

    int m_DisplayWidth = 627 ;//width of rectangle area to display
    int m_DisplayHeight = 474;//height of rectangle area to display

    GetImageSize( &Width, &Height ) ; //this will return Width = 1392, Height 1032

    CBitmap bitmap;

    bitmap.CreateBitmap(Width,Height,32,1,ImageData);

    CBitmap* pOldBitmap = memDC.SelectObject((CBitmap*)&bitmap);

    pDC->BitBlt(22, 24, 627, 474, &memDC, 0, 0, SRCCOPY);

    memDC.SelectObject((CBitmap*)pOldBitmap);

    ReleaseDC(pDC);

}

Хорошо, вот некоторые дополнительные детали

Думаю, мне следует объяснить, как проходит поток.

(a) Класс (скажем, класс DemoTestingDlg) передаст CDC, как показано ниже, другому классу (скажем, класс DemoControl)

m_Demo = new DemoControl ; 

m_Demo->Initialisation( this, this->GetDC() ) ; 

(b) В классе DemoControl

bool DemoControl :: Initialisation (CDemoTestingDlg m_FormControl, CDC m_StaticDisplay) {

          pDC = m_StaticDisplay ; 
          memDC.CreateCompatibleDC(pDC); 

}

pDC и memDC как таковые в шапке:

CDC* pDC ; CDC memDC; 

(c) Если предположим, что изображение захвачено, указатель изображения передается в класс DemoTestingDlg, который впоследствии вызовет метод showImage в классе управления демонстрацией, который является методом, который я написал в вопросе. Я делаю это правильно?

Примечание: оно показывало изображение, если, скажем, они имеют одинаковый размер (под ними я подразумеваю CDC и растровое изображение), поэтому у меня сложилось впечатление, что мой указатель CDC был передан правильно

Ответы [ 2 ]

1 голос
/ 14 мая 2010

StretchBlt твой друг:)

Редактировать: ОК, как вы получаете pDC? Когда вызывается ваша функция? Форма OnPaint или DrawItem?

Это StretchBlt, который я делаю из вызова DrawItem в переопределенной CStatic.

HDC hBitmapDC   = CreateCompatibleDC( pDrawItemStruct->hDC );

HBITMAP hBitmap = GetBitmap();
HGDIOBJ hOld    = SelectObject( hBitmapDC, (HGDIOBJ)hBitmap );

StretchBlt( pDrawItemStruct->hDC, pDrawItemStruct->rcItem.left, pDrawItemStruct->rcItem.top, pDrawItemStruct->rcItem.right, pDrawItemStruct->rcItem.bottom,
            hBitmapDC, 0, 0, 4, 4, SRCCOPY );

SelectObject( hBitmapDC, hOld );
DeleteObject( hBitmapDC );

Он не использует классы MFC для растягивания растрового изображения 4x4 в большее пространство, но работает отлично. Я предполагаю, что вы не делаете это в ответ на WM_PAINT / WM_DRAWITEM и / или используете неправильный DC.

Редактировать повторно: Вы вызываете DrawImage из вызова OnPaint или DrawItem?

Я бы подумал, что вам лучше не кэшировать этот CDC и передавать CDC каждый раз, когда вы хотите его нарисовать.

0 голосов
/ 14 мая 2010

"из растрового указателя * ImageData с разрешением 1392x1032"

Нет, это не размер 1392x1032. Разрешение - это количество дискретных визуальных единиц на расстоянии.

В любом случае, как было упомянуто выше, вам нужно разместить больше кода. Покажите хотя бы OnPaint (). Где вы создаете экземпляр CPaintDC? Создайте новый проект и поместите туда весь свой код, чтобы у вас был минимальный набор тестов, в котором обнаружена проблема. Похоже, вы находитесь на правильном пути, если вы используете StretchBlt () вместо BitBlt (), который вы используете сейчас.

...