Fusionando JPG con GDI en C #

votos
2

Mi escenario:

  • Tengo una imagen de fondo de color JPG.
  • Tengo un texto negro sobre fondo blanco JPG.
  • Ambas imágenes son del mismo tamaño (alto y ancho)

Quiero superponer la imagen con texto negro y fondo blanco sobre la imagen de fondo de color, es decir, el fondo blanco se vuelve transparente para ver el fondo de color debajo de él.

¿Cómo puedo hacer esto con GDI en C #?

¡Gracias!

Publicado el 01/07/2009 a las 22:00
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
2

Gracias a GalacticCowboy pude encontrar esta solución:

using (Bitmap background = (Bitmap)Bitmap.FromFile(backgroundPath))
{
     using (Bitmap foreground = (Bitmap)Bitmap.FromFile(foregroundPath))
     {
          // check if heights and widths are the same
          if (background.Height == foreground.Height & background.Width == foreground.Width)
          {
               using (Bitmap mergedImage = new Bitmap(background.Width, background.Height))
               {
                    for (int x = 0; x < mergedImage.Width; x++)
                    {
                         for (int y = 0; y < mergedImage.Height; y++)
                         {
                              Color backgroundPixel = background.GetPixel(x, y);
                              Color foregroundPixel = foreground.GetPixel(x, y);
                              Color mergedPixel = Color.FromArgb(backgroundPixel.ToArgb() & foregroundPixel.ToArgb());
                              mergedImage.SetPixel(x, y, mergedPixel);
                          }
                    }
                    mergedImage.Save("filepath");
               }

          }
     }
}

Funciona de maravilla. ¡Gracias!

Respondida el 02/07/2009 a las 14:21
fuente por usuario

votos
1

Existe una manera más fácil y más rápida. Debe usar ImageAttributes cuando dibuje una imagen que debe ser parcialmente visible.

Image BackImage = Image.FromFile(backgroundPath);
using (Graphics g = Graphics.FromImage(BackImage))
{
    using (ForeImage = Image.FromFile(foregroundPath))
    {   
        ImageAttributes imageAttr = new ImageAttributes();
        imageAttr.SetColorKey(Color.FromArgb(245, 245, 245), Color.FromArgb(255, 255, 255),
            ColorAdjustType.Default);
        g.DrawImage(ForeImage, new Rectangle(0, 0, BackImage.Width, BackImage.Height),
            0, 0, BackImage.Width, BackImage.Height, GraphicsUnit.Pixel, imageAttr);
    }
}

El método SetColorKey hará que el color del rango especificado sea transparente, por lo que puede hacer que sus píxeles de mapa de bits blancos sean transparentes, incluidos todos los píxeles que se ven afectados por los artefactos de compresión jpeg.

Respondida el 03/07/2009 a las 12:15
fuente por usuario

votos
1

Si las imágenes son del mismo tamaño, repítelas y "Y" los colores de cada píxel. Para los píxeles blancos, debe obtener el color de la otra imagen, y para los negros debe obtener negro.

Si no son del mismo tamaño, escala primero.

Me lo estoy inventando de la cabeza, pero algo así como:

Color destColor = Color.FromArgb(pixel1.ToArgb() & pixel2.ToArgb());
Respondida el 01/07/2009 a las 22:04
fuente por usuario

votos
-1

echa un vistazo a este artículo. le da código para hacer un color específico como el color transparente en su imagen http://www.codedblog.com/2007/08/28/generating-a-transparent-gif-image-using-c/

Respondida el 01/07/2009 a las 22:06
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more