Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22

Как сформировать bitmap с отображением label

11.07.2014, 18:41. Показов 2231. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня создается форма:
C#
1
Form GraphForm = new Form();
Далее на ней размещается контрол Zedgraph, PictureBox с картинкой ресурсом легенды графика Zedgraph и поверх картинки-легенды на label отображается необходимая линейка:
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
ZedGraphControl div = new ZedGraphControl();
//Настройка контрола и заполнение его данными
GraphForm.Controls.Add(div);
double divValLeg;
                int s = 0;
                divValLeg = -5 * (Convert.ToDouble(divconstSb.Text));
                for (; divValLeg < 9*Convert.ToDouble(divconstSb.Text); divValLeg += Convert.ToDouble(divconstSb.Text))
                {                    
                    System.Windows.Forms.Label label = new System.Windows.Forms.Label();
                    label.Location = new Point(1200, 32+s);
                    s += 32;
                    label.Size = new Size(31, 16);
                    label.Font = new Font(label.Font.FontFamily, 8);
                    divValLeg = Math.Round(divValLeg, 2);
                    label.Text = Convert.ToString(divValLeg+Convert.ToDouble(divconstSb.Text));
                    label.Visible = true;
                    label.Show();
                    label.BackColor = Color.White;
                    GraphForm.Controls.Add(label);
                }
PictureBox legend = new PictureBox();
                legend.Image = new Bitmap(Properties.Resources.legend);
                legend.Location = new Point(1200, 0);
                legend.Size = new Size(78, 493);
                legend.Visible = true;
                legend.Show();
                GraphForm.Controls.Add(legend);
