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

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

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

Студворк — интернет-сервис помощи студентам
Дорогие форумчане!Подскажите пожалуйста, как реализовать следующую задачу:
необходимо наложить одно изображение поверх другого изображения, без применения альфаканала, то есть на одном изображении допустим есть "некто" сфотографированный на произвольного цвета фоне, необходимо наложить на этого "некто" произвольный фон(любая картинка).Я реализовал, правда только при условии что фон, на котором фотографируется этот "некто", будет только черным, а вот как сделать чтобы он был произвольного цвета, не могу придумать, подскажите плиз!
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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.06.2011, 14:16
Ответы с готовыми решениями:

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

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

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

8
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 38
09.06.2011, 19:16  [ТС]
мне вот интересно, неужели на всем этом большом форуме никто ничего не знает? или просто меня игнорят все........
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
09.06.2011, 19:57
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  [ТС]
это не то и к тому же я кажется писал, что надо бы без использования альфа канала и мне кажется я видел этот код на MSDN...может будут другие предложения?.....Желательно чтобы было попиксельное сравнение, скорость неважна......может можно как-то подправить мой пример и все?помогите плизззззз!!!!!!!! я же знаю, что здесь есть умные люди.....
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.06.2011, 18:17
kill_s, когда кажется - креститься надо. Если Вы не понимаете код, то это Ваши проблемы. Код прекрасно работает с изображениями которые не имеют альфа канала.
Цитата Сообщение от kill_s Посмотреть сообщение
Желательно чтобы было попиксельное сравнение
А для того чтобы это сказать раньше, Вам видимо чего-то не хватило...
Цитата Сообщение от Правила форума, п. 2.6.
Как можно более полно описывайте суть проблемы или вопроса, что было сделано для ее решения и какие результаты получены.
Каков вопрос, такой и ответ...
0
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 38
10.06.2011, 19:38  [ТС]
понятно, намеки пошли......есть еще люди, знающие программирование ?

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

Решение

VS 2010 Project
Вложения
Тип файла: rar WindowsFormsApplication22.rar (38.2 Кб, 318 просмотров)
3
185 / 188 / 17
Регистрация: 26.11.2010
Сообщений: 511
10.06.2011, 20:14
Цитата Сообщение от SSTREGG Посмотреть сообщение
kill_s, когда кажется - креститься надо. Если Вы не понимаете код, то это Ваши проблемы. Код прекрасно работает с изображениями которые не имеют альфа канала..
Четвертый коэффициент в ColorMatrix - это альфа, не дурите человека.
2
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.06.2011, 21:42
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2011, 21:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru