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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top