Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107

Обрезка картинки и приведение ее к нулевым координатам

23.02.2020, 14:12. Показов 1066. Ответов 14

Студворк — интернет-сервис помощи студентам
Название: n0.png
Просмотров: 61

Размер: 218 байтЕсть картинка, при помощи не хитрого кода я нахожу координаты пикселей, после чего получаю массив Rectangle[].

С этим проблем нет, теперь же я пытаюсь разрезать картинку на части, чтобы потом конструировать из них различные фигуры.
Использую предложенный здесь в одной из тем код:

C#
1
2
3
4
5
6
7
8
9
        Bitmap GetBitmapRegion(Rectangle rect, Bitmap bmp)
        {
            Bitmap region = new Bitmap(rect.Width, rect.Height);
            using (Graphics g = Graphics.FromImage(region))
            {
                g.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);
 
            return region;
        }
Все замечательно, но получаемый фрагмент картинки имеет исходные координаты, будто бы, вырезано было все изображение вокруг этого фрагмента, а мне нужно чтобы координаты были равны нулю.

Некоторые ловкачи рекомендуют изменить строку на такую:
C#
1
g.DrawImage(bmp, 0, 0, rect, GraphicsUnit.Pixel);
В этом случае вырезается не тот участок, который мне нужен, а немного больше. И опять же, его координаты не равны нулю.

Может есть процедура, в которую я просто загружу список Rectangle[], а она нарежет картинку частями, которые я смогу применить куда мне нужно?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2020, 14:12
Ответы с готовыми решениями:

Обрезка картинки
Требуется код программы (VB 2012), который позволит открыть граф. файл. Затем пользователь выделяет куски изображения, а программа доводит...

Обрезка и сохранение картинки
Всем привет. Пытаюсь выдернуть кусок фотки и записать ее в новый фаил. Чет не получается. $targ_w = $targ_h = 200; ...

Обрезка картинки от верха
Здравствуйте. Такой вопрос, каким образом можно организовать обрезку фото как у object-fit: cover, только чтобы он брал обрезку делал...

14
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.02.2020, 14:16
Zeropil, у структуры Rectangle помимо ширины и высоты так же есть свойства, определяющие его положение.
Перед передачей своего прямоугольника в метод изменяйте эти значения на нужные координаты (можете делать на копии, если хочется сохранить оригинальный объект).
1
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
23.02.2020, 18:29  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Rectangle помимо ширины и высоты так же есть свойства, определяющие его положение.
Я в курсе его нулевых координат, и понимаю принцип кода, который выполняет процедура

C#
1
g.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);
первый прямоугольник задает координаты и размер в котором рисуется объект выделенный вторым прямоугольником.
второй прямоугольник задает начало координат и размер нашей картинки, и все бы хорошо если бы последний параметр работал не с координатами, а с процентами от размера исходной картинки, но это не так.

То есть, если я желаю закрасить этой фигурой начало формы, то логично было бы взять прямоугольник с значениями 0,0 как начало координат и размером картинки W,H которую я вырезал. Проблема в том, что этого не происходит. Картинка всегда получается сдвинута относительно нулевых координат. Я решал эту проблему добавлением костыля вроде сдвига по осям "вручную" подбирая значения, но для каждой картинки это геморно делать всякий раз.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.02.2020, 18:34
Цитата Сообщение от Zeropil Посмотреть сообщение
Картинка всегда получается сдвинута относительно нулевых координат.
Так вы один и тот же регион передаете обоими аргументами — rect.
Если этот регион представляет размер и положение найденной фигуры в изначальном изображении, то разумеется в новом изображении отрисовка будет сдвинута.
1
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
23.02.2020, 18:38  [ТС]
К примеру, в NeoAxis, этот компонент структуры Rectangle был переписан. Там его начальные координаты являются центром прямоугольника, а размер является его значением высоты и ширины деленным на 2. При работе с графикой это удобно, проще центровать фигуры и т.д. и если залить картинку в такой вот прямоугольник она будет строго по центру фигуры и сжата в размерах до размеров прямоугольника. Исходного кода к сожалению нет, и узнать как это делается тоже проблема. Однако, данный класс легко работает с процентами, не только со значениями, а это упрощает процесс написания кода, и картинка растягивается равномерно, нет заваленных или сжатых пикселей, что не новость.

Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Так вы один и тот же регион передаете обоими аргументами — rect.
пробовал подставлять другой прямоугольник, new Rectangle(0,0,w,h); где

w и h размеры размеры прямоугольника который передается в процедуру
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.02.2020, 19:10
Цитата Сообщение от Zeropil Посмотреть сообщение
пробовал подставлять другой прямоугольник
Ну видать что-то где-то у вас путается.

На примере изображения (исходную картинку взял в одной из местных тем, да простит меня автор):
Название: block.PNG
Просмотров: 52

Размер: 2.7 Кб

Исходная картинка 300х60 пикселей, каждая клетка — 30х30.
Нам нужно выдрать седьмую клетку из второго ряда:
Название: out.png
Просмотров: 52

Размер: 280 байт

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
// Грузим исходное изображение
var source = Image.FromFile("block.png");
 
// Седьмая клетка второго ряда, размер 30х30 писькелей
var rect = new Rectangle(6 * 30, 30, 30, 30);
 
// Целевой регион в новом изображении: (0, 0), 30x30
var targetRect = new Rectangle(Point.Empty, rect.Size);
var region = new Bitmap(rect.Width, rect.Height, source.PixelFormat);
using (var g = Graphics.FromImage(region))
    g.DrawImage(source, targetRect, rect, GraphicsUnit.Pixel);
 
region.Save("out.png", ImageFormat.Png);
Изображение out.png прицеплено выше.
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
24.02.2020, 10:57  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
var region = new Bitmap(rect.Width, rect.Height, source.PixelFormat);
подозрительная строка, скорее дело в ней.

Добавлено через 2 часа 21 минуту
C#
1
2
gfx.DrawRectangle(new Pen(Color.Green), x1, y1, cx, cy);
                    gfx.DrawLine(new Pen(Color.Green), x1, y1, cx, cy);
забавно выходит, координаты те же, но в случае с линией рисуется диагональ нужной длинны.
а в случае с квадратом, он получается вытянутым вниз.

Из чего можно смело сделать вывод, что класс Rectangle является багнутым для класса Graphics

Добавлено через 2 минуты
Возможно на других платформах этот исправлено, но на версии 4.0 увы, нет

Добавлено через 32 минуты
А вот так работает...
C#
1
2
gfx.DrawRectangle(new Pen(Color.Green), x1, y1, cx - x1, cy - y1);
                    gfx.DrawLine(new Pen(Color.Green), x1, y1, cx, cy);
Какая то лажа выходит... всякий раз костыль делать, хотя должны координаты начала дублироваться к размеру прямоугольника.

Добавлено через 1 минуту
И проблема тут именно в том, что это структура, а не класс, который можно было бы переопределить

Добавлено через 51 минуту
В общем, поэкспериментировал слегка, чтобы свести координаты вырезанного участка к нулю, нужно отнять от позиции (в которой его нужно нарисовать) координаты начала региона, который передаем в метод.
То-есть, вычитание делать после того, как картинка получена, а не до этого.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.02.2020, 11:12
Цитата Сообщение от Zeropil Посмотреть сообщение
можно смело сделать вывод, что класс Rectangle является багнутым для класса Graphics
Я бы был о-очень осторожен в подобных заявлениях, на 146% не убедившись, что косяк не в собственном коде

Цитата Сообщение от Zeropil Посмотреть сообщение
координаты те же, но в случае с линией рисуется диагональ нужной длинны.
DrawLine рисует линию, соединяющую две точки (x1;y1) и (cx;cy).
DrawRectangle рисует прямоугольник, верхний левый угол которого расположен в (x1;y1) с шириной cx и высотой cy.

Вы не привели значений ваших переменных, потому понять что у вас получается не так — невозможно.
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
var bmp = new Bitmap(100, 100);
 
using (var gfx = Graphics.FromImage(bmp))
{
    int x1 = 0, y1 = 0;
    int cx = 20, cy = 20;
 
    gfx.DrawRectangle(Pens.Green, x1, y1, cx, cy);
    gfx.DrawLine(Pens.Red, x1, y1, cx, cy);
}
 
bmp.Save("out.png", ImageFormat.Png);
Результат:
Название: out.png
Просмотров: 45

Размер: 307 байт

.NET 4.0.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.02.2020, 11:15
Цитата Сообщение от Zeropil Посмотреть сообщение
Какая то лажа выходит
Отрисовка в GDI производится слева направо, сверху вниз, начало координат — верхний левый угол изображения.
Может, вы делали код отрисовки, исходя из предположения, что указанные точки — это центр прямоугольника?
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
24.02.2020, 14:56  [ТС]
исходный код формы
Кликните здесь для просмотра всего текста
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
public partial class Form1 : Form
    {
        int j = 0, k = 0;
        private Bitmap image = null;
        private List<Figure> figures = new List<Figure>();
 
        public Form1()
        {
            InitializeComponent();
 
            this.Opacity = 0.85;
            this.FormBorderStyle = FormBorderStyle.None;
            this.AllowTransparency = true;
            this.BackColor = Color.Black;//цвет фона  
          //  this.TransparencyKey = this.BackColor;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            image = GetImage(out j,out k);
 
            label1.Text = figures.Count.ToString();
        }
 
        private Bitmap GetImage(out int j,out int k)
        {
            figures.Clear();
            Figure line1 = new Figure(FigureType.Line);
            figures.Add(line1);
            Figure line2 = new Figure(FigureType.Line);
            figures.Add(line2);
            Figure line3 = new Figure(FigureType.Line);
            figures.Add(line3);
 
            Figure[] fig = new Figure[] { line1, line2, line3 };
 
            int indexLines = -1, indexSquare = -1;
 
            Figure square = new Figure(FigureType.Square);
            figures.Add(square);
 
            Bitmap mask = Properties.Resources.n0;
            Bitmap image = Properties.Resources.n1;
 
            Bitmap bmp = null; Color color;
            using (Graphics g = Graphics.FromImage(image))
            {
                for (int y = 0; y < image.Height; y++)
                {
                    for (int x = 0; x < image.Width; x++)
                    {
                        color = mask.GetPixel(x, y);
                        //Color 255 0 0 - start
 
                      //  MessageBox.Show(string.Format("X:{0}Y:{1}",x,y));
 
                        if (Compare(color, Color.FromArgb(255, 0, 0)))
                        {
                            UpdateLines(ref indexLines, fig, new Point(x, y));
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
 
                        }//Color 255 0 255 - end
                        else if (Compare(color, Color.FromArgb(255, 0, 255)))
                        {
                            UpdateLines(ref indexLines, fig, new Point(x, y)); 
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
 
                        }//Color 0 0 255 - start rect
                        else if (Compare(color, Color.FromArgb(0, 0, 255)))
                        {
                            UpdateSquare(ref indexSquare, square, new Point(x, y)); 
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
 
                        }//Color 255 255 0 - center rect
                        else if (Compare(color, Color.FromArgb(255, 255, 0)))
                        {
                            UpdateSquare(ref indexSquare, square, new Point(x, y)); 
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
 
                        }
                        else if (Compare(color, Color.FromArgb(0, 0, 0)))
                        {
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
                        }
                        else
                        {
                            image.SetPixel(x, y, Color.FromArgb(0, 255, 255));
                        }
                    }
                }
 
                bmp = new Bitmap(image.Width, image.Height, g);
            }
 
            j = indexLines;
            k = indexSquare;
 
            return image;// bmp;
        }
 
        private static int UpdateSquare(ref int indexSquare, Figure figure, Point point)
        {
            indexSquare++;
            if (indexSquare == 0)
            {
                figure.AddPoint(PointType.PointLT, point);
            }
            else if (indexSquare == 1)
            {
                figure.AddPoint(PointType.PointRT, point);
            }
            else if (indexSquare == 2)
            {
                figure.AddPoint(PointType.Center, point);
            }
            else if (indexSquare == 3)
            {
                figure.AddPoint(PointType.PointLB, point);
            }
            else if (indexSquare == 4)
            {
                figure.AddPoint(PointType.PointRB, point);
            }
 
            return indexSquare;
        }
 
        private static int UpdateLines(ref int indexLines, Figure[] figures, Point point)
        {
            indexLines++;
            if (indexLines == 0)
            {
                figures[0].AddPoint(PointType.PointLT, point);
            }
            else if (indexLines == 1)
            {
                figures[0].AddPoint(PointType.PointRB, point);
            }
            else if (indexLines == 2)
            {
                figures[1].AddPoint(PointType.PointLT, point);
            }
            else if (indexLines == 3)
            {
                figures[1].AddPoint(PointType.PointRB, point);
            }
            else if (indexLines == 4)
            {
                figures[2].AddPoint(PointType.PointLT, point);
            }
            else if (indexLines == 5)
            {
                figures[2].AddPoint(PointType.PointRB, point);
            }
 
            return indexLines;
        }
 
        //////////////////////////////////////////////////////////////////////////////////////////////
        
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        enum FigureType
        {
            Line = 0,
            Triangle = 1,
            Square = 2,
        }
 
        enum PointType
        {
            Center = 0,
 
            PointLT = 1,
            PointLC = 2,
            PointLB = 3,
 
            PointCT = 4,
 
            PointRT = 5,
            PointRC = 6,
            PointRB = 7,
 
            PointCB = 8
        }
 
        class Figure
        {
            class _Point
            {
                readonly int _x = 0, _y = 0;
                readonly PointType _type = PointType.Center;
 
                public _Point(Point point, PointType type)
                {
                    this._x = point.X;
                    this._y = point.Y;
                    this._type = type;
                }
 
                public Point Point
                {
                    get { return new Point(_x, _y); }
                }
 
                public PointType Type
                {
                    get { return _type; }
                }
            }
 
            private List<_Point> _points = new List<_Point>();
            readonly FigureType _type = FigureType.Line;
 
            public Figure()
                : this(FigureType.Line)
            {
            }
 
            public Figure(FigureType type)
            {
                this._type = type;
            }
 
            public FigureType GetFType()
            {
                return _type;
            }
 
            public void AddPoint(PointType t, Point p)
            {
                _points.Add(new _Point(p, t));
            }
 
            public object GetFigure(Graphics gfx)
            {
 
                if (_type == FigureType.Line)
                {
                    int x = 0, y = 0, w = 0, h = 0;
                    foreach (_Point p in _points)
                    {
                        if (p.Type == PointType.PointLT)
                        {
                            x =  p.Point.X;
                            y =  p.Point.Y;
                        }
                        else if (p.Type == PointType.PointRB)
                        {
                            w =  p.Point.X;
                            h =  p.Point.Y;
                        }
                    }
 
                    if (gfx != null)
                    {
 
                        gfx.DrawRectangle(new Pen(Color.Red), x, y, w - x, h - y);
                        gfx.DrawLine(new Pen(Color.Red), x, y, w, h);
                    }
 
                  //  gfx.DrawRectangle(new Pen(Color.Red), x, y, w, h);
 
                    return new Rectangle(x, y, w, h);
                }
                else if (_type == FigureType.Triangle)
                {
                    int x1 = 0, y1 = 0, w1x2 = 0, h1y2 = 0, w2 = 0, h2 = 0;
                    foreach (_Point p in _points)
                    {
                        if (p.Type == PointType.PointLT)
                        {
                            x1 =  p.Point.X;
                            y1 =  p.Point.Y;
                        }
                        else if (p.Type == PointType.Center)
                        {
                            w1x2 =  p.Point.X;
                            h1y2 =  p.Point.Y;
                        }
                        else if (p.Type == PointType.PointRB)
                        {
                            w2 =  p.Point.X;
                            h2 =  p.Point.Y;
                        }
 
                    }
 
                    if (gfx != null)
                    {
                        gfx.DrawRectangle(new Pen(Color.Orange), x1, y1, w1x2 - x1, w1x2 - y1);
                        gfx.DrawLine(new Pen(Color.Orange), x1, y1, w1x2, w1x2);
 
                        gfx.DrawRectangle(new Pen(Color.Yellow), w1x2, h1y2, w2 - w1x2, h2 - h1y2);
                        gfx.DrawLine(new Pen(Color.Yellow), w1x2, h1y2, w2, h2);
                    }
 
                    return new Rectangle[] { 
                        new Rectangle(x1, y1, w1x2, h1y2), 
                        new Rectangle(w1x2, h1y2, w2, h2) 
                    };
                }
                else if (_type == FigureType.Square)
                {
                    int x1 = 0, x2 = 0, x3 = 0, x4 = 0, y1 = 0, y2 = 0, y3 = 0, y4 = 0, cx = 0, cy = 0;
                    foreach (_Point p in _points)
                    {
                        if (p.Type == PointType.PointLT)
                        {
                            x1 =  p.Point.X;
                            y1 =  p.Point.Y;
                        }
 
                        else if (p.Type == PointType.PointLB)
                        {
                            x3 =  p.Point.X;
                            y3 =  p.Point.Y;
                        }
                        else if (p.Type == PointType.Center)
                        {
                            cx =  p.Point.X;
                            cy =  p.Point.Y;
                        }
                        else if (p.Type == PointType.PointRB)
                        {
                            x4 =  p.Point.X;
                            y4 =  p.Point.Y;
                        }
                        else if (p.Type == PointType.PointRT)
                        {
                            x2 =  p.Point.X;
                            y2 =  p.Point.Y;
                        }
                    }
 
                    if (gfx != null)
                    {
                        gfx.DrawRectangle(new Pen(Color.Green), x1, y1, cx - x1, cy - y1);
                        gfx.DrawLine(new Pen(Color.Green), x1, y1, cx, cy);
 
                        gfx.DrawRectangle(new Pen(Color.LightBlue), cx, y1, x2 - cx, cy - y1);
                        gfx.DrawLine(new Pen(Color.LightBlue), cx, y1, x2, cy);
 
                        gfx.DrawRectangle(new Pen(Color.Blue), x1, cy, cx - x1, y3 - cy);
                        gfx.DrawLine(new Pen(Color.Blue), x1, cy, cx, y3);
 
                        gfx.DrawRectangle(new Pen(Color.Violet), cx, cy, x4 - cx, y4 - cy);
                        gfx.DrawLine(new Pen(Color.Violet), cx, cy, x4, y4);
                    }
 
                    return new Rectangle[] { 
                        new Rectangle(x1, y1, cx, cy), 
                        new Rectangle(cx, y1, x2, cy), 
                        new Rectangle(x1, cy, cx, y3), 
                        new Rectangle(cx, cy, x4, y4)
                    };
 
                    
                }
                return Rectangle.Empty;
            }
        }
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        bool Compare(Color c1, Color c2, int ac = 5)
        {
            if (Math.Abs(c1.R - c2.R) > ac)
                return false;
            if (Math.Abs(c1.G - c2.G) > ac)
                return false;
            if (Math.Abs(c1.B - c2.B) > ac)
                return false;
 
            return true;
        }
 
        //////////////////////////////////////////////////////////////////////////////////////////////
        Color[] c = new Color[] 
        { 
            Color.Aqua,
            Color.BlueViolet,
            Color.Red,
            Color.Green,
            Color.Pink,
            Color.Gold
        };
 
        Random rnd = new Random();
 
        Bitmap GetBitmapRegion(Rectangle rect, Bitmap bmp)
        {
            int i = rnd.Next(c.Length);
 
            Bitmap region = new Bitmap(rect.Width, rect.Height, bmp.PixelFormat);
 
            using (Graphics g = Graphics.FromImage(region))
            {
                g.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);
 
                for (int y = 0; y < region.Height; y++)
                {
                    for (int x = 0; x < region.Width; x++)
                    {
                       Color color = region.GetPixel(x, y);
 
                       if (color.B > 10 || color.G > 10 || color.R > 10)
                           region.SetPixel(x, y, c[i]);
                    }
                }
            }
 
            return region;
        }
 
        //////////////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
 
            
            Rectangle[] rect = (Rectangle[])figures[3].GetFigure(gfx);
            Rectangle diagonal = (Rectangle)figures[0].GetFigure(gfx);
            Rectangle vertical = (Rectangle)figures[1].GetFigure(gfx);
            Rectangle horizontal = (Rectangle)figures[2].GetFigure(gfx); 
            
 
            Bitmap lt = GetBitmapRegion(rect[0], image);
            Bitmap rt = GetBitmapRegion(rect[1], image);
            Bitmap lb = GetBitmapRegion(rect[2], image);
            Bitmap rb = GetBitmapRegion(rect[3], image);
 
            Bitmap diagonal = GetBitmapRegion(rect0, image);
            Bitmap vertical = GetBitmapRegion(rect1, image);
            Bitmap horizontal = GetBitmapRegion(rect2, image);
 
 
            e.Graphics.DrawImage(lt, 0, 0);
            e.Graphics.DrawImage(lb, 0, 0);
 
            e.Graphics.DrawImage(vertical, 0, 0);
 
            e.Graphics.DrawImage(diagonal, 0, 0);
            
            e.Graphics.DrawImage(horizontal, 0, 0);
 
            e.Graphics.DrawImage(rt, 0, 0);
            e.Graphics.DrawImage(rb, 0, 0);
            
 
            this.Text = string.Format("J={0}/{1}", j, k);
        }
    }


Картинка та же,что и в заголовке.

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

Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
bmp.Save("out.png", ImageFormat.Png);
Может проблема понимания в этом?
Я не сохраняю картинку, я хочу ее нарисовать на форме. А в этом случае может быть так, что она не там где нужна по координатам?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.02.2020, 19:16
Цитата Сообщение от Zeropil Посмотреть сообщение
исходный код формы
Перед вставкой код подвергся какому-то редактированию.
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
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
 
            
            Rectangle[] rect = (Rectangle[])figures[3].GetFigure(gfx);
            Rectangle diagonal = (Rectangle)figures[0].GetFigure(gfx);
            Rectangle vertical = (Rectangle)figures[1].GetFigure(gfx);
            Rectangle horizontal = (Rectangle)figures[2].GetFigure(gfx); 
            
 
            Bitmap lt = GetBitmapRegion(rect[0], image);
            Bitmap rt = GetBitmapRegion(rect[1], image);
            Bitmap lb = GetBitmapRegion(rect[2], image);
            Bitmap rb = GetBitmapRegion(rect[3], image);
 
            Bitmap diagonal = GetBitmapRegion(rect0, image);
            Bitmap vertical = GetBitmapRegion(rect1, image);
            Bitmap horizontal = GetBitmapRegion(rect2, image);
 
 
            e.Graphics.DrawImage(lt, 0, 0);
            e.Graphics.DrawImage(lb, 0, 0);
 
            e.Graphics.DrawImage(vertical, 0, 0);
 
            e.Graphics.DrawImage(diagonal, 0, 0);
            
            e.Graphics.DrawImage(horizontal, 0, 0);
 
            e.Graphics.DrawImage(rt, 0, 0);
            e.Graphics.DrawImage(rb, 0, 0);
            
 
            this.Text = string.Format("J={0}/{1}", j, k);
        }
Переменная gfx не объявлена, переменные diagonal, vertical и horizontal объявлены дважды.
Изображение n1 отсутствует.
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
25.02.2020, 09:51  [ТС]
все верно, я же его редактировал, пробовал новые методы.

C#
1
var gfx = e.Graphics;
если переменную gfx заменить пустым значением, то отладочная информация рисоваться не будет.

Переменные были переименованы чтобы не путаться и на момент публикации скопировал как было.

C#
1
2
3
4
5
6
7
            Rectangle diagonal0 = (Rectangle)figures[0].GetFigure(gfx);
            Rectangle vertical0 = (Rectangle)figures[1].GetFigure(gfx);
            Rectangle horizontal0 = (Rectangle)figures[2].GetFigure(gfx); 
 
            Bitmap diagonal = GetBitmapRegion(diagonal0, image);
            Bitmap vertical = GetBitmapRegion(vertical0, image);
            Bitmap horizontal = GetBitmapRegion(horizontal0, image);
Добавлено через 2 минуты
n1 - идентично оригиналу, только раскрашено не кодом, а редактором, так что можно использовать одну эту же картинку.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.02.2020, 12:41
Zeropil, хотелось бы увидеть конкретный код, демонстрирующий проблему, а не додумывать что и где должно быть.
Я вон выше два раза уже додумал и у меня все работало как надо.
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
25.02.2020, 14:16  [ТС]
Название: 001.png
Просмотров: 29

Размер: 421 байтИспользовал этот метод
Цитата Сообщение от Zeropil Посмотреть сообщение
А вот так работает...
и на форме все рисуется как нужно. Вычел координаты региона при построении изображения.
Кликните здесь для просмотра всего текста
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace DrawingForm
{
    public partial class Form1 : Form
    {
        int j = 0, k = 0;
        private Bitmap image = null;
        private List<Figure> figures = new List<Figure>();
 
        public Form1()
        {
            InitializeComponent();
 
            this.Opacity = 0.85;
            this.FormBorderStyle = FormBorderStyle.None;
            this.AllowTransparency = true;
            this.BackColor = Color.Black;//цвет фона  
            this.TransparencyKey = this.BackColor;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            image = GetImage(out j,out k);
 
            label1.Text = figures.Count.ToString();
        }
 
        private Bitmap GetImage(out int j,out int k)
        {
            figures.Clear();
            Figure line1 = new Figure(FigureType.Line);
            figures.Add(line1);
            Figure line2 = new Figure(FigureType.Line);
            figures.Add(line2);
            Figure line3 = new Figure(FigureType.Line);
            figures.Add(line3);
 
            Figure[] fig = new Figure[] { line1, line2, line3 };
 
            int indexLines = -1, indexSquare = -1;
 
            Figure square = new Figure(FigureType.Square);
            figures.Add(square);
 
            Bitmap mask = Properties.Resources.n0;
            Bitmap image = Properties.Resources.n1;
 
            Bitmap bmp = null; Color color;
            using (Graphics g = Graphics.FromImage(image))
            {
                for (int y = 0; y < image.Height; y++)
                {
                    for (int x = 0; x < image.Width; x++)
                    {
                        color = mask.GetPixel(x, y);
                        //Color 255 0 0 - start
 
                      //  MessageBox.Show(string.Format("X:{0}Y:{1}",x,y));
 
                        if (Compare(color, Color.FromArgb(255, 0, 0)))
                        {
                            UpdateLines(ref indexLines, fig, new Point(x, y));
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
 
                        }//Color 255 0 255 - end
                        else if (Compare(color, Color.FromArgb(255, 0, 255)))
                        {
                            UpdateLines(ref indexLines, fig, new Point(x, y)); 
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
 
                        }//Color 0 0 255 - start rect
                        else if (Compare(color, Color.FromArgb(0, 0, 255)))
                        {
                            UpdateSquare(ref indexSquare, square, new Point(x, y)); 
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
 
                        }//Color 255 255 0 - center rect
                        else if (Compare(color, Color.FromArgb(255, 255, 0)))
                        {
                            UpdateSquare(ref indexSquare, square, new Point(x, y)); 
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
 
                        }
                        else if (Compare(color, Color.FromArgb(0, 0, 0)))
                        {
                            image.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
                        }
                        else
                        {
                            image.SetPixel(x, y, Color.FromArgb(0, 255, 255));
                        }
                    }
                }
 
                bmp = new Bitmap(image.Width, image.Height, g);
            }
 
            j = indexLines;
            k = indexSquare;
 
            return image;// bmp;
        }
 
        private static int UpdateSquare(ref int indexSquare, Figure figure, Point point)
        {
            indexSquare++;
            if (indexSquare == 0)
            {
                figure.AddPoint(PointType.PointLT, point);
            }
            else if (indexSquare == 1)
            {
                figure.AddPoint(PointType.PointRT, point);
            }
            else if (indexSquare == 2)
            {
                figure.AddPoint(PointType.Center, point);
            }
            else if (indexSquare == 3)
            {
                figure.AddPoint(PointType.PointLB, point);
            }
            else if (indexSquare == 4)
            {
                figure.AddPoint(PointType.PointRB, point);
            }
 
            return indexSquare;
        }
 
        private static int UpdateLines(ref int indexLines, Figure[] figures, Point point)
        {
            indexLines++;
            if (indexLines == 0)
            {
                figures[0].AddPoint(PointType.PointLT, point);
            }
            else if (indexLines == 1)
            {
                figures[0].AddPoint(PointType.PointRB, point);
            }
            else if (indexLines == 2)
            {
                figures[1].AddPoint(PointType.PointLT, point);
            }
            else if (indexLines == 3)
            {
                figures[1].AddPoint(PointType.PointRB, point);
            }
            else if (indexLines == 4)
            {
                figures[2].AddPoint(PointType.PointLT, point);
            }
            else if (indexLines == 5)
            {
                figures[2].AddPoint(PointType.PointRB, point);
            }
 
            return indexLines;
        }
 
        //////////////////////////////////////////////////////////////////////////////////////////////
        
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        enum FigureType
        {
            Line = 0,
            Triangle = 1,
            Square = 2,
        }
 
        enum PointType
        {
            Center = 0,
 
            PointLT = 1,
            PointLC = 2,
            PointLB = 3,
 
            PointCT = 4,
 
            PointRT = 5,
            PointRC = 6,
            PointRB = 7,
 
            PointCB = 8
        }
 
        class Figure
        {
            class _Point
            {
                readonly int _x = 0, _y = 0;
                readonly PointType _type = PointType.Center;
 
                public _Point(Point point, PointType type)
                {
                    this._x = point.X;
                    this._y = point.Y;
                    this._type = type;
                }
 
                public Point Point
                {
                    get { return new Point(_x, _y); }
                }
 
                public PointType Type
                {
                    get { return _type; }
                }
            }
 
            private List<_Point> _points = new List<_Point>();
            readonly FigureType _type = FigureType.Line;
 
            public Figure()
                : this(FigureType.Line)
            {
            }
 
            public Figure(FigureType type)
            {
                this._type = type;
            }
 
            public FigureType GetFType()
            {
                return _type;
            }
 
            public void AddPoint(PointType t, Point p)
            {
                _points.Add(new _Point(p, t));
            }
 
            public object GetFigure(Graphics gfx)
            {
 
                if (_type == FigureType.Line)
                {
                    int x = 0, y = 0, w = 0, h = 0;
                    foreach (_Point p in _points)
                    {
                        if (p.Type == PointType.PointLT)
                        {
                            x =  p.Point.X;
                            y =  p.Point.Y;
                        }
                        else if (p.Type == PointType.PointRB)
                        {
                            w =  p.Point.X;
                            h =  p.Point.Y;
                        }
                    }
 
                    if (gfx != null)
                    {
 
                        gfx.DrawRectangle(new Pen(Color.Red), x, y, w - x, h - y);
                        gfx.DrawLine(new Pen(Color.Red), x, y, w, h);
                    }
 
                  //  gfx.DrawRectangle(new Pen(Color.Red), x, y, w, h);
 
                    return new Rectangle(x, y, w, h);
                }
                else if (_type == FigureType.Triangle)
                {
                    int x1 = 0, y1 = 0, w1x2 = 0, h1y2 = 0, w2 = 0, h2 = 0;
                    foreach (_Point p in _points)
                    {
                        if (p.Type == PointType.PointLT)
                        {
                            x1 =  p.Point.X;
                            y1 =  p.Point.Y;
                        }
                        else if (p.Type == PointType.Center)
                        {
                            w1x2 =  p.Point.X;
                            h1y2 =  p.Point.Y;
                        }
                        else if (p.Type == PointType.PointRB)
                        {
                            w2 =  p.Point.X;
                            h2 =  p.Point.Y;
                        }
 
                    }
 
                    if (gfx != null)
                    {
                        gfx.DrawRectangle(new Pen(Color.Orange), x1, y1, w1x2 - x1, w1x2 - y1);
                        gfx.DrawLine(new Pen(Color.Orange), x1, y1, w1x2, w1x2);
 
                        gfx.DrawRectangle(new Pen(Color.Yellow), w1x2, h1y2, w2 - w1x2, h2 - h1y2);
                        gfx.DrawLine(new Pen(Color.Yellow), w1x2, h1y2, w2, h2);
                    }
 
                    return new Rectangle[] { 
                        new Rectangle(x1, y1, w1x2, h1y2), 
                        new Rectangle(w1x2, h1y2, w2, h2) 
                    };
                }
                else if (_type == FigureType.Square)
                {
                    int x1 = 0, x2 = 0, x3 = 0, x4 = 0, y1 = 0, y2 = 0, y3 = 0, y4 = 0, cx = 0, cy = 0;
                    foreach (_Point p in _points)
                    {
                        if (p.Type == PointType.PointLT)
                        {
                            x1 =  p.Point.X;
                            y1 =  p.Point.Y;
                        }
 
                        else if (p.Type == PointType.PointLB)
                        {
                            x3 =  p.Point.X;
                            y3 =  p.Point.Y;
                        }
                        else if (p.Type == PointType.Center)
                        {
                            cx =  p.Point.X;
                            cy =  p.Point.Y;
                        }
                        else if (p.Type == PointType.PointRB)
                        {
                            x4 =  p.Point.X;
                            y4 =  p.Point.Y;
                        }
                        else if (p.Type == PointType.PointRT)
                        {
                            x2 =  p.Point.X;
                            y2 =  p.Point.Y;
                        }
                    }
 
                    if (gfx != null)
                    {
                        gfx.DrawRectangle(new Pen(Color.Green), x1, y1, cx - x1, cy - y1);
                        gfx.DrawLine(new Pen(Color.Green), x1, y1, cx, cy);
 
                        gfx.DrawRectangle(new Pen(Color.LightBlue), cx, y1, x2 - cx, cy - y1);
                        gfx.DrawLine(new Pen(Color.LightBlue), cx, y1, x2, cy);
 
                        gfx.DrawRectangle(new Pen(Color.Blue), x1, cy, cx - x1, y3 - cy);
                        gfx.DrawLine(new Pen(Color.Blue), x1, cy, cx, y3);
 
                        gfx.DrawRectangle(new Pen(Color.Violet), cx, cy, x4 - cx, y4 - cy);
                        gfx.DrawLine(new Pen(Color.Violet), cx, cy, x4, y4);
                    }
 
                    return new Rectangle[] { 
                        new Rectangle(x1, y1, cx, cy), 
                        new Rectangle(cx, y1, x2, cy), 
                        new Rectangle(x1, cy, cx, y3), 
                        new Rectangle(cx, cy, x4, y4)
                    };
 
                    
                }
                return Rectangle.Empty;
            }
        }
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        bool Compare(Color c1, Color c2, int ac = 5)
        {
            if (Math.Abs(c1.R - c2.R) > ac)
                return false;
            if (Math.Abs(c1.G - c2.G) > ac)
                return false;
            if (Math.Abs(c1.B - c2.B) > ac)
                return false;
 
            return true;
        }
 
        //////////////////////////////////////////////////////////////////////////////////////////////
        static Color[] c = new Color[] 
        { 
            Color.Aqua,
            Color.BlueViolet,
            Color.Red,
            Color.Green,
            Color.Pink,
            Color.Gold
        };
 
        static Random rnd = new Random();
 
        public static Bitmap GetBitmapRegion(Rectangle rect, Bitmap bmp)
        {
            int i = rnd.Next(c.Length);
 
            Bitmap region = new Bitmap(rect.Width, rect.Height, bmp.PixelFormat);
 
            using (Graphics g = Graphics.FromImage(region))
            {
                g.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);
 
                for (int y = 0; y < region.Height; y++)
                {
                    for (int x = 0; x < region.Width; x++)
                    {
                       Color color = region.GetPixel(x, y);
 
                       if (color.B > 10 || color.G > 10 || color.R > 10)
                           region.SetPixel(x, y, c[i]);
                    }
                }
            }
 
            return region;
        }
 
        //////////////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
 
            AllRegions rect = UpdateRectangle(null/*e.Graphics*/);
 
            rect.Diagonal.Draw(e.Graphics, new Point(0, 0));
            rect.Horizontal.Draw(e.Graphics, new Point(10, 0));
            rect.Horizontal.Draw(e.Graphics, new Point(20, 0));
            rect.Horizontal.Draw(e.Graphics, new Point(30, 0));
            rect.Horizontal.Draw(e.Graphics, new Point(40, 0));
            rect.Horizontal.Draw(e.Graphics, new Point(50, 0));
            rect.Horizontal.Draw(e.Graphics, new Point(60, 0));
            rect.Horizontal.Draw(e.Graphics, new Point(70, 0));
            rect.Horizontal.Draw(e.Graphics, new Point(80, 0));
            rect.Horizontal.Draw(e.Graphics, new Point(90, 0));
 
            rect.RightTop.Draw(e.Graphics, new Point(100, 0));
 
            rect.Vertical.Draw(e.Graphics, new Point(0, 10));
            rect.Vertical.Draw(e.Graphics, new Point(0, 20));
            rect.Vertical.Draw(e.Graphics, new Point(0, 30));
            rect.Vertical.Draw(e.Graphics, new Point(0, 40));
            rect.Vertical.Draw(e.Graphics, new Point(0, 50));
 
            rect.Vertical.Draw(e.Graphics, new Point(102, 8));
            rect.Vertical.Draw(e.Graphics, new Point(102, 18));
            rect.Vertical.Draw(e.Graphics, new Point(102, 28));
            rect.Vertical.Draw(e.Graphics, new Point(102, 38));
            rect.Vertical.Draw(e.Graphics, new Point(102, 48));
            ////
            rect.LeftBottom.Draw(e.Graphics, new Point(0, 60));
            ////
            rect.Horizontal.Draw(e.Graphics, new Point(8, 62));
            rect.Horizontal.Draw(e.Graphics, new Point(17, 62));
            rect.Horizontal.Draw(e.Graphics, new Point(27, 62));
            rect.Horizontal.Draw(e.Graphics, new Point(37, 62));
            rect.Horizontal.Draw(e.Graphics, new Point(47, 62));
            rect.Horizontal.Draw(e.Graphics, new Point(57, 62));
            rect.Horizontal.Draw(e.Graphics, new Point(67, 62));
            rect.Horizontal.Draw(e.Graphics, new Point(77, 62));
            rect.Horizontal.Draw(e.Graphics, new Point(87, 62));
 
 
           // rect.LeftTop.Draw(e.Graphics, new Point(20, 0));
 
           rect.RightBottom.Draw(e.Graphics, new Point(100, 60));
 
            
 
            
 
           // rect.Diagonal.Image.Save("out.png", ImageFormat.Png);
 
           this.Text = string.Format("J={0}/{1}", j, k);
        }
 
        private AllRegions UpdateRectangle(Graphics gfx)
        {
            Rectangle[] rect = (Rectangle[])figures[3].GetFigure(gfx);
            Rectangle diagonal = (Rectangle)figures[0].GetFigure(gfx);
            Rectangle vertical = (Rectangle)figures[1].GetFigure(gfx);
            Rectangle horizontal = (Rectangle)figures[2].GetFigure(gfx);
 
            Rectangle[] ret = new Rectangle[]
            {
               diagonal, vertical, horizontal, rect[0], rect[1], rect[2], rect[3]
            };
 
            return new AllRegions(ret, image);
        }
 
        class AllRegions
        {
            Img[] img = new Img[7];
 
            public AllRegions(Rectangle[] rect, Bitmap bmp)
            {
                for (int i = 0; i < rect.Length; i++)
                    img[i] = new Img(GetBitmapRegion(rect[i],bmp), rect[i]);
            }
 
            public Img LeftTop
            {
                get { return img[3]; }
            }
 
            public Img RightTop
            {
                get { return img[4]; }
            }
 
            public Img LeftBottom
            {
                get { return img[5]; }
            }
 
            public Img RightBottom
            {
                get { return img[6]; }
            }
 
            public Img Diagonal
            {
                get { return img[0]; }
            }
 
            public Img Vertical
            {
                get { return img[1]; }
            }
 
            public Img Horizontal
            {
                get { return img[2]; }
            }
 
            
        }
 
        class Img
        {
            readonly Bitmap _bmp;
            readonly Rectangle _rect;
 
            public Img(Bitmap bmp, Rectangle rect)
            {
                this._bmp = bmp;
                this._rect = rect;
            }
 
            public void Draw(Graphics gfx, Point point)
            {
                gfx.DrawImage(_bmp, point.X - _rect.Left, point.Y - _rect.Top);
            }
 
            public Bitmap Image
            {
                get { return _bmp; }
            }
 
            public Rectangle Rect
            {
                get { return _rect; }
            }
        }
 
    }
}
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
25.02.2020, 14:24  [ТС]
Однако, это тоже костыль. Да еще ограниченный по производительности. Да, многие процедуры можно выполнить лишь при инициализации формы. Тем самым упростив цикличность при отрисовке формы.

Но, код получился слишком константным, и требует наличия некоторых классов... Я же хочу упростить это до одного класса или списка. Чтобы, если нужна линия то и рисовалась конкретная линия.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.02.2020, 14:24
Помогаю со студенческими работами здесь

Масштабирование картинки или обрезка
Цель: выполнить масштаб картинки, то есть ее Scale, если не получится то обрезать используя центральный пиксель(скрин 2), не знаю какой...

Обрезка списка цветов из картинки
День добрый. Стоит следующая задача, есть картинка, в ней кроме whitespace нужно удалить еще 215 цветов, которые идут в разнобой до...

Обрезка картинки при её увеличении
Ребята, у меня вопрос. Можно ли осуществить следующее, если &quot;да&quot;, то как? У меня в блоке &lt;div&gt; есть картинка &lt;img&gt;, которая...

Обрезка картинки до загрузки на сервер
Добрый день. Подскажите, пожалуйста, по такой теме... Нужно добавлять фото к пользователям, они должны быть квадратные, но не...

Обрезка картинки по средством javascript
Можно ли с помощью js обрезать существующую картинку (уже загруженную через html-тег &lt;img&gt;) таким образом, чтобы от картинки...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru