Mallesh Shantagiri Ответов: 1

Как нарисовать несколько прямоугольников на изображении?


Всем Привет ,
Я хочу нарисовать несколько прямоугольников на изображении в зависимости от размера изображения , например , если у меня ширина изображения=733 , высота=501, и я хочу нарисовать 6*8 прямоугольников, то есть 6 строк и 8 столбцов прямоугольников. как я могу рисовать .

В настоящее время я могу нарисовать несколько прямоугольников , но не получаю правильной логики, что будет лучшим способом сделать это .

Что я уже пробовал:

открытый form1()
{
метод InitializeComponent();
инт Дж = имя picturebox1.Расположение.Х;
инт к = имя picturebox1.Расположение.Г;

инт imagewidth = имя picturebox1.Изображения.Размер.Ширина;
инт imageheight = имя picturebox1.Изображения.Размер.Высота;

Система.Рисование.Изображение img = система.Рисование.Изображение.FromFile(@"E:\Caledonia.jpg");
Ящик для сообщений.Шоу("ширина:" + рис.Ширина + ", высота: "+ img.Высота);

размер ВАР = имя picturebox1.ClientSize;
// получение нескольких прямоугольников
для (k = 10; k <= 1500; k++)
{
//for (j = 13; j <= img.Ширина; j++)
//{
// j = j-1;
k = k-1;
прямоугольник = новый UserRect(новый прямоугольник(J, к, 200, 150));
listRec.Добавить(прямоугольник.прямоугольник);
прямоугольник.SetPictureBox(this. pictureBox1);
//i = i + 20;
//j = j + 12;
j = j + 100;
k = k + 100;
//}


}
}

Ralf Meier

Вы хотите, чтобы эти прямоугольники стали частью изображения ? Или вы хотите иметь своего рода слой поверх изображения (не меняя его) ?

Mallesh Shantagiri

я просто хочу, чтобы они были поверх изображения, они должны быть в порядке.

Ralf Meier

Это не ответ на мой вопрос. Я повторяю это :
Вы хотите, чтобы эти прямоугольники стали частью вашего изображения - вы хотите рисовать прямо на изображении ?

Mallesh Shantagiri

Да, я хочу, чтобы эти прямоугольники были частью изображения . Поверх размера изображения .

Mallesh Shantagiri

я нарисовал один столбец прямоугольников, просто сохраняя ось X изображения постоянной, а ось Y-приращением с общей высотой/4, но теперь я хочу сделать это для всего изображения.

Ralf Meier

смотрите мое решение ...

1 Ответов

Рейтинг:
5

Ralf Meier

мое предложение состоит в том, чтобы создать настроенный PictureBox с тем поведением, которое вы хотите иметь :

using System;
using System.Windows.Forms;
using System.Drawing;

    public class GridPictureBox : PictureBox
    {

        public Size GridSize
        {
            get { return my_GridSize; }
            set
            {
                my_GridSize = value;
                this.Invalidate();
            }
        }

        private Size my_GridSize = new Size(8, 8);
        public Color GridColor
        {
            get { return my_GridColor; }
            set
            {
                my_GridColor = value;
                this.Invalidate();
            }
        }

        private Color my_GridColor = Color.Black;
        protected override void OnSizeModeChanged(EventArgs e)
        {
            this.Invalidate();
            base.OnSizeModeChanged(e);
        }

        protected override void OnSizeChanged(EventArgs e)
        {
            this.Invalidate();
            base.OnSizeChanged(e);
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            Graphics gr = pe.Graphics;

            base.OnPaint(pe);

            if (Image != null)
            {
                //get Image-Location and -Size in Picturebox
                Point p = default(Point);
                Size s = default(Size);
                switch (SizeMode)
                {
                    case PictureBoxSizeMode.Normal:
                    case PictureBoxSizeMode.StretchImage:
                    case PictureBoxSizeMode.CenterImage:
                        s = this.Size;
                        p = new Point(0, 0);
                        break;
                    case PictureBoxSizeMode.AutoSize:
                        s = Image.Size;
                        p = new Point(0, 0);
                        break;
                    case PictureBoxSizeMode.Zoom:
                        float factor = Math.Max(Convert.ToSingle(Image.Height) / Convert.ToSingle(this.Height), Convert.ToSingle(Image.Width) / Convert.ToSingle(this.Width));
                        s = new Size(Convert.ToInt32(Convert.ToSingle(Image.Width) / factor), Convert.ToInt32(Convert.ToSingle(Image.Height) / factor));
                        p = new Point((this.Width - s.Width) / 2, (this.Height - s.Height) / 2);
                        break;
                }


                //draw Grid-Lines (vertical)
                for (int x = 0; x <= s.Width; x += my_GridSize.Width)
                {
                    gr.DrawLine(new Pen(my_GridColor, 1), x + p.X, p.Y, x + p.X, p.Y + s.Height);
                }

                //draw Grid-Lines (horizontal)
                for (int y = 0; y <= s.Height; y += my_GridSize.Height)
                {
                    gr.DrawLine(new Pen(my_GridColor, 1), p.X, y + p.Y, p.X + s.Width, y + p.Y);
                }
            }

        }
    }


Mallesh Shantagiri

@Ральф Майер , на мой код выше , инт инт J и K являются расположении картинок , сохраняя J при постоянной и возрастающей значением K , я могу создать один столбец прямоугольников на верхней части изображения(изображение изображение), теперь мне нужна логика, чтобы нарисовать прямоугольники, которые должны охватить всю картину окно по размеру картинки окно ( через графики в C#).например коробка изображения ширина 600, а высота 400 , хочу обратить 24 прямоугольники на нем , как я могу это сделать . (picture box получает живые изображения в качестве входных данных). я надеюсь , что вы поняли мою проблему , она очень проста , мне просто нужен цикл for, чтобы рисовать в нем прямоугольники, но я не понимаю, как написать эту логику.

Ralf Meier

Вы пробовали и проверяли мое решение ?
Он рисует сетку (как вы описали) на изображении, которое помещается в PictureBox (с учетом свойства SizeMode PictureBox). Я думаю, что это то, что вы хотите иметь - случай другой : что (точно) должно быть изменено ?

Mallesh Shantagiri

спасибо @Ральф Мейер