Наложение двух или более растровых изображений для отображения в Picturebox (C#)
в моей программе на C# у меня есть Picturebox, в котором я хочу показать поток видео (последовательные кадры). Я получаю необработанные данные, которые затем преобразую в растровое изображение или изображение. Я могу показать одно изображение за раз без проблем (для воспроизведения видео).
теперь моя проблема в том, что я хочу объединить 2 или более растровых изображений (например, слои) с одинаковым размером и Альфа-значениями (ARGB) и показать его на picturebox.
Я прочитал много веб-сайтов и сообщений здесь на SO, но многие используют класс Graphics, и я просто не могу нарисовать его в своем приложении (очень вероятно, потому что я новичок в C#! и у меня уже есть настройка программы, поэтому я не хотел менять структуру).
что мне нужно (знать):
- как наложить два или более растровых изображений с Альфа-значениями;
- отсутствие манипуляции пиксела пожалуйста, не может позволять эту цену в представлении.
большое спасибо в вперед!
Примечание: Я думаю, что этот вопрос не должен быть отмечен (или закрыт) как дубликат, потому что все, что я нашел в 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.