powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получение матрицы из изображения
2 сообщений из 2, страница 1 из 1
Получение матрицы из изображения
    #39920221
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть такой код, который реализует как графический редактор. Рисуем символы мышкой и сохраняем.
C#
Код: 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.
85.
86.
87.
88.
89.
90.
using System;
using System.Drawing;
using System.Windows.Forms;

namespace abc
{
    public partial class Form1 : Form
    {
        Point PreviousPoint; //Предыдущая точка
        bool IsClicked = false; //Левая кнопка мышки нажата (True)/не нажата (False)
        int SizePen = 10;        
        int Step = 5; //Для избавления эффекта "пунктирности"
        int Lim = 2;  //и "ёжика" на линиях

        public Form1()
        {
            InitializeComponent();
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            IsClicked = true;
            PreviousPoint = new Point(e.X, e.Y);
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (IsClicked)
            {               
                SolidBrush br1 = new SolidBrush(Color.Black);
                Graphics g = panel1.CreateGraphics();
                g.FillEllipse(br1, e.X, e.Y, SizePen, SizePen);

                //Для избавления эффекта "пунктирности" и "ёжика" на линиях
                //Вычисляем расстояние между соседними точками
                double distance = Math.Sqrt(
                                            (e.X - PreviousPoint.X) * (e.X - PreviousPoint.X)
                                            + 
                                            (e.Y - PreviousPoint.Y) * (e.Y - PreviousPoint.Y)
                                           );                
                //если distance больше Lim, то соединяем точки линией
                if (distance > Lim)
                {    
                        g.DrawLine(new Pen(Color.Black, SizePen),
                            PreviousPoint.X + Step,
                            PreviousPoint.Y + Step,
                            e.X + Step,
                            e.Y + Step);
                }

                g.Dispose();

                // запоминаем текущее положение
                PreviousPoint = new Point(e.X, e.Y);
            }
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            IsClicked = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Очистка изображения
            panel1.Invalidate();
            panel1.Update();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Сохранить картинку
            int width = panel1.Size.Width;
            int height = panel1.Size.Height;

            Bitmap bmp = new Bitmap(width, height);
            panel1.DrawToBitmap(bmp, new Rectangle(0, 0, width, height));            

            bmp.Save(@"C:\Users\Acer\Desktop\TestDrawToBitmap.bmp", //В результате сохраняет пустую белую картинку
                System.Drawing.Imaging.ImageFormat.Bmp);            //без нарисованного символа
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            //Сглаживание линий
            //e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            //e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        }
    }
}


1. Как из нарисованного символа на panel размером 280*280 получить изображение как двумерную матрицу (высота * ширина, одноканальную, с оттенками серого) и трехмерную матрицу (высота * шрина * RGB, трехканальную(RGB))?

2. Как полученную матрицу уменьшить до размеров 28*28? Или сначала надо уменьшить растр, а потом получать матрицу?

3. При нажатии на кнопку "Сохранить изображение" - в результате сохраняет пустое изображение. Почему так? Как правильно написать?
...
Рейтинг: 0 / 0
Получение матрицы из изображения
    #39920245
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

для начала с рисованием разобраться - где рисовать, что и когда инвалидировать

очень грубо -
Код: 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.
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        Bitmap bmp;
        Graphics g;
        public Form1()
        {
            InitializeComponent();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(bmp,0,0);          
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            bmp = new Bitmap(280, 280, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            g =   Graphics.FromImage(bmp);
        }

        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {          
            Rectangle rect = new Rectangle(e.X-5, e.Y-5, 10, 10);
            g.FillRectangle(Brushes.Red, rect);
            panel1.Invalidate(rect);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            g.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            g.FillRectangle(Brushes.Black,0,0,bmp.Width,bmp.Height);
            panel1.Invalidate();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            bmp.Save("a.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
        }

    }
}

...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получение матрицы из изображения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]