Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 100
1

альфа канал для надписей - вместо прозрачности чернота

30.09.2011, 14:47. Просмотров 2745. Ответов 15
Метки нет (Все метки)

Если создать прозрачный Bitmap, и на нем рисовать полупрозрачные линии (через DrawLine), то все ок. Но если добавлять надпись (через DrawString), то все полупрозрачное принимает черный цвет, словно надпись пишется на черном закрашенном фоне. Если надпись изначально добавлять на не прозрачный фон, то все ок.

Какое свойство задать, что бы надписи корректно можно было делать в отдельный Bitmap с верной прозрачностью?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2011, 14:47
Ответы с готовыми решениями:

Альфа канал звука ()
Доброго время суток всем ! В программе у меня возник недочет того, что при проигрывании музыки и...

Использовать альфа-канал на PictureBox
Как поместить данный код в pictureBox1 к примеру: Image myImage =...

Альфа-канал
Здравствуйте. Вопрос такой: я знаю, есть для Delphi компонент TBitmapPlus. Ну, в общем-то, это и не...

Альфа канал
Здравствуйте! Решил вот написать небольшой сайт и назрела небольшая проблема: изображение прогнал...

15
Злой няш
1523 / 1187 / 407
Регистрация: 05.04.2010
Сообщений: 2,081
30.09.2011, 14:57 2
А почему бы не создать два Bitmap? Один с полупрозрачными линиями, а другой с текстом. После чего через Graphics один наложить на другой.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 100
30.09.2011, 15:01  [ТС] 3
Так у меня так и делается, отдельно создаются прозрачные Bitmap, в одних линии графиков, а в других надписи, а потом все склеивается (сперва фон, потом графики, потом надписи). Но в прозрачных Bitmap с надписями возникает "чернота"...

Проблемы нет только когда надпись добавляется в изначально не прозрачный Bitmap.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 100
30.09.2011, 15:08  [ТС] 4
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
 private void Form1_Load(object sender, EventArgs e)
        {
 Image fon = new Bitmap(400,300);
            Graphics g = Graphics.FromImage(fon);
            Image graph = new Bitmap(400, 300); // объект - картинка графика - сетка     
            Graphics g2 = Graphics.FromImage(graph);
            g2.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            g2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            Font mfont = new Font("Tahoma", 20, FontStyle.Regular);
            Color text = Color.FromArgb(150, 255, 0, 0);// цвет надписи 
            SolidBrush color_text = new SolidBrush(text);
            g2.DrawString("TEST", mfont, color_text, 10, 10);
            g.DrawImage(graph, 0, 0);
 
            Image graph3 = new Bitmap(400,300); // объект - сам график - увеличенный
            Graphics g3 = Graphics.FromImage(graph3);
            Pen pen = new Pen(text); // перо линий сетки
            pen.Width = 3; // толщина линии
            g3.DrawLine(pen, 10, 50, 100, 100);
            g.DrawImage(graph3, 0, 0);
 
            pictureBox1.Image = fon;
 
        }
Задний фон белый, надпись потемнела и края черные, а линия верно отобразилась - полупрозрачным красным.
0
Изображения
 
Злой няш
1523 / 1187 / 407
Регистрация: 05.04.2010
Сообщений: 2,081
30.09.2011, 15:26 5
Написал такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Bitmap bitmap = new Bitmap(300, 300);
            Graphics graphics = Graphics.FromImage(bitmap);
            Color color = Color.FromArgb(120, 255, 255, 255);
            graphics.DrawLine(new Pen(color, 50), 0, 0, 50, 50);
            graphics.DrawString("bla-bla-bla", new Font("Arial", 20), new SolidBrush(Color.Green), 10f, 10f);
            Graphics result = this.CreateGraphics();
            result.DrawImage(bitmap, 0, 0);
        }
Результат:
альфа канал для надписей - вместо прозрачности чернота

Вставил ваш код, результат такой:
альфа канал для надписей - вместо прозрачности чернота

Попробуйте удалить с формы PictureBox и создать снова.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 100
30.09.2011, 16:06  [ТС] 6
Запутался, как применить функцию OnPaint, что бы на выходе был отдельный bitmap с надписью, который уже после смешивается с другими bitmap и после этот микс попадает в picturebox.

