Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/84: Рейтинг темы: голосов - 84, средняя оценка - 4.95
 Аватар для KonH
0 / 0 / 0
Регистрация: 17.01.2010
Сообщений: 4

Наложение полупрозрачного изображения

17.01.2010, 15:23. Показов 17899. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Функции передается 2 изображения (Bitmap) - фон и наложение.
Итогом её работы должно стать новое изображение, сложенное из данных двух.
Второе должно быть "поверх" фона, то есть накладываться на него, при частичной прозрачности нужно получить промежуточный цвет пикселя, зависящий от цвета и альфа-канала накладываемого изображения и цвета фона. То есть - чем более прозрачно накладываемое изображение, тем более проявляется цвет фона.
Сама функция написана, вопрос только в том, как получить этот цвет.
Есть для этого какие-то алгоритмы/готовые функции?
Пробовал пару формул, но результат не подходящий - максимум, что получилось - полное наложение.
Заранее спасибо за помощь
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2010, 15:23
Ответы с готовыми решениями:

Нарисовать прозрачный квадрат внутри полупрозрачного окна
Суть такова: Мне нужно сделать выделение области на экране, и нужно что б эта область была полностью прозрачна, в то время как основное...

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

Создание полупрозрачного изображения
Подскажите пожалуйста, как можно создать полупрозрачное изображение. Хочу сделать меню у себя на сайта, как на кинопоиске...

13
 Аватар для Hamsterr
8 / 8 / 0
Регистрация: 19.11.2009
Сообщений: 33
17.01.2010, 17:51
Если я правильно понял, то получается так:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            contextMenuStrip1.Show(Cursor.Position);
        }
        private Bitmap layer, backgr;
        private int alpha;
        private void открыть1КартинкуToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
                backgr = Image.FromFile(ofd.FileName) as Bitmap;
            this.Invalidate();
 
        }
 
        private void открыть2КартинкуToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
                layer = Image.FromFile(ofd.FileName) as Bitmap;
        }
 
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            label1.Text = "Альфа - канал: " + trackBar1.Value;
            alpha = trackBar1.Value;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = "Альфа - канал: " + trackBar1.Value;
            alpha = trackBar1.Value;
        }
 
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (backgr != null)
                e.Graphics.DrawImage(backgr, 0, 0, this.Width, this.Height);
            if (layer != null)
                e.Graphics.DrawImage(layer, 0, 0, this.Width, this.Height);
        }
 
        private void наложитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                layer = new Bitmap(layer);
                for (int x = 0; x < layer.Width; x++)
                {
                    for (int y = 0; y < layer.Height; y++)
                    {
                        Color tmp = layer.GetPixel(x, y);
                        tmp = Color.FromArgb(alpha, tmp);
                        layer.SetPixel(x, y, tmp);
                    }
                }
                this.Invalidate();
            }
            catch (Exception r)
            {
                MessageBox.Show(r.Message);
            }
            
        }
    }
}
0
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
17.01.2010, 18:51
Hamsterr жжешь)
Не вижу смысла во всем что ты написал =)

Конх, возможно смогу помоч

Добавлено через 16 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    private Bitmap tmp(Bitmap image, Bitmap fon, byte s)
    {
        //s прозрачность изображения image от 0 (0%) до 255 (100%)
        if (image.Size == fon.Size)
        {
            Bitmap bmp = new Bitmap(image.Width, image.Height);
            Color im,f;
            for(int i=0;i<bmp.Width;i++)
                for (int j = 0; j < bmp.Height; j++)
                {
                    im = image.GetPixel(i, j);
                    f = fon.GetPixel(i, j);
                    bmp.SetPixel(i, j, Color.FromArgb(im.R * (255 - s) / 255 + f.R * s / 255, im.G * (255 - s) / 255 + f.G * s / 255, im.B * (255 - s) / 255 + f.B * s / 255));
                }
            return bmp;
        }
        return null;
    }
Взгляни. Надеюсь я то написал=)

программ требует соответствие размеров изображений, если тебе требуется накладывать изображения разных размеров, то эот можно прописать внутри кода почти ничего не меняя. Тоже со сдвигом изорражений.
1
 Аватар для Hamsterr
