c# - para - como usar bitmap
Superposición de dos o más mapas de bits para mostrar en Picturebox(C#) (1)
En mi programa C # tengo un Picturebox en el que quiero mostrar una secuencia de video (cuadros consecutivos). Recibo datos en bruto, que luego transformo en mapa de bits o imagen. Puedo mostrar una imagen a la vez sin problemas (para reproducir la transmisión de video).
Ahora mi problema es que quiero fusionar 2 o más mapas de bits (como capas) con el mismo tamaño y valores alfa (ARGB) y mostrarlos en la caja de imágenes .
He leído muchos sitios web y publicaciones aquí en SO, pero muchos usan la clase Graphics, y simplemente no puedo dibujar en mi aplicación (¡muy probablemente porque soy nuevo en C #! Y ya tengo la configuración de mi programa, así que no quería cambiar la estructura).
Lo que necesito (saber):
- Cómo superponer dos o más mapas de bits con valores alfa;
- NO manipulación de píxeles, por favor, no puede permitirse ese costo en rendimiento.
¡Muchas gracias de antemano!
NOTA: Creo que esta pregunta no debe marcarse (o cerrarse) como duplicada, porque todo lo que encontré en SO se hace con la manipulación de píxeles o con la clase Graphics. (¡pero podría estar equivocado!)
EDITAR: Posible solución (NO es la solución a la pregunta )
En un problema de PictureBox , la cuarta respuesta (del usuario comecme) me dice que tengo 2 cuadros, uno encima del otro. La única (extra) cosa que tuve que hacer para que funcione con este enfoque fue:
private void Form1_Load(object sender, EventArgs e)
{
pictureBox2.Parent = pictureBox1;
}
Donde pictureBox2 será el que está en la parte superior.
No lo consideraré una respuesta a este problema, porque lo considero una solución alternativa (¡especialmente porque tener más de 10 cuadros de imagen no parece ideal!). Es por eso que dejaré esta pregunta abierta esperando una respuesta real a mi pregunta.
EDITAR: ¡Resuelto! revisa mi respuesta.
Aquí está la respuesta real a mi problema.
1) Use una List<Bitmap>
para almacenar todas las imágenes que desea combinar;
2) Crea un nuevo mapa de bits para contener la imagen final;
3) Dibuja cada imagen sobre los graphics
la imagen final usando la instrucción using
.
El código:
List<Bitmap> images = new List<Bitmap>();
Bitmap finalImage = new Bitmap(640, 480);
...
//For each layer, I transform the data into a Bitmap (doesn''t matter what kind of
//data, in this question) and add it to the images list
for (int i = 0; i < nLayers; ++i)
{
Bitmap bitmap = new Bitmap(layerBitmapData[i]));
images.Add(bitmap);
}
using (Graphics g = Graphics.FromImage(finalImage))
{
//set background color
g.Clear(Color.Black);
//go through each image and draw it on the final image (Notice the offset; since I want to overlay the images i won''t have any offset between the images in the finalImage)
int offset = 0;
foreach (Bitmap image in images)
{
g.DrawImage(image, new Rectangle(offset, 0, image.Width, image.Height));
}
}
//Draw the final image in the pictureBox
this.layersBox.Image = finalImage;
//In my case I clear the List because i run this in a cycle and the number of layers is not fixed
images.Clear();
Los créditos van a Brandon Cannaday en esta página web de tech.pro .