Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 03.08.2010
Сообщений: 16
1

Создание "сэндвичевых" изображений

17.02.2011, 15:03. Показов 795. Ответов 3
Метки нет (Все метки)

Здравствуйте, прошу совета бывалых, возможно ли создание "сэндвичевых" картинок с наложением больше двух?
Итак, есть форма, в ней:
C#
1
form1.BackgroundImage = pic1
На форме лежит picturebox1, в нем
C#
1
2
picturebox1.BackgroundImage = pic2
picturebox1.Image = pic3
Мне нужно сверху на picturebox1 положить picturebox2 с прозрачным фоном и картинкой pic4
так, чтобы получилось (от нижнего слоя к верхнему) pic1-pic2-pic3-pic4
Дело в том, что при установке picturebox2.BackColor = Transparent, выдается не все изображение под картинкой (pic1+pic2+pic3), а только pic1
Соответственно, все изображения на picturebox1 закрываются фоном (pic1).
Можно ли как-нибудь решить или обойти это?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2011, 15:03
Ответы с готовыми решениями:

Ошибка после конвертации метода на С++ к С#: "Неявное преобразование типа "int" в "bool" невозможно"
Ошибка после преобразования метода на С++ к С#: "Неявное преобразование типа "int" в "bool"...

Ошибка CS0019: Оператор "*" не может применяться к операндам типа "decimal" и "float"
Здравствуйте! Писал приложение и наткнулся на интересную ошибку (честно говоря, я не совсем понимаю...

Переопределить операции "+" "=" "-" для экземпляров моего класса
Добрый день. Мне нужно переопределить операции "+" "=" "-" для экземпляров моего класса. Я вижу это...

Ошибка: "Не удалось привести тип объекта "System.ConsoleKeyInfo" к типу "System.IConvertible"."
При запуске пишет, что "Не удалось привести тип объекта "System.ConsoleKeyInfo" к типу...

3
83 / 75 / 13
Регистрация: 03.09.2009
Сообщений: 346
17.02.2011, 15:19 2
Почему бы просто не наложить все 4-ре картинки вручную а потом вывести результат на форму?

C#
1
2
3
4
5
6
7
8
Bitmap b = new Bitmap(100, 100);
            Graphics g = Graphics.FromImage(b);
            g.DrawImage(Image.FromFile("pic1.bmp"), 0, 0);
            g.DrawImage(Image.FromFile("pic2.bmp"), 0, 0);
            g.DrawImage(Image.FromFile("pic3.bmp"), 0, 0);
            g.DrawImage(Image.FromFile("pic4.bmp"), 0, 0);
            g.Dispose();
            pictureBox.Image = b;
1
2 / 2 / 0
Регистрация: 03.08.2010
Сообщений: 16
17.02.2011, 15:25  [ТС] 3
Наверное, потому что я очень люблю трудности преодолевать, "стоя и в гамаке"(с)
Спасибо большое))
0
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 3
01.12.2011, 02:12 4
Приведенный выше код будет накладывать одно изображение на другое, причем новое будет затирать старое (проверено).

C#
1
2
3
4
5
6
7
8
Bitmap b = new Bitmap(100, 100);
            Graphics g = Graphics.FromImage(b);
            g.DrawImage(Image.FromFile("pic1.bmp"), 0, 0);
            g.DrawImage(Image.FromFile("pic2.bmp"), 0, 0);
            g.DrawImage(Image.FromFile("pic3.bmp"), 0, 0);
            g.DrawImage(Image.FromFile("pic4.bmp"), 0, 0);
            g.Dispose();
            pictureBox.Image = b;
Предлагаю альтернативный вариант.

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
private Image FullOverlayOfTwoImages(Bitmap background, Bitmap layer)
        {
            var bitData = background.LockBits(
                new Rectangle(0, 0, background.Width, background.Height),
                ImageLockMode.ReadWrite,
                PixelFormat.Format32bppArgb);
 
            var bitDataN = layer.LockBits(
                new Rectangle(0, 0, layer.Width, layer.Height),
                ImageLockMode.ReadWrite,
                PixelFormat.Format32bppArgb);
            
            var size = bitData.Stride*background.Height;
            var val = new byte[size];
            var valN = new byte[size];
 
            var h = bitData.Scan0;
            var hN = bitDataN.Scan0;
 
            Marshal.Copy(h, val, 0, size);
            Marshal.Copy(hN, valN, 0, size);
 
            for (var i = 0; i < size; i += 4)
            {
                if (valN[i+2] != 0 || valN[i+1] != 0 || valN[i] != 0) //условие замены. Если накладываемое изображение в данном месте не будет белым, то оно перекроет исходное.
                {
                    val[i + 2] = valN[i + 2];
                    val[i + 1] = valN[i + 1];
                    val[i] = valN[i];
                }
            }
 
            Marshal.Copy(val, 0, h, size);
 
            background.UnlockBits(bitData);
            layer.UnlockBits(bitDataN);
            return background;
        }
Код частично не мой, но работает. Также на сайте есть примеры с альфа-каналом.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2011, 02:12

Десериализация json. Ожидается элемент "root" из пространства имен "". Обнаружен элемент "None"
Здравствуйте. Получаю от сервера ответ на запросы. В интернете нашел пример десериализации, и с...

Оператор "*" не может применяться к операндам типа "type" и "type"
public vector module() { return new vector(x * x + y * y + z * z); } ...

LINQ: Невозможно преобразовать "лямбда-выражение" к типу "string", поскольку он не является делегатом
Здравствуйте. Делаю приложение с использованием Entity Framework. Все было нормально, пока не...

Текстовый файл. строка с 3 "объектами" разделенные разделителем "," как обратиться к каждому из объектов?
Всем добрый день. Имеется текстовый файл. содержимое: более 31.000 строк. каждая строка...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.