8 / 8 / 0
Регистрация: 19.11.2009
Сообщений: 33
17.01.2010, 21:06
gGrn-7DA, а смысл в том что у меня это изображение рисуется на форме, а ты возвращаешь его из функции.
0
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
17.01.2010, 21:41
Я имею ввиду, твоя программа как я понял просто рисует "бледное" изображение, я сначала подобное сделал но у мну изображение полностью все перекрашивало своей бледной копией
, фон исчезал под ней. и у тебя как бы сказать есть довольно странные строки.
например
C#
1
layer = new Bitmap(layer);
ты в избражение копируешь то же изображение а потом в нем просто изменяешь альфа канал.поясни пожалуйста в чем тут смысл. либо ты гений, либо нет.

подобная конструкция у меня не работала(

Добавлено через 2 минуты
Цитата Сообщение от Hamsterr Посмотреть сообщение
а смысл в том что у меня это изображение рисуется на форме, а ты возвращаешь его из функции.
К стати тут вообще требовали только алгоритм задания цвета...
Так что.
Но мой код более мобилен)

P.S.
можешь с пхп помочь?)
0
 Аватар для Hamsterr
8 / 8 / 0
Регистрация: 19.11.2009
Сообщений: 33
17.01.2010, 22:03
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
Я имею ввиду, твоя программа как я понял просто рисует "бледное" изображение, я сначала подобное сделал но у мну изображение полностью все перекрашивало своей бледной копией
, фон исчезал под ней. и у тебя как бы сказать есть довольно странные строки.
например
C#
1
layer = new Bitmap(layer);
Я сам если честно не понимаю зачем эта строчка, но почему то, пока не пересоздал этот Bitmap, у меня прозрачность не хотела меняться.

ты в избражение копируешь то же изображение а потом в нем просто изменяешь альфа канал.поясни пожалуйста в чем тут смысл. либо ты гений, либо нет.
Я зарисовываю форму первым изображением, с Альфа каналом 255 (оно как я понял должно быть, чем то вроде Background-а), а потом у второго изображения делаю прозрачнось и накладываю на первый. Не судите строго, я просто так понял вопрос
подобная конструкция у меня не работала(
у меня тоже сначала не работала

Но мой код более мобилен)
Cогласен

P.S.
можешь с пхп помочь?)
Сори, я только собираюсь его изучать...
0
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
17.01.2010, 22:06
Цитата Сообщение от Hamsterr Посмотреть сообщение


Сори, я только собираюсь его изучать...
я вот тоже ток седня можно сказать начал.
кинь в личку свой ICQ. если что споемся)
0
 Аватар для KonH
0 / 0 / 0
Регистрация: 17.01.2010
Сообщений: 4
18.01.2010, 06:02  [ТС]
gGrn-7DA, спасибо, именно то, что нужно
0
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
18.01.2010, 14:54
всегда пожалуйста)
0
9 / 9 / 0
Регистрация: 13.01.2010
Сообщений: 32
22.01.2010, 22:27
Слегка доработал "под себя" функцию наложения предложенную gGrn-7DA (тут)
1. Исходные изображения приводятся (растягиваются/сжимаются) к указанному размеру
2. При наложении используется альфа-канал накладываемого изображения
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
public static Bitmap MakeImage(Size ImgSize, Bitmap foreImg, Bitmap backImg, byte s)
{
    // ImgSize = размер картинки-результата, обе исходные картинки приводятся к указанному размеру
    // s прозрачность накладываемого изображения foreImg от 0 (100%) до 255 (0%)
    // результат наследует Альфа-канал фонового изображения
    // наложение использует Альфа-канал накладываемого изображения
    Bitmap fimg = new Bitmap(foreImg, ImgSize);
    Bitmap bimg = new Bitmap(backImg, ImgSize);
    Bitmap bmp = new Bitmap(ImgSize.Width, ImgSize.Height);
    for (int i = 0; i < bmp.Width; i++)
        for (int j = 0; j < bmp.Height; j++)
        {
            Color fm = fimg.GetPixel(i, j);
            Color bm = bimg.GetPixel(i, j);
            byte af = (byte)(fm.A * s / byte.MaxValue);
            byte a = bm.A;
            byte r = (byte)((fm.R * af + bm.R * (byte.MaxValue - af)) / byte.MaxValue);
            byte g = (byte)((fm.G * af + bm.G * (byte.MaxValue - af)) / byte.MaxValue);
            byte b = (byte)((fm.B * af + bm.B * (byte.MaxValue - af)) / byte.MaxValue);
            bmp.SetPixel(i, j, Color.FromArgb(a, r, g, b));
        }
    return bmp;
}
Может пригодится кому...
0
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
22.01.2010, 22:36
замени
C#
1
byte.MaxValue
на 255
не позорься)