Т.е. на каждый график есть свой объект, в котором хранятся данные координат, картинка с линией графика, картинка с надписью и т.п. На отдельном этапе создаются линии графика, надписи, а потом уже отдельно делается микс, переносимый в picturebox.
0
Злой няш
1523 / 1187 / 407
Регистрация: 05.04.2010
Сообщений: 2,081
30.09.2011, 16:16 7
romanrex, а причем здесь OnPaint? Я его просто использовал. Это метод, который вызывается тогда, когда форма хочет себя перерисовать. И ничего он не возвращает.
И работу вашего кода я тоже продемонстрировал - никаких черных краев нет. В чем проблема удалить PictureBox и создать его еще раз?
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 100
30.09.2011, 16:24  [ТС] 8
проблема в непонимании т.е. где связь с PictureBox и как (или какую часть) кода нужно перенести

И под удалить-создать PictureBox подразумевается - удалить-создать в конструкторе в MV2010 или уже по ходу выполнения программы?
0
Злой няш
1523 / 1187 / 407
Регистрация: 05.04.2010
Сообщений: 2,081
30.09.2011, 16:31 9
Цитата Сообщение от romanrex Посмотреть сообщение
И под удалить-создать PictureBox подразумевается - удалить-создать в конструкторе в MV2010 или уже по ходу выполнения программы?
Ну~, я даже не знаю. Моя догадка в том, что вы там в дизайнере форм чего-то установили в PictureBox такого, что он так отображает.
Я же уже предлагаю в дизайнере форм взять и удалить компонент под названием PictureBox и создать его сразу (пересоздать).
Если не поможет, то создайте новый проект и вставьте мой/свой код и посмотрите появятся ли эти черные края.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 100
30.09.2011, 17:12  [ТС] 10
Создал новый проект. Создал панель panel1. Все настройки по умолчанию. Вставил код, который ниже.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap bitmap = new Bitmap(300, 300);
            Graphics graphics = Graphics.FromImage(bitmap);
            Color color = Color.FromArgb(120, 255, 255, 255);
            graphics.DrawLine(new Pen(color, 50), 0, 0, 50, 50);
            graphics.DrawString("bla-bla-bla", new Font("Arial", 20), new SolidBrush(Color.Green), 10f, 10f);
            //     Graphics result = this.CreateGraphics();
            //     result.DrawImage(bitmap, 0, 0);
            panel1.BackgroundImage = bitmap;   
        }
    }
}
в итоге так же черные края. Или я не понимаю, как правильно использовать result?
0
Злой няш
1523 / 1187 / 407
Регистрация: 05.04.2010
Сообщений: 2,081
30.09.2011, 17:23 11
Цитата Сообщение от romanrex Посмотреть сообщение
в итоге так же черные края. Или я не понимаю, как правильно использовать result?
Сделал так же:
альфа канал для надписей - вместо прозрачности чернота

Возможно проблема в чем-то другом.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 100
30.09.2011, 17:35  [ТС] 12
Понял... можно уточнить, какая ОС у вас используется? У меня это получается под двумя разными машинами на Windows 7, возможно это проблема ОС
0
Злой няш
1523 / 1187 / 407
Регистрация: 05.04.2010
Сообщений: 2,081
30.09.2011, 17:50 13
romanrex, у меня Windows XP SP3.
Попросил друга сделать скрин на Windows 7 Максимальная:
альфа канал для надписей - вместо прозрачности чернота
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 100
30.09.2011, 18:05  [ТС] 14
Да, там так же черные края, значит проблема в ОС. Возможно надо искать какую-то дополнительную настройку под DrawString, либо может можно рисовать надписи не через DrawString?
0
Злой няш
1523 / 1187 / 407
Регистрация: 05.04.2010
Сообщений: 2,081
30.09.2011, 18:07 15
Цитата Сообщение от romanrex Посмотреть сообщение
либо может можно рисовать надписи не через DrawString?
Выбор богат: WPF, DirectX, OpenGL, XNA.
А вообще GDI+ старая технология. Мне постоянно твердят: "WinForms умер".
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 100
30.09.2011, 18:28  [ТС] 16
Т.е. выбор далеко не простого способа...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2011, 18:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Альфа канал
Доброго времени суток, подскажите как настроить текстуру и OPG на альфа канал, то есть я выбираю...

С++ openGL Альфа канал
Практикуюсь пишу игру. Использую с++ и openGl. Помогите загрузить текстуру с альфа каналом. Рабочий...

Java Альфа-канал
Доброго времени суток! Столкнулся с проблемой: Заполнил форму фоном, теперь на фон хочу наложить...

Не работает псевдо-класс hover в IE после изменения альфа-прозрачности элемента
Здравствуйте. Сразу к делу. На странице имеется несколько элементов, с одним и тем же классом....


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

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

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