es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué la función TransparentBlt no puede funcionar en una imagen bmp con un fondo negro?

Quiero incrustar una imagen con fondo negro en otra imagen de bosques verdes. Pero descubrí que la función TransparentBlt() no puede funcionar. Mientras incrusto una imagen con fondo blanco, la función trabaja adecuadamente. ¿Por qué?

Este es mi código:

HBITMAP hbm = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, 1280, 720, LR_LOADFROMFILE);
HBITMAP hbm3 = (HBITMAP)LoadImage(NULL, L"character3.bmp", IMAGE_BITMAP, 535, 650, LR_LOADFROMFILE);
HBITMAP hbm5 = (HBITMAP)LoadImage(NULL, L"character5.bmp", IMAGE_BITMAP, 276, 418, LR_LOADFROMFILE);
HDC memdc = CreateCompatibleDC(hdc); 
SelectObject(memdc, hbm); 
BitBlt(hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, memdc, 0, 0, SRCCOPY); 
SelectObject(memdc, hbm3);
TransparentBlt(hdc, 40, 60, 506, 650, memdc, 0, 0, 535, 650, RGB(0,0,0));
SelectObject(memdc, hbm5);
TransparentBlt(hdc, 40, 60, 506, 650, memdc, 0, 0, 276, 418,RGB(253,253,253));

Este es el resultado fallido:

View post on imgur.com

Este es el resultado exitoso:

View post on imgur.com

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que TransparentBlt() no funciona al incluir una imagen con fondo negro es porque el valor RGB (0,0,0) utilizado para especificar la clave de color para la transparencia también está presente en otras partes de la imagen, como en las sombras y áreas oscuras. Esto hace que esas áreas también se vuelvan transparentes, lo que resulta en una imagen distorsionada.

    Por otro lado, al incrustar una imagen con fondo blanco, el valor RGB (253,253,253) utilizado como clave de color es menos probable que aparezca en cualquier otra parte de la imagen, por lo tanto, la función aplica correctamente la transparencia solo al fondo blanco.

    Para superar este problema, se puede usar un valor de clave de color diferente que no esté presente en ninguna parte de la imagen, o se puede agregar un canal alfa a la imagen para especificar la transparencia de manera más precisa.

Comments are closed.