Добавлено через 1 минуту
C#
1
2
3
4
byte af = (byte)(fm.A * s / byte.MaxValue);
byte r = (byte)((fm.R * af + bm.R * (byte.MaxValue - af)) / byte.MaxValue);
byte g = (byte)((fm.G * af + bm.G * (byte.MaxValue - af)) / byte.MaxValue);
 byte b = (byte)((fm.B * af + bm.B * (byte.MaxValue - af)) / byte.MaxValue);
преобразование типа не требуется вроде...
0
9 / 9 / 0
Регистрация: 13.01.2010
Сообщений: 32
23.01.2010, 10:55
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
замени
C#
1
byte.MaxValue
на 255
не позорься)
IMHO, не считаю позором привычку использовать символические константы (в т.ч. предопределенные).
К тому же такая привычка зачастую избавляет от проблем с переносом на другие архитектуры.
Хотя, конечно, понимаю, что архитектура с байтом в 7 или 9 бит чиста гипотетична, но вот (например) с int вероятность уже существенно выше
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
C#
1
2
3
4
byte af = (byte)(fm.A * s / byte.MaxValue);
byte r = (byte)((fm.R * af + bm.R * (byte.MaxValue - af)) / byte.MaxValue);
byte g = (byte)((fm.G * af + bm.G * (byte.MaxValue - af)) / byte.MaxValue);
 byte b = (byte)((fm.B * af + bm.B * (byte.MaxValue - af)) / byte.MaxValue);
преобразование типа не требуется вроде...
Тоже, в общем-то, привычка...
К тому же, насколько я помню, результат byte*byte неявно преобразуется в int, и соответственно результат тоже имеет тип int... (хотя, конечно, могу и ошибаться, я отнюдь не гуру)
0
andre719mv
16.11.2011, 20:14
gGrn-7DA, переделав твой код, у меня получилась функция, которая учитывает альфаканалы обоих изображений и создает промежуточный пиксель:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 private Bitmap ImageAdditions(Bitmap image, Bitmap image2)
        {           
            Bitmap bmp = new Bitmap(image.Width, image.Height);
            Color im, fon;
            int iR, iG, iB;
            for (int i = 0; i < bmp.Width; i++)
                for (int j = 0; j < bmp.Height; j++)
                {
                    fon = image2.GetPixel(i, j);
                    im = image.GetPixel(i, j);
                    iR = fon.R * (255 - im.A) / 255 + im.R * im.A / 255;
                    iG = fon.G * (255 - im.A) / 255 + im.G * im.A / 255;
                    iB = fon.B * (255 - im.A) / 255 + im.B * im.A / 255;
                    bmp.SetPixel(i, j, Color.FromArgb(Math.Max(fon.A, im.A), iR * (255 - fon.A) / 255 + fon.R * fon.A / 255, iG * (255 - fon.A) / 255 + fon.G * fon.A / 255, iB * (255 - fon.A) / 255 + fon.B * fon.A / 255));
                    
                }
            return bmp;
        }
Незнаю пригодится ли, но мне етот код был ооочень полезен.
MiThEoN
 Аватар для VASSUV
466 / 323 / 42
Регистрация: 31.10.2009
Сообщений: 546
Записей в блоге: 2
17.11.2011, 00:02
Цитата Сообщение от KonH Посмотреть сообщение
Итогом её работы должно стать новое изображение, сложенное из данных двух.
Можешь поюзать внешнюю библиотеку AForge, в ней есть класс Morph который как раз токи накладывает одно на другое изображение с учетом прозрачности в процентах
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2011, 00:02
Помогаю со студенческими работами здесь

Наложение одного изображения на другое
Здравствуйте! Не получается сделать эффект наложения картинки одной на другую. 1)Макет(т.е. так, как надо): 2)Так, как...

Наложение изображения друг на друга
Допустим есть Image1. Хочу реализовать следующее: - загружаю еще картинку которую я могу передвигать над Image1, и потом после того как...

Наложение изображения на веб камеру
Здравствуйте. у меня есть флешка которая захватывает изображение с веб камеры. мне нужно наложить на веб камеру в реальном времени...

Наложение водяных знаков на изображения
Всем привет. кто знает помогите пожалуйста. водяных знаков на изображения есть лого (картинка №1) я так сделал не правильно...

Наложение текстуры с растягиванием изображения
Мне нужно чтобы текстура наложилась вот так(то есть растянулась): З.Ы. это через TImage Но получается как-то так: Подскажите...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru