Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 19.12.2016
Сообщений: 43

Вырезать круг из квадратной картинки

19.09.2017, 23:24. Показов 4356. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Рисую на контролле картинку, есть необходимость вырезать из неё круг.
Скажите, возможно ли это зделать, а если возможно то скажите пожалуйста как.
Гуглил, находил только, как вырезать прямоугольную область вырезать.
Миниатюры
Вырезать круг из квадратной картинки   Вырезать круг из квадратной картинки  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.09.2017, 23:24
Ответы с готовыми решениями:

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

Круг какой площади можно вырезать из полученного прямоугольника?
Из круга радиусом R вырезан прямоугольник, большая сторона которого равна А. Круг какой площади можно вырезать из полученного...

Вырезать часть картинки
Здраствуйте, я новичок во флеш, требуется помощь. Есть растровая картинка в формате jpeg: картинка. Нужно сделать чтоб человечки прыгали...

6
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
20.09.2017, 10:17
Цитата Сообщение от the_alex_mark Посмотреть сообщение
Рисую на контролле картинку, есть необходимость вырезать из неё круг.
Залить - область не входящую в круг нужным цветом.
0
0 / 0 / 1
Регистрация: 19.12.2016
Сообщений: 43
20.09.2017, 10:26  [ТС]
Не пойму как
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
20.09.2017, 10:42
the_alex_mark,
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
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CurBitmap = (Bitmap)Image.FromFile("C://nard.jpg");
            double R = CurBitmap.Width / 2;
            using (var wr = new ImageWrapper(CurBitmap))
            {
                foreach (Point p in wr)
                {
                    Point center = new Point(CurBitmap.Width / 2, CurBitmap.Height / 2);
                    double Distance = Math.Sqrt(Math.Pow(p.X - center.Y, 2) + Math.Pow(p.Y - center.Y, 2));
                    if (Distance > R) wr.SetPixel(p, 255, 255, 255);
                    else wr.SetPixel(p, wr[p].R, wr[p].G, wr[p].B);
                }
            }
        }
        Bitmap CurBitmap;
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawImage(CurBitmap, 0, 0);
        }
    }
    public class ImageWrapper : IDisposable, IEnumerable<Point>
    {
        /// <summary>
        /// Ширина изображения
        /// </summary>
        public int Width { get; private set; }
        /// <summary>
        /// Высота изображения
        /// </summary>
        public int Height { get; private set; }
        /// <summary>
        /// Цвет по-умолачнию (используется при выходе координат за пределы изображения)
        /// </summary>
        public Color DefaultColor { get; set; }
 
        private byte[] data;//буфер исходного изображения
        private byte[] outData;//выходной буфер
        private int stride;
        private BitmapData bmpData;
        private Bitmap bmp;
 
        /// <summary>
        /// Создание обертки поверх bitmap.
        /// </summary>
        /// <param name="copySourceToOutput">Копирует исходное изображение в выходной буфер</param>
        public ImageWrapper(Bitmap bmp, bool copySourceToOutput = false)
        {
            Width = bmp.Width;
            Height = bmp.Height;
            this.bmp = bmp;
 
            bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            stride = bmpData.Stride;
 
            data = new byte[stride * Height];
            System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, data, 0, data.Length);
 
            outData = copySourceToOutput ? (byte[])data.Clone() : new byte[stride * Height];
        }
 
        /// <summary>
        /// Возвращает пиксел из исходнго изображения.
        /// Либо заносит пиксел в выходной буфер.
        /// </summary>
        public Color this[int x, int y]
        {
            get
            {
                var i = GetIndex(x, y);
                return i < 0 ? DefaultColor : Color.FromArgb(data[i + 3], data[i + 2], data[i + 1], data[i]);
            }
 
            set
            {
                var i = GetIndex(x, y);
                if (i >= 0)
                {
                    outData[i] = value.B;
                    outData[i + 1] = value.G;
                    outData[i + 2] = value.R;
                    outData[i + 3] = value.A;
                };
            }
        }
 
        /// <summary>
        /// Возвращает пиксел из исходнго изображения.
        /// Либо заносит пиксел в выходной буфер.
        /// </summary>
        public Color this[Point p]
        {
            get { return this[p.X, p.Y]; }
            set { this[p.X, p.Y] = value; }
        }
 
        /// <summary>
        /// Заносит в выходной буфер значение цвета, заданные в double.
        /// Допускает выход double за пределы 0-255.
        /// </summary>
        public void SetPixel(Point p, double r, double g, double b)
        {
            if (r < 0) r = 0;
            if (r >= 256) r = 255;
            if (g < 0) g = 0;
            if (g >= 256) g = 255;
            if (b < 0) b = 0;
            if (b >= 256) b = 255;
 
            this[p.X, p.Y] = Color.FromArgb((int)r, (int)g, (int)b);
        }
 
        int GetIndex(int x, int y)
        {
            return (x < 0 || x >= Width || y < 0 || y >= Height) ? -1 : x * 4 + y * stride;
        }
 
        /// <summary>
        /// Заносит в bitmap выходной буфер и снимает лок.
        /// Этот метод обязателен к исполнению (либо явно, лмбо через using)
        /// </summary>
        public void Dispose()
        {
            System.Runtime.InteropServices.Marshal.Copy(outData, 0, bmpData.Scan0, outData.Length);
            bmp.UnlockBits(bmpData);
        }
 
        /// <summary>
        /// Перечисление всех точек изображения
        /// </summary>
        public IEnumerator<Point> GetEnumerator()
        {
            for (int y = 0; y < Height; y++)
                for (int x = 0; x < Width; x++)
                    yield return new Point(x, y);
        }
 
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
 
        /// <summary>
        /// Меняет местами входной и выходной буферы
        /// </summary>
        public void SwapBuffers()
        {
            var temp = data;
            data = outData;
            outData = temp;
        }
    }
ImageWrapper storm'a23 https://www.cyberforum.ru/blog... g3507.html
Миниатюры
Вырезать круг из квадратной картинки  
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
20.09.2017, 11:08
Вариант по проще, стандартными инструментами:

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
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
 
namespace CirclePaint
{
    public partial class MainForm : Form
    {
        /// <summary>
        /// Для перевода в радианы
        /// </summary>
        private const double GR = Math.PI / 180.0;
 
        /// <summary>
        /// Центр окружности
        /// </summary>
        private Point CentralPoint = new Point(250, 250);
 
        /// <summary>
        /// Радиус окружности
        /// </summary>
        private int Radius = 200;
 
        /// <summary>
        /// GraphicsPath (контур отрисовки)
        /// </summary>
        private GraphicsPath GrPath = new GraphicsPath();
 
        /// <summary>
        /// Основная форма
        /// </summary>
        public MainForm()
        {
            InitializeComponent();
            Calc();
        }
 
        /// <summary>
        /// Расчет области отрисовки
        /// </summary>
        private void Calc()
        {
            var len = 360;
            var pointsPath = new Point[len];
 
            for (int i = 0; i < len; i++)
            {
                var x = CentralPoint.X + Radius * Math.Cos(i * GR);
                var y = CentralPoint.X + Radius * Math.Sin(i * GR);
 
                pointsPath[i] = new Point((int)x, (int)y);
 
                GrPath.AddLine( i == 0 ? pointsPath[i] :pointsPath[i - 1], pointsPath[i]);
            }
        }
 
        /// <summary>
        /// Отрисовка
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.SetClip(new Region(GrPath), CombineMode.Replace);
            e.Graphics.DrawImage(Res.cat, new Point());
        }
    }
}
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
20.09.2017, 11:15
картинки
Миниатюры
Вырезать круг из квадратной картинки   Вырезать круг из квадратной картинки  
0
0 / 0 / 1
Регистрация: 19.12.2016
Сообщений: 43
20.09.2017, 20:46  [ТС]
Нашёл решение:
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
private Image RoundingImage(Image Image)
        {
            Int32 Radius = Image.Width;
 
            Bitmap RoundedImage = new Bitmap(Image.Width, Image.Height);
            using (Graphics G = Graphics.FromImage(RoundedImage))
            {
                G.Clear(Color.Transparent);
                G.SmoothingMode = SmoothingMode.AntiAlias;
                G.CompositingQuality = CompositingQuality.HighQuality;
                G.InterpolationMode = InterpolationMode.HighQualityBicubic;
 
                using (Brush Brush = new TextureBrush(Image))
                {
                    using (GraphicsPath GP = new GraphicsPath())
                    {
                        GP.AddArc(0, 0, Radius, Radius, 180, 90);
                        GP.AddArc(Image.Width - Radius - 0, 0, Radius, Radius, 270, 90);
                        GP.AddArc(0 + Image.Width - Radius, 0 + Image.Height - Radius, Radius, Radius, 0, 90);
                        GP.AddArc(0, Image.Height - Radius, Radius, Radius, 90, 90);
 
                        G.FillPath(Brush, GP);
                    }
                }
                return RoundedImage;
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.09.2017, 20:46
Помогаю со студенческими работами здесь

Вырезать черные полосы у картинки
Доброго времени суток! Друзья, подскажите, как можно обрезать у картинки черные полосы, если таковые имеются. Вот например картинка (в...

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

Как вырезать часть картинки?
Вроде все просто а додуматься как это сделать не моу(Есть картинка в pictureBox1. На картинке отрисован квадрат. Нужно все что в этом...

Вырезать объект c бинарной картинки
Задача такая - нужно из изображения вырезать объект. С обработкой изображения столкнулась в первый раз и несколько сложно все это в...

Как вырезать картинки из документов
Есть такой вопрос - как вырезать картинки из документов в формате pdf(Adobe Reader 8)? А как вырезать картинки из документов в формате...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru