увеличить / уменьшить PictureBox, но сохранить соотношение пикселей c # - PullRequest
0 голосов
/ 24 ноября 2018

Я не смог найти лучшего названия.Вот что я хочу сделать:

У меня есть картинка, размером 28x28 пикселей

Я работаю над проектом AI, и моя идея состоит в том, чтобы сделать OCR для чисел,

Я нашел тренировочные данные, но все изображения имеют размер 28x28 пикселей, поэтому моя идея состоит в том, чтобы создать графический блок такого размера,

, нарисовать его и передать эту информацию в нейронную сеть.

На данный момент у меня графическая проблема:

Как мне сделать картинную коробку размером 28x28 и как-то увеличить ее, но сохранить количество пикселей.Я помещаю изображение в панель и хочу, чтобы оно заполнило панель.

Моя идея состоит в том, чтобы как-то увеличить его, а после рисования уменьшить, но как я могу это сделать?

математически, как это можно сделать?

И как лучше всего рисовать на этом графическом блоке (линия, скругление и т. Д.), Чтобы данные могли быть переданы в NN (после его нормализации)OFC).

1 Ответ

0 голосов
/ 24 ноября 2018

Я разобрался с решением, может, оно кому-нибудь поможет в будущем:

        List<KeyValuePair<int, int>> coordonateList = new List<KeyValuePair<int, int>>();
        // drawPictureBox size is 280 x 280  (28 * 10, 28 * 10)



        private void pbImage_MouseDown(object sender, MouseEventArgs e)
        {
            mouseDown = true;

        }

        private void drawPictureBox_MouseMove(object sender, MouseEventArgs e)
        {
            if (mouseDown)
            {
                Point point = drawPictureBox.PointToClient(Cursor.Position);
                DrawPoint((point.X), (point.Y));
            }
        }

        private void drawPictureBox_MouseUp(object sender, MouseEventArgs e)
        {
            mouseDown = false;
        }

        public void DrawPoint(int x, int y)
        {

            using (Graphics g = Graphics.FromImage(bitmap))
            {
                SolidBrush brush = new SolidBrush(Color.White);
                g.FillRectangle(brush, x, y, 10, 10);
                coordonateList.Add(new KeyValuePair<int,int>(x/10,y/10));
            }
            drawPictureBox.Image = bitmap;
        }
        private void zoomImage(Bitmap bitmap)
        {
            var result = new Bitmap(28,28);
            using (Graphics g1 = Graphics.FromImage(result))
            {
                SolidBrush brush = new SolidBrush(Color.White);

                foreach (var item in coordonateList)
                {
                    g1.FillRectangle(brush, item.Key, item.Value, 1, 1);
                }
            pictureBox1.Image = result;

        }
...