 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Lun 17 Abr, 2017 7:06 pm Asunto: Mascaras fotomontage |
|
|
Hola buen día!!!
quisiera poder utilizar mascaras para hacer recortes y poder hacer fotomontages, tengo el siguiente código que elabore con la ayuda de estas dos paginas, aunque es un poco lento y solo elabora la mascara con dos colores negro y blanco
http://delphiallimite.blogspot.mx/2007/10/como-dibujar-sprites-transparentes.html
http://www.sromero.org/ext/articulos/gfx/graf6.html
| Código: | std::auto_ptr<Graphics> bmpM(new Graphics::TBitmap);
Graphics::TBitmap* bmpD = IDestino->Picture->Bitmap;
bmpM->PixelFormat = pf32bit;
bmpD->PixelFormat = pf32bit;
TRect RMont;
bmpM->Canvas->Draw(0,0,IOrigen->Picture->Graphic);
bmpM->Width = IOrigen->Picture->Width;
bmpM->Height = IOrigen->Picture->Height;
//Obtener color de transparencia
TColor ColorTransparente = IOrigen->Canvas->Pixels[bmpM->Width / 2][bmpM->Height / 2];
//Recorrido de verificacion de color transparencia
for (int j = 0; j <IOrigen>Picture->Height + 2;j++){
for (int i = 0; i <IOrigen>Picture->Width + 2;i++){
//Decicion para creacion de mascara
if (IOrigen->Canvas->Pixels[i][j] == ColorTransparente){
IOrigen->Canvas->Pixels[i][j] = 0;
bmpM->Canvas->Pixels[i][j] = RGB( 255, 255, 255 );
}
else
bmpM->Canvas->Pixels[i][j] = RGB( 0, 0, 0 );
}
}
//Ver Mascara creada
IMask->Picture->Assign(bmpM.get());
IMask->Repaint();
//Codigo de recorte no lo entiendo muy bien :)
bmpD->Canvas->CopyMode = cmSrcAnd;
bmpD->Canvas->Draw(0,0, bmpM.get());
//Prueba para agregar texto en canvas sin borde
/*bmpD->Canvas->Brush->Color = clBlack;
bmpD->Canvas->Font = Label1->Font;
bmpD->Canvas->Font->Size = Label1->Font->Size;
bmpD->Canvas->TextOutW(50,50,Label1->Caption);*/
bmpD->Canvas->CopyMode = cmSrcPaint;
bmpD->Canvas->Draw( 0,0, IOrigen->Picture->Graphic );
//Ver montaje final
IDestino->Picture->Assign(bmpD);
IDestino->Refresh(); |
_________________ [code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1] |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 17 Abr, 2017 9:06 pm Asunto: |
|
|
DrawTransparent
La máscara en un bitmap de dos planos en blanco y negro es la más eficiente:
| Código: |
void DrawTransparent(HDC DC, int Left, int Top, HBITMAP hImage, COLORREF TrColor)
{
HBITMAP hMask;
HDC dcImage, dcMask;
BITMAP Bitmap;
// Crear la máscara:
// Crer bitmap monocromo: mask
GetObject(hImage, sizeof(BITMAP), &Bitmap);
hMask = CreateBitmap(Bitmap.bmWidth, Bitmap.bmHeight, 1, 1, 0);
dcImage = CreateCompatibleDC(0);
dcMask = CreateCompatibleDC(0);
SelectObject(dcImage, hImage);
SelectObject(dcMask, hMask);
// Creamos el MaskBitmap según el TrColor
SetBkColor(dcImage, TrColor);
BitBlt(dcMask, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, dcImage, 0, 0, SRCCOPY);
// Dibujar transparente
BitBlt(DC, Left, Top, Bitmap.bmWidth, Bitmap.bmHeight, dcImage, 0,0, SRCINVERT);
BitBlt(DC, Left, Top, Bitmap.bmWidth, Bitmap.bmHeight, dcMask, 0,0, SRCAND);
BitBlt(DC, Left, Top, Bitmap.bmWidth, Bitmap.bmHeight, dcImage, 0,0, SRCINVERT);
// Liberar los HDC y la Mascara hMask
DeleteDC(dcImage);
DeleteDC(dcMask);
DeleteObject(hMask);
}
|
Saludos. |
|
| Volver arriba |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Lun 17 Abr, 2017 9:28 pm Asunto: |
|
|
Gracias por las respuestas Escafandra!!! un saludo...
| Código: | COLORREF TrColor;
// Para compatibilizar los Bitmap podemos pasarlo a 32 bits
IDestino->Picture->Bitmap->PixelFormat = pf32bit;
// Tomamos un color que será el transparente
TrColor = IOrigen->Picture->Bitmap->Canvas->Pixels[IOrigen->Picture->Width/2 ][IOrigen->Picture->Height/2];
// Dibujamos
DrawTransparent(IDestino->Canvas->Handle, 0,0, IOrigen->Picture->Bitmap->Handle, TrColor); |
_________________ [code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1] |
|
| Volver arriba |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Vie 05 May, 2017 6:33 pm Asunto: |
|
|
Hola de nuevo! el código funciona excelente y es muy rápido, solo tengo curiosidad en saber si es posible utilizar imágenes de tipo png por el tamaño de archivo los bmp me cubren mucho espacio de hasta 1GB en total.
y al convertirlos hay pixeles que no se borran al hacer el montage por el cambio de colores
_________________ [code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1] |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 19 May, 2017 7:55 pm Asunto: |
|
|
Puedes usar cualquiler formato gráfico. Ten en cuenta que Windows al final maneja Bitmaps mediante un HBITMAP que es lo que usarás en la función DrawTransparent.
El problema de colores semejantes que no iguales, va a hacer interferencias. Eso se puede resolver escaneando la imagen para ajustar esos colores a un mismo valor de transparencia
Saludos. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|