Наложение двух или более растровых изображений для отображения в Picturebox (C#)

в моей программе на C# у меня есть Picturebox, в котором я хочу показать поток видео (последовательные кадры). Я получаю необработанные данные, которые затем преобразую в растровое изображение или изображение. Я могу показать одно изображение за раз без проблем (для воспроизведения видео).

теперь моя проблема в том, что я хочу объединить 2 или более растровых изображений (например, слои) с одинаковым размером и Альфа-значениями (ARGB) и показать его на picturebox.

Я прочитал много веб-сайтов и сообщений здесь на SO, но многие используют класс Graphics, и я просто не могу нарисовать его в своем приложении (очень вероятно, потому что я новичок в C#! и у меня уже есть настройка программы, поэтому я не хотел менять структуру).

что мне нужно (знать):

  1. как наложить два или более растровых изображений с Альфа-значениями;
  2. отсутствие манипуляции пиксела пожалуйста, не может позволять эту цену в представлении.

большое спасибо в вперед!

Примечание: Я думаю, что этот вопрос не должен быть отмечен (или закрыт) как дубликат, потому что все, что я нашел в SO, делается либо с помощью пиксельной манипуляции, либо через класс графики. (но я могу ошибаться!)

EDIT: возможный обходной путь (не решение вопроса)
В Проблема С PictureBox, 4-й ответ (от пользователя comecme) говорит мне иметь 2 picturebox, один поверх другого. Единственный (дополнительно), что я должен был сделать, чтобы заставить его работать с этим подходом:

private void Form1_Load(object sender, EventArgs e)
{
    pictureBox2.Parent = pictureBox1;
}

где pictureBox2 будет сверху.

Я не буду считать это ответом на эту проблему, потому что я считаю это обходным путем (особенно потому, что наличие более 10 pictureboxes не кажется идеальным! lol). Вот почему я оставлю этот вопрос открытым в ожидании реальные ответа на мой вопрос.

изменить: решено! проверь мой ответ.

1 ответов


здесь реальные ответа на мою проблему.
1) Использовать List<Bitmap> для хранения всех изображений, которые вы хотите смешать;
2) создать новое растровое изображение для удержания конечного изображения;
3) нарисуйте каждое изображение поверх конечного изображения graphics С помощью using заявление.

код:

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();

кредиты идут в Брэндон Cannaday на эта технология.pro webpage.