Ir ao conteúdo

bitblt() com mascaras


Cambalinho

Posts recomendados

Postado

eu fiz esta funçao para me mostrar imagens transparentes. mas devo ter feito algo errado, porque a imagem nao é mostrada:(

o objectivo deste codigo é mostrar a imagem transparente.

void DrawTransparentBitmap(HDC hdcDest, char *filename, int x, int y,COLORREF a )
{
int posx=0;
int posy=0;
HBITMAP image;
BITMAP bm;
HDC hdcMem;
HDC hdcMemmask;

COLORREF b;

//copiar a imagem para image
image = (HBITMAP)LoadImage(0, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(image, sizeof(BITMAP), &bm);
hdcMem = CreateCompatibleDC(hdcDest);
SelectObject(hdcMem, image);

//copio a image para o hdcMemmask
//'hdcMemmask=hdcMem
hdcMemmask = CreateCompatibleDC(hdcDest);
SelectObject(hdcMemmask, image);

//se a cor b for igual á cor a(cor que tem de ser transparente)
//a cor da mascara tem de ser branca
//caso contrario é preta
for (posy=0;posy<bm.bmHeight;posy++)
{
for (posx=0;posx<bm.bmWidth ;posx++)
{
b=GetPixel(hdcMemmask,posx,posy);
if (b==a)
SetPixel(hdcMemmask,posx,posy,RGB(255,255,255));
else
SetPixel(hdcMemmask,posx,posy,RGB(0,0,0));
}
}

//esta parte copia a imagem com a mask(fazendo a transparencia)
//1 - bitblt com bitmap vbSrcInvert
//1 - bitblt com bitmap mask vbSrcAnd
//1 - bitblt com bitmap vbSrcInvert
BitBlt(
hdcDest,
x, y,
bm.bmWidth, bm.bmHeight,
hdcMem,
0, 0,
SRCINVERT);
BitBlt(
hdcDest,
x, y,
bm.bmWidth, bm.bmHeight,
hdcMemmask,
0, 0,
SRCAND);
BitBlt(
hdcDest,
x, y,
bm.bmWidth, bm.bmHeight,
hdcMem,
0, 0,
SRCINVERT);


DeleteDC(hdcMem);
DeleteDC(hdcMemmask);
DeleteObject((HBITMAP)image);
}

talvez o meu problema seja no inicio(quando copio as imagens) mas nao sei. alguem me explicar o que fiz mal?

Postado

tenho de admitir que para quem estar aprender C(por iniciativa propria) estou a fazer progressos hehehe

i'm good(eu sou bom) hehehehe

finalmente corrigi a minha funçao de transparencia:

void DrawTransparentBitmap(HDC hdcDest, char *filename, int x, int y,COLORREF a )
{
//posiçoes no ciclo for
int posx=0;
int posy=0;

//para comparar os pixels
COLORREF b;

//a imagem normal
HBITMAP image;
BITMAP bm;
HDC hdcMem;

//a mascara da imagem
HBITMAP imagemask;
BITMAP bmmask;
HDC hdcMemmask;



//criar 1 imagem normal do ficheiro
image = (HBITMAP)LoadImage(0, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(image, sizeof(BITMAP), &bm);
hdcMem = CreateCompatibleDC(hdcDest);
SelectObject(hdcMem, image);

//criar 1 imagem normal do ficheiro para fazer a mascara
imagemask= (HBITMAP)LoadImage(0, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(imagemask, sizeof(BITMAP), &bmmask);
hdcMemmask = CreateCompatibleDC(hdcDest);
SelectObject(hdcMemmask, imagemask);

//if a is -1, isso quer dizer que o pixel 0,0 - Automatico
if (a==-1) a=GetPixel(hdcMemmask,0,0);


//se a cor b for igual á cor a(cor que tem de ser transparente)
//a cor da mascara tem de ser branca
//caso contrario é preta
for (posy=0;posy<bm.bmHeight;posy++)
{
for (posx=0;posx<bm.bmWidth ;posx++)
{
b=GetPixel(hdcMemmask,posx,posy);
if (b==a)
SetPixel(hdcMemmask,posx,posy,RGB(255,255,255));
else
SetPixel(hdcMemmask,posx,posy,RGB(0,0,0));
}
}

//esta parte copia a imagem com a mask(fazendo a transparencia)
//1 - bitblt com bitmap vbSrcInvert
//1 - bitblt com bitmap mask vbSrcAnd
//1 - bitblt com bitmap vbSrcInvert
BitBlt(
hdcDest,
x, y,
bm.bmWidth, bm.bmHeight,
hdcMem,
0, 0,
SRCINVERT);
BitBlt(
hdcDest,
x, y,
bm.bmWidth, bm.bmHeight,
hdcMemmask,
0, 0,
SRCAND);
BitBlt(
hdcDest,
x, y,
bm.bmWidth, bm.bmHeight,
hdcMem,
0, 0,
SRCINVERT);

//temos de apagar os DC's e os objectos

//quando usamos CreateCompatibleDC() temos de usar o DeleteDC()
//para apagar o resultado do CreateCompatibleDC()
DeleteDC(hdcMem);
DeleteDC(hdcMemmask);

//quando usamos SelectObject() temos de usar o DeleteObject()
//para apagar o resultado do DeleteObject()
//neste caso o resultado de LoadImage()
DeleteObject((HBITMAP)image);
DeleteObject((HBITMAP)imagemask);
}

eis como se usa:

DrawTransparentBitmap(a,"C:\\test\\Bleu Battle.bmp",0,0,-1);

- 'a' é o HDC da propria janela


HWND foco;
HDC a;
foco = GetForegroundWindow();
a=GetDC( foco);

- A string é a pasta e nome do ficheiro(em C as strings levam '\\' para representar o proprio '\';)

- O 0,0 é a posiçao da imagem.

- e o -1 é para dizer que a cor de transparencia vai ser o pixel 0,0.

obrigado por tudo

(aceito comentarios e perguntas)

agora vocês tem 1 pergunta: porque '-1' na escolha de cor?

é para designar que é automatico e assim usa o pixel 0,0 da propria imagem.

  • Moderador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!