Не удается отобразить растровое изображение с более высоким разрешением, чем область 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(), который вы используете сейчас.