Не удается отобразить растровое изображение с более высоким разрешением, чем область CDC

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

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

Я пытаюсь отобразить изображение из растрового указателя *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() ) ; 

(б) в классе 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 в классе управления Demo, который является методом, который я написал в вопросе. Я делаю это правильно?

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

2 ответа

Решение

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.

Edit re your edit: Вы тогда вызываете DrawImage из вызова OnPaint или DrawItem?

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

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

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

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

Другие вопросы по тегам