Não é possível exibir bitmap de maior resolução do que a área do CDC
Pergunta
Olá, queridos gurus e codificadores especializados.
Eu não vou começar com sou um novato e não sei muito sobre programação de imagens, mas infelizmente esses são os fatos :(
Estou tentando exibir uma imagem de um ponteiro de bitmap *IMAGEDATA, que é da resolução 1392x1032. Estou tentando desenhar isso em uma área de resolução ou tamanho 627x474.
No entanto, a tentativa repetida não parece funcionar. Funciona quando eu mudo a imagem do bitmap que criei de *imagem e altura de imagem para resolução ou tamanho de cerca de 627x474
Eu realmente não sei como resolver isso depois de tentar todas as soluções possíveis de vários fóruns e Google.
O PDC é um CDC* e o MEMDC é um CDC inicializado em um método anterior, qualquer coisa que não seja inicializada aqui foi inicializada em outros métodos.
Aqui está o meu código querido gurus humilde. Forneça-me orientação Yoda e Obi-Wan fornecidos a Luke Skywalker.
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);
}
Ok, aqui estão algumas partes adicionais
Eu acho que devo explicar como vai o fluxo.
(a) Uma classe (digamos a classe DemotestingDLG) passará o CDC como abaixo para outra classe (digamos a classe de democontrol)
m_Demo = new DemoControl ;
m_Demo->Initialisation( this, this->GetDC() ) ;
(b) Na classe Democontrol
Bool Democontrol :: Inicialização (CDemotestingdlg M_FORMCONTROL, CDC m_staticDisplay) {
pDC = m_StaticDisplay ;
memDC.CreateCompatibleDC(pDC);
}
PDC e MEMDC são como tal no cabeçalho:
CDC* pDC ; CDC memDC;
(c) Se, digamos, uma imagem é capturada, o ponteiro da imagem será passado para a classe DemotestingDLG, que posteriormente chamará um método Showimage na classe Demo Control, que é o método que escrevi na pergunta. Eu estou fazendo a coisa certa?
Nota: Ele mostrou uma imagem se, digamos, eles são do mesmo tamanho (por eles quero dizer o CDC e o bitmap), então eu estava com a impressão de que meu ponteiro do CDC foi passado corretamente
Solução
Stretchblt é seu amigo :)
EDIT: Ok, como você consegue PDC? Quando sua função é chamada? Formulário ou drawitem?
Este é um alongamento que eu faço de uma chamada de drawitem em um cStatic excedente.
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 );
Não está usando as classes MFC para esticar um bitmap 4x4 em um espaço maior, mas funciona perfeitamente. Meu palpite é que você não está fazendo isso em resposta a um wm_paint/wm_drawitem e/ou está usando o DC errado.
Editar re e editar: você chama o DrawImage de dentro de uma chamada de Paint ou DrawItem?
Eu pensaria que você é melhor não cachear esse CDC e passar o CDC a cada vez que deseja desenhá -lo.
Outras dicas
"De um ponteiro de bitmap *Imagemata que é da resolução 1392x1032"
Não, não é, é de Tamanho 1392x1032. Resolução é a quantidade de unidades visuais discretas por distância.
De qualquer forma, como foi mencionado acima, você precisa postar mais código. Mostre pelo menos onpaint (). Onde você está instanciando o cpaintdc? Faça um novo projeto e coloque todo o seu código lá, para que você tenha um conjunto de testes mínimos que exiba o problema. Você parece estar aproximadamente no caminho certo, se você usar Stretchblt () no lugar do bitblt () que está usando agora.