覆盖两个或多个位图以显示在Picturebox (c#)中
本文关键字:显示 Picturebox 两个 覆盖 位图 | 更新日期: 2023-09-27 17:54:23
在我的c#程序中,我有一个Picturebox,我想在其中显示视频流(连续帧)。我接收原始数据,然后将其转换为位图或图像。我可以一次显示一个图像而没有问题(再现视频流)。
现在我的问题是,我想合并2或更多位图(如图层)具有相同的大小和alpha值(ARGB),并显示在图片框。
我在这里读过很多网站和帖子,但是很多人使用图形类,我只是不能在我的应用程序上画它(很可能是因为我是c#新手!)并且已经有了我的程序设置,所以我不想改变结构)。
我需要(知道):
- 如何用alpha值覆盖两个或多个位图;
- 请不要进行像素操作,我们承受不起这样的性能成本。
提前谢谢你!
注:我认为这个问题不应该被标记(或关闭)为重复的,因为我在SO中发现的一切都是通过像素操作或通过图形类完成的。(但我可能错了!)
编辑:可能的解决方法(不是问题的解决方案)
在一个图片框问题,第四个答案(来自用户comecme)告诉我有两个图片框,一个在另一个上面。我唯一需要做的(额外的)事情是:
private void Form1_Load(object sender, EventArgs e)
{
pictureBox2.Parent = pictureBox1;
}
其中pictureBox2将是顶部的。
我不认为这是这个问题的答案,因为我认为这是一个解决方案(特别是因为有超过10个图片框似乎不理想!lol)。这就是为什么我将保留这个问题,等待真正的回答我的问题。
编辑:解决!
这是我的问题的真正的答案。
1)使用List<Bitmap>
来存储你想要混合的所有图像;
2)创建一个新的位图来保存最终的图像;
3)使用using
语句在最终图像的graphics
上绘制每个图像。
代码:
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();
credit go to Brandon Cannaday in this technology .pro网页