После чего моя задача сводится к сохранению всего того что есть на форме в картинку.
Если делать это следующим образом:
C#
1
2
3
Bitmap b = new Bitmap(GraphForm.Size.Width, GraphForm.Size.Height);
GraphForm.DrawToBitmap(b, new Rectangle(0, 0, 1270, 510));
bmpSaveDialog(b);
, то сохраняется все что есть на форме кроме label`ов.

Если формировать bitmap следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bmpSaveDialog(CaptureControl(GraphForm));
private Bitmap CaptureControl(Control ctl)
        {
            Rectangle rect;
 
            if (ctl is Form)
                rect = new Rectangle(ctl.Location, ctl.Size);
            else
                rect = new Rectangle(ctl.PointToScreen(new Point(0, 0)), ctl.Size);
 
            Bitmap bitmap = new Bitmap(rect.Width, rect.Height);
 
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);
            }
 
            return bitmap;
        }
, то сохраняется снимок экрана ПОД формой, т.е. кусок VisualStudio

Вопрос.Как сформировать bitmap чтобы на нем отображались label с GraphForm ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2014, 18:41
Ответы с готовыми решениями:

Сложности с отображением прозрачных Bitmap
Рисую на битмапе фигуру, остальное пространство на нем делаю прозрачным. Далее переношу изображение битмапа на канву Image. По щелчку мыши...

Как создать bitmap из области (по координатам пикселей) другого bitmap
Здравствуйте. Подскажите пожалуйста как создать bitmap из области(по координатам пикселей) другого bitmap. Вообщем обрезать.

Как нарисовать Bitmap на Bitmap?
Bitmap1-&gt;Canvas-&gt;Draw(1,1,Bitmap2); Так не работает, хотя с Image проходило.

9
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
11.07.2014, 20:37
прорисовывай Лейблы как текст в нужном тебе Битмапе...
координаты Лейблов есть, текст из них же...
Через цикл foreach можно перебрать необходимые, по сути в три строки кода можно уложиться...
0
Заблокирован
13.07.2014, 16:34
super_pavelka, может стоит попробывать добавить легенду на график, а после уже сохранять сразу через зедграф-контрол?
0
 Аватар для super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22
29.07.2014, 17:14  [ТС]
aleks_pilipenko,я нуб.можно пример кода? я не понял что значит прорисовать лейблы как текст в нужном битмапе.
Ev_Hyper, тоже не совсем понятно.у меня все элементы добавляются на GraphForm, а с GraphForm потом рисуется bitmap.тоесть ZedGraphControl находится на GraphForm.
0
Заблокирован
29.07.2014, 18:21
super_pavelka, я имею ввиду нарисовать легенду на самом контроле ZedGraph. Тогда можно будет сохранить изображение через него, не используя Bitmap.

http://jenyay.net/ZedGraph/TextBackground
1
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
29.07.2014, 18:30
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
using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
 
namespace Project2
{
    public partial class Form1 : Form
    {
    
        public Form1()
        {
            InitializeComponent();
        }
 
        private Button button1;
        Label[] LB = new Label[10];
 
        [STAThread]
        static void Main()
        { Application.Run(new Form1()); }
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(343, 29);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "Сохранить";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // Form1
            // 
            this.ClientSize = new System.Drawing.Size(496, 313);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                LB[i] = new Label();
                LB[i].Text = "label"+(i+1).ToString();
                LB[i].AutoSize = true;
                this.Controls.Add(LB[i]);
                LB[i].Location = new Point(0, i * 20);
                LB[i].MouseDown += new MouseEventHandler(LB_MouseDown);
                LB[i].MouseMove += new MouseEventHandler(LB_MouseDown);
            }
        }
 
        int x, y;
        bool s = false;
        void LB_MouseDown(object sender, MouseEventArgs e)
        {
            Label p1 = sender as Label;
            if (s == false) { x = e.X; y = e.Y; s = true; }
            if (e.Button.ToString() == "Left")
                p1.Location = new Point(p1.Left+e.X - x,p1.Top+ e.Y - y); 
            else { s = false; }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap BM = new Bitmap(this.Width, this.Height);
            Graphics c = Graphics.FromImage(BM);
            for (int i = 0; i < 10; i++)
                c.DrawString(LB[i].Text, LB[i].Font, new SolidBrush(LB[i].ForeColor), LB[i].Location);
            BM.Save(Application.StartupPath + "//1.jpg");
        }
    }
}
1
 Аватар для super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22
29.07.2014, 21:29  [ТС]
огромное спасибо!
0
 Аватар для super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22
31.07.2014, 12:04  [ТС]
aleks_pilipenko, по вашему способу сделать было проще, но я столкнулся со следующей проблемой: при отображении формы все лейблы находятся на своем месте

, а после сохранения смещаются по оси Y вверх


вот код:
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
double divValLeg;
                int s = 0;
                divValLeg = -5 * (Convert.ToDouble(divconstSb.Text));
                System.Windows.Forms.Label[] LB = new System.Windows.Forms.Label[14];
                for (int i = 0; i < 14; i++)
                {
                    LB[i] = new System.Windows.Forms.Label();
                    LB[i].Text = Convert.ToString(Math.Round(divValLeg + Convert.ToDouble(divconstSb.Text),2));
                    LB[i].Font = new Font(LB[i].Font.FontFamily, 8);
                    LB[i].Size = new Size(31, 16);
                    LB[i].Location = new Point(1200, 32 + s);
                    s += 32;
                    LB[i].BackColor = Color.White;
                    LB[i].Show();
                    GraphForm.Controls.Add(LB[i]);                    
                    divValLeg += Convert.ToDouble(divconstSb.Text);
                }
PictureBox legend = new PictureBox();
                legend.Image = new Bitmap(Properties.Resources.legend);
                legend.Location = new Point(1200, 0);
                legend.Size = new Size(78, 493);
                legend.Visible = true;
                legend.Show();
                div.Invalidate();
                GraphForm.Controls.Add(legend);
                Graphics g = GraphForm.CreateGraphics();                
                Rectangle r = GraphForm.RectangleToScreen(GraphForm.ClientRectangle);
                Bitmap b = new Bitmap(GraphForm.Size.Width, GraphForm.Size.Height);         
                GraphForm.DrawToBitmap(b, new Rectangle(0, 0, 1300, 514));
                Graphics c = Graphics.FromImage(b);
                for (int i = 0; i < 14; i++)
                    c.DrawString(LB[i].Text, LB[i].Font, new SolidBrush(LB[i].ForeColor), LB[i].Location);
                bmpSaveDialog(b);
0
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
31.07.2014, 12:08
Цитата Сообщение от super_pavelka Посмотреть сообщение
смещаются по оси Y вверх
чесс слово, не знаю... Разбираться сейчас некогда, работа...
Может они не на форме, а на Панельке? Или ещё что-нибудь, потренеруйся на маленьком проект, потом свой проверяй...
0
 Аватар для super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22
31.07.2014, 15:44  [ТС]
aleks_pilipenko, да вроде на форме.ладно спасибо буду разбираться дальше =)

Добавлено через 3 часа 14 минут
aleks_pilipenko, нашел выход.при прорисовке текста в битмап надо чуть сместить начальные координаты лейблов и тогда они будут сохранятся с поправкой в нужном месте:
C#
1
2
for (int i = 0; i < 14; i++)
 c.DrawString(LB[i].Text, LB[i].Font, new SolidBrush(LB[i].ForeColor), LB[i].Location.X+5,LB[i].Location.Y + 18);
тему думаю можно закрыть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2014, 15:44
Помогаю со студенческими работами здесь

Как обрезать Image (bitmap) в другой Image (bitmap)
Не получается никак пробовал с помощью Canvas-&gt;CopyRect. Вот метод где первый параметр изображение которое загрузили а второй обрезанное...

ProgressBar. Отображение % выполнения на label - как сделать фон label прозрачным?
Есть прогрессбар, есть лэйбл, на котором отображается ход выполнения. Лэйбл помещена на прогрессбар. Нужно, чтобы надпись была с прозрачным...

Как вставить текст в label на середине, то есть на центре label?
Здравствуйте. Как вставить текст в label на середине, то есть на центре label?

Как вывести значение выделенной строки в listwidget в label . а Так же из combobox в label
добрый вечер. как вывести значение выделенной строки в listwidget в label . а Так же из combobox в label Добавлено через 1 час 10...

создание Clone с Bitmap меньшего размера с сохранением изначальных габаритов Bitmap
Взялся за GDI, столкнулся с проблемой. Есть &quot;бегущая строка&quot;, она движется справа налево. Если перерисовывать по пикселям...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru