Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/106: Рейтинг темы: голосов - 106, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 38
1

Наложение изображения поверх другого изображения

08.06.2011, 14:16. Показов 20664. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дорогие форумчане!Подскажите пожалуйста, как реализовать следующую задачу:
необходимо наложить одно изображение поверх другого изображения, без применения альфаканала, то есть на одном изображении допустим есть "некто" сфотографированный на произвольного цвета фоне, необходимо наложить на этого "некто" произвольный фон(любая картинка).Я реализовал, правда только при условии что фон, на котором фотографируется этот "некто", будет только черным, а вот как сделать чтобы он был произвольного цвета, не могу придумать, подскажите плиз!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Bitmap lico = new Bitmap(pictureBox2.Image, pictureBox2.Image.Size.Width, pictureBox2.Image.Size.Height);
            
            OpenFileDialog openfon = new OpenFileDialog();
            openfon.InitialDirectory = "C:\\Program Files";
            openfon.Filter = "Bitmap files (*.bmp)|*.bmp|Jpeg files (*.jpg)|*.jpg|All files (*.*)|*.*";
            openfon.FilterIndex = 2;
            openfon.Title = "Выбрать картинку для фона";
            if (openfon.ShowDialog() == DialogResult.OK)
            {
                fon = (Bitmap)Bitmap.FromFile(openfon.FileName, false);
                Refresh();
            }
            else { fon = new Bitmap(@"C:\Program Files\MiMushi_Company\Web_Camera\j2.jpg"); }
 
            for (int x = 0; x < lico.Width; x++)
                for (int y = 0; y < lico.Height; y++)
                {
                    Color color1 = lico.GetPixel(x, y);
                    Color color2 = fon.GetPixel(x,y);
                    if(color1.R<50 ){lico.SetPixel(x,y,color2);}//здесь я определяю, что фон черного цвета, а 
                                                                   //надо любого произвольного, на котором он фоткается
                    else { lico.SetPixel(x, y, color1); }
                 }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2011, 14:16
Ответы с готовыми решениями:

Наложение полупрозрачного изображения
Функции передается 2 изображения (Bitmap) - фон и наложение. Итогом её работы должно стать новое...

Вывод изображения поверх другого изображения
Привет, как правильнее сделать такую манипуляцию нужно на картинке вывести справа вверху КРАСНЫЙ...

Отрисовка изображения поверх канвы (изображения) и вращение изображения
Здравствуйте. Столкнулся с 2умя проблемами при работе с изображениями средствами C++ Builder....

Рисование поверх другого изображения
Здравствуйте форумчане! Возник такой вопрос: Нужно рисовать поверх другого изображения, с...

8
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 38
09.06.2011, 19:16  [ТС] 2
мне вот интересно, неужели на всем этом большом форуме никто ничего не знает? или просто меня игнорят все........
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
09.06.2011, 19:57 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/// <summary>
/// Наложение 2х изображений друг на друга.
/// </summary>
/// <param name="x">1е изображение.</param>
/// <param name="y">2е изображение.</param>
/// <param name="percent">Коэффициент прозрачности (от 0 до 1).</param>
/// <returns>Результат наложения двух изображений.</returns>
Bitmap AlphaBlending(Image x, Image y, float percent) {
    if (percent < 0f || percent > 1f)
        throw new ArgumentOutOfRangeException();
 
    if (x == null || y == null)
        throw new NullReferenceException();
 
    Bitmap bmp = new Bitmap(
        Math.Max(x.Width, y.Width),
        Math.Max(x.Height, y.Height)
        );
 
    var cm = new ColorMatrix(
        new float[][] {
            new float[] { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f },
            new float[] { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f },
            new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f },
            new float[] { 0.0f, 0.0f, 0.0f, percent, 0.0f },
            new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }
        }
    );
 
    using(var imgAttr = new ImageAttributes()) {
        imgAttr.SetColorMatrix(cm, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
 
        using(var g = Graphics.FromImage(bmp)) {
            g.DrawImage(x, 0, 0, x.Width, x.Height);
            g.DrawImage(
                y,
                new Rectangle(0, 0, y.Width, y.Height),
                0, 0, y.Width, y.Height,
                GraphicsUnit.Pixel,
                imgAttr
                );
        }
    }
 
    return bmp;
}
1
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 38
10.06.2011, 18:13  [ТС] 4
это не то и к тому же я кажется писал, что надо бы без использования альфа канала и мне кажется я видел этот код на MSDN...может будут другие предложения?.....Желательно чтобы было попиксельное сравнение, скорость неважна......может можно как-то подправить мой пример и все?помогите плизззззз!!!!!!!! я же знаю, что здесь есть умные люди.....
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.06.2011, 18:17 5
kill_s, когда кажется - креститься надо. Если Вы не понимаете код, то это Ваши проблемы. Код прекрасно работает с изображениями которые не имеют альфа канала.
Цитата Сообщение от kill_s Посмотреть сообщение
Желательно чтобы было попиксельное сравнение
А для того чтобы это сказать раньше, Вам видимо чего-то не хватило...
Цитата Сообщение от Правила форума, п. 2.6.
Как можно более полно описывайте суть проблемы или вопроса, что было сделано для ее решения и какие результаты получены.
Каков вопрос, такой и ответ...
0
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 38
10.06.2011, 19:38  [ТС] 6
понятно, намеки пошли......есть еще люди, знающие программирование ?

Добавлено через 28 минут
хотя бы можно сказать, куда этот код вставить, ведь все таки начинающий программист.....
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.06.2011, 19:56 7
Лучший ответ Сообщение было отмечено как решение

Решение

VS 2010 Project
Вложения
Тип файла: rar WindowsFormsApplication22.rar (38.2 Кб, 318 просмотров)
3
185 / 188 / 17
Регистрация: 26.11.2010
Сообщений: 511
10.06.2011, 20:14 8
Цитата Сообщение от SSTREGG Посмотреть сообщение
kill_s, когда кажется - креститься надо. Если Вы не понимаете код, то это Ваши проблемы. Код прекрасно работает с изображениями которые не имеют альфа канала..
Четвертый коэффициент в ColorMatrix - это альфа, не дурите человека.
2
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.06.2011, 21:42 9
Killster, действительно, ошибся...
kill_s, извините.

ADD:
Вот, без альфа канала. Замените аналогичные методы в проекте:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        /// <summary>
        /// Наложение 2х изображений друг на друга.
        /// </summary>
        /// <param name="x">1е изображение.</param>
        /// <param name="y">2е изображение.</param>
        /// <returns></returns>
        Bitmap AlphaBlending(Bitmap x, Bitmap y, byte s) {
            if (x == null || y == null)
                throw new NullReferenceException();
 
            Bitmap bmp = new Bitmap(
                Math.Min(x.Width, y.Width),
                Math.Min(x.Height, y.Height),
                PixelFormat.Format24bppRgb
                );
 
            Color clr0, clr1;
 
            for (int _x = 0; _x < bmp.Width; _x++)
                for (int _y = 0; _y < bmp.Height; _y++) {
                    clr0 = x.GetPixel(_x, _y);
                    clr1 = y.GetPixel(_x, _y);
                    bmp.SetPixel(_x, _y,
                        Color.FromArgb(
                            Math.Min(255, clr0.R * (255 - s) / 255 + clr1.R * s / 255),
                            Math.Min(255, clr0.G * (255 - s) / 255 + clr1.G * s / 255),
                            Math.Min(255, clr0.B * (255 - s) / 255 + clr1.B * s / 255)
                        )
                    );
                }
            return bmp;
        }
 
        private void button1_Click ( object sender, EventArgs e ) {
            using (var img0 = (Bitmap)Image.FromFile(textBox1.Text))
            using (var img1 = (Bitmap)Image.FromFile(textBox2.Text))
            using (var bmp = AlphaBlending(img0, img1, (byte)trackBar1.Value)) {
                using (var sfd = new SaveFileDialog()) {
                    if (sfd.ShowDialog() == DialogResult.OK)
                        bmp.Save(sfd.FileName, ImageFormat.Jpeg);
                }
            }
        }
Добавлено через 1 час 9 минут
ADD:
unsafe версия, работает в разы быстрее )
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
        /// <summary>
        /// Наложение 2х изображений друг на друга.
        /// </summary>
        /// <param name="x">1е изображение.</param>
        /// <param name="y">2е изображение.</param>
        /// <returns></returns>
        unsafe Bitmap AlphaBlendingUnsafe(Bitmap x, Bitmap y, byte s) {
            if (x == null || y == null)
                throw new NullReferenceException();
 
            if (x.PixelFormat != PixelFormat.Format24bppRgb ||
                y.PixelFormat != PixelFormat.Format24bppRgb)
 
                throw new ArgumentException();
 
            var rect = new Rectangle(0, 0, Math.Min(x.Width, y.Width), Math.Min(x.Height, y.Height));
 
            Bitmap bmp = new Bitmap(
                rect.Width,
                rect.Height,
                PixelFormat.Format24bppRgb
                );
 
            var bd = bmp.LockBits(rect, ImageLockMode.WriteOnly, bmp.PixelFormat);
            var bd0 = x.LockBits(rect, ImageLockMode.ReadOnly, x.PixelFormat);
            var bd1 = y.LockBits(rect, ImageLockMode.ReadOnly, y.PixelFormat);
 
            byte* pBmp = (byte*)bd.Scan0;
            byte* pX   = (byte*)bd0.Scan0;
            byte* pY   = (byte*)bd1.Scan0;
 
            byte* pEnd = pBmp + bd.Stride * bd.Height;
 
            while (pBmp != pEnd) {
                *pBmp = (byte)(*pX * (255 - s) / 255 + *pY * s / 255);
                *(pBmp + 1) = (byte)(*(pX + 1) * (255 - s) / 255 + *(pY + 1) * s / 255);
                *(pBmp + 2) = (byte)(*(pX + 2) * (255 - s) / 255 + *(pY + 2) * s / 255);
 
                pBmp += 3;
                pX += 3;
                pY += 3;
            }
 
            bmp.UnlockBits(bd);
            x.UnlockBits(bd0);
            y.UnlockBits(bd1);
            return bmp;
        }
1
10.06.2011, 21:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2011, 21:42
Помогаю со студенческими работами здесь

Вывод одного изображения поверх другого
Снова здравствуйте! Прошу подсказать вот какую вещь. Есть два изображения, например: белый круг...

Как разместить изображение из Label поверх другого изображения?
а у меня возник вопрос! как разместить изображение из Label поверх другого изображения? мне нужно,...

Не получается вставить изображение поверх другого изображения в email письме
Здравствуйте. Верстаю html-письмо. Есть два изображения: первое с линиями, а второе с двумя...

Как добиться качественного рисования изображения поверх изображения picturebox?
есть код: PictureBox p = (PictureBox)sender; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru