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

Как обрезать изображение полигонально?

06.10.2016, 09:58. Показов 3111. Ответов 9

Студворк — интернет-сервис помощи студентам
Есть изображение. Хочу обрезать его полигоном, т.е. по нескольким точкам. Но в итоге у меня получается пустое изображение. Подскажите что не так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void CropImage(string imagePath)
        {
            // create a graphic path to hold the shape data
            GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
            var points = new Point[] { new Point(85, 1111), new Point(934, 1111), new Point(934, 952), new Point(1642, 952), new Point(1642, 1188), new Point(2200, 1188), new Point(2200, 2130), new Point(80, 2200),new Point(85, 1111) };                GraphicsPath gp = new GraphicsPath();   
            gp.AddPolygon(points.ToArray());        
 
            Bitmap bmp1 = new Bitmap(1024, 1024); 
 
            using (Bitmap bmp0 = (Bitmap)Bitmap.FromFile(imagePath))
            using (Graphics G = Graphics.FromImage(bmp1))
            {
                G.Clip = new System.Drawing.Region(gp);   
                G.DrawImage(bmp0, 0, 0);
                bmp1.Save("axi.jpeg");
                pictureBox.Image = bmp1;
            }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2016, 09:58
Ответы с готовыми решениями:

Как правильно обрезать изображение?
Здравствуйте! Подскажите как возможно обрезать изображение?

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

Как обрезать изображение
Есть исходная картинка 640*440. Надо вырезать 440*440 сверху, кто даст пример?

9
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.10.2016, 10:19
Radzhab, У вас результирующее изображение имеет размер 1024*1024, а полигон, в котором вы рисуете расположен где-то вдали, начиная с Y = 1111. То есть он просто не попадает в область изображения.
1
12 / 12 / 1
Регистрация: 18.06.2011
Сообщений: 435
06.10.2016, 10:45  [ТС]
Сделал 2220 на 2200 результирующий bmp. Все равно тоже самое
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.10.2016, 11:37
Radzhab, Значит изображение, которое вы рисуете - меньше чем вырезанная область. В любом случае, код - рабочий.
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
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Net;
using System.Windows.Forms;
 
namespace WindowsFormsApplication351
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            var img = (Bitmap)Image.FromStream(new WebClient().OpenRead("http://7oom.ru/wp-content/uploads/foto-priroda-23.jpg"));
            img = CropImage(img);
 
            BackgroundImage = img;
            BackgroundImageLayout = ImageLayout.Zoom;
        }
 
        public Bitmap CropImage(Image img)
        {
            // create a graphic path to hold the shape data
            GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
            var points = new Point[]
                             {
                                 new Point(85, 1111), new Point(934, 1111), new Point(934, 952), new Point(1642, 952),
                                 new Point(1642, 1188), new Point(2200, 1188), new Point(2200, 2130), new Point(80, 2200),
                                 new Point(85, 1111)
                             };
            GraphicsPath gp = new GraphicsPath();
            gp.AddPolygon(points.ToArray());
 
            Bitmap bmp1 = new Bitmap(2220, 2220);
 
            using (Graphics G = Graphics.FromImage(bmp1))
            {
                G.Clip = new Region(gp);
                G.DrawImage(img, 0, 0);
                return bmp1;
            }
        }
    }
}
2
12 / 12 / 1
Регистрация: 18.06.2011
Сообщений: 435
06.10.2016, 14:13  [ТС]
Поправил координаты.
C#
1
2
new Point(85, 1111), new Point(934, 1111), new Point(934, 952), new Point(1642, 952),
new Point(1642, 2000), new Point(85, 2000), new Point(85, 1111)
Для вашей картинки все получается, в моей же почему то не работает.
https://snag.gy/MjJca5.jpg
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.10.2016, 14:27
Лучший ответ Сообщение было отмечено Radzhab как решение

Решение

Цитата Сообщение от Radzhab Посмотреть сообщение
Для вашей картинки все получается, в моей же почему то не работает.
Работает и с моей картинкой, и с вашей:
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
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Net;
using System.Windows.Forms;
 
namespace WindowsFormsApplication351
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            //var img = (Bitmap)Image.FromStream(new WebClient().OpenRead("http://7oom.ru/wp-content/uploads/foto-priroda-23.jpg"));
            var img = (Bitmap)Image.FromStream(new WebClient().OpenRead("https://i.snag.gy/MjJca5.jpg"));
 
            img = CropImage(img);
 
            BackgroundImage = img;
            BackgroundImageLayout = ImageLayout.Zoom;
        }
 
        public Bitmap CropImage(Image img)
        {
            // create a graphic path to hold the shape data
            GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
            var points = new Point[]
                             {
                                new Point(85, 1111), new Point(934, 1111), new Point(934, 952), new Point(1642, 952),
                                new Point(1642, 2000), new Point(85, 2000), new Point(85, 1111)
                             };
            GraphicsPath gp = new GraphicsPath();
            gp.AddPolygon(points.ToArray());
 
            Bitmap bmp1 = new Bitmap(2220, 2220);
 
            using (Graphics G = Graphics.FromImage(bmp1))
            {
                G.Clip = new Region(gp);
                G.DrawImage(img, 0, 0);
                bmp1.Save("axi.jpeg");
                return bmp1;
            }
        }
    }
}
1
12 / 12 / 1
Регистрация: 18.06.2011
Сообщений: 435
07.10.2016, 10:15  [ТС]
Проблема воспроизводится при загрузке файла с локального диска.

Добавлено через 27 минут
Дело в том что через url открывается без проблем, а если пробовать так - то нет. Картинка как будто съеживается в линию.
https://snag.gy/UI3ZiA.jpg
C#
1
2
3
4
5
6
FileStream file = new FileStream(openFileDialog1.FileName, FileMode.Open);
                var img = (Bitmap) Image.FromStream(file);
             
                img = CropImage(img);
                pictureBox1.BackgroundImage = img;
                pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
Добавлено через 17 часов 53 минуты
Может быть потому что файл изначально tiff?

Добавлено через 13 минут
Нашел проблему, все из-за tiff-файла который я юзал. С ним ваш код не работает, с любым другим все работает а с tiff-файлами нет.
0
8 / 0 / 2
Регистрация: 05.03.2016
Сообщений: 2
07.10.2016, 21:01
Лучший ответ Сообщение было отмечено Radzhab как решение

Решение

формат TIFF имеет внутреннюю поддержку нескольких типов сжатия.
.NET в свою очередь поддерживает не все эти типы, например, там нет поддержки JPEG compression
http://www.awaresystems.be/ima... ssion.html.
Выходом может быть использование сторонних библиотек.
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
07.10.2016, 21:05
How to crop a polygonal area from an image in a WinForm pictureBox
http://stackoverflow.com/quest... picturebox
0
0 / 0 / 0
Регистрация: 22.02.2013
Сообщений: 4
09.10.2016, 02:07
Такой вариант тоже нормально отрабатывает + обрезает конечное изображение по минимальному прямоугольнику. Все изображения берутся с диска (архив с тестами прикрепил).
Было бы неплохо увидеть ваше изображение в tif.

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
void Main()
{
    var exts = new[] { ".jpg", ".tif" };
 
    var files = Directory.EnumerateFiles(@"tests").Where(f => exts.Contains(Path.GetExtension(f))).Where(f => !f.Contains(".mdf."));
 
    foreach (var path in files)
    {
        using (var img = Bitmap.FromFile(path))
        {
            var points = new Point[]
            {
                new Point(0, img.Height / 4), new Point(img.Width / 2, img.Height / 7), new Point(img.Width / 2, img.Height / 2), new Point(10, img.Height / 2)
            };
 
            var res = CropImage(img, points);
 
            res.Save(Path.ChangeExtension(path, ".mdf" + Path.GetExtension(path)));
 
            res.Dump();
            
            res.Dispose();
        }
    }
}
 
public static Bitmap CropParall(Image img, int x, int y, int width, int height)
{
    Rectangle cropRect = new Rectangle(0, 0, width, height);
    Bitmap target = new Bitmap(cropRect.Width, cropRect.Height);
 
    using (Graphics g = Graphics.FromImage(target))
    {
        g.DrawImage(img, cropRect, x, y, width, height, GraphicsUnit.Pixel);
                         
        return target;
    }
}
 
public static Bitmap CropImage(Image img, Point[] points)
{
    GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
 
    GraphicsPath gp = new GraphicsPath();
    gp.AddPolygon(points);
 
    Bitmap bmp1 = new Bitmap(img.Width, img.Height);
 
    var left = points.Min(it => it.X);
    var top = points.Max(it => it.Y);
    var right = points.Max(it => it.X);
    var bottom = points.Min(it => it.Y);
 
    using (Graphics G = Graphics.FromImage(bmp1))
    {
        G.Clip = new Region(gp);
        G.DrawImage(img, 0, 0);
 
        return CropParall(bmp1, left, bottom, right - left, top - bottom);
    }
}
Вложения
Тип файла: zip tests.zip (5.30 Мб, 2 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.10.2016, 02:07
Помогаю со студенческими работами здесь

Как обрезать изображение?
Есть код. <div style="margin-bottom:-125px; overflow:hidden;"> <img src="a.jpg" width="374" height="512" style="overflow:hidden;"> ...

Как уменьшить и обрезать изображение?
Есть картинка 663х882. Мне нужно её уменьшить до 180х197. Проблема состоит в том, что при уменьшении она растягивается по ширине и...

Как обрезать изображение средствами javascript?
Здравствуйте! Столкнулся с проблемой, изображение находиться в div блоке при перетаскивании изображения, оно выходит за рамки div блока....

Обрезать изображение
<div style="overflow:hidden;"> <img style="width: 100%;" src="img/1.jpg" /> </div> Как сделать так, чтобы высота была...

Обрезать изображение
Всем доброе утро. Суть: Нужно обрезать изображение с права. С лева обрезал а с права что то ну никак не получается... Прошу подправить мой...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru