Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Mascaras fotomontage

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Mascaras fotomontage Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
escafandra escribió:
DrawTransparent

_________________
[code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1]
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.