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

Обрезка изображения

05.04.2016, 17:13. Показов 3405. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например, у меня есть черное-белое изображение. Посередине, например, какой-то один черный символ (буква или цифра и т.д.). Мне нужно найти самую верхнюю, нижнюю, правую и левую точку черного изображения. И по этим координатам обрезать. Как это правильно сделать, посоветуйте, пожалуйста.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.04.2016, 17:13
Ответы с готовыми решениями:

Обрезка изображения
Есть у кого пример кода обрезки изображения. Мне нужно с краев изображения убрать лишние полоски и т.д. То есть просто обрезать с четырех...

Обрезка строки
Подскажите, пожалуйста, как удалить из строки первое вхождение "for"

Видеопроигрыватель+ обрезка видео
Доброго времени суток! Без предыстории. Нужно реализовать видеопроигрыватель на C#(WinForms) со следующим функционалом: 1)...

1
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
06.04.2016, 04:20
Лучший ответ Сообщение было отмечено Tanya933 как решение

Решение

Tanya933, я это делал вот так:
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
        private Rectangle GetRectangle(Bitmap img,Color badColor)
        {
            if (img == null) return new Rectangle(0, 0, 0, 0);
            int x = 0, y = 0, right = 0, bottom = 0;
            using (LowLevelImageHandler llih = new LowLevelImageHandler(img))
            {
                llih.LockImage();
                for (int i = 0; i < img.Width; i++)
                    for (int j = 0; j < img.Height; j++)
                            if (badColor.ToArgb() != llih.GetLockedPixel(i, j).ToArgb()) {x = i; goto mark1; }
                mark1:
                for (int i = 0; i < img.Height; i++)
                    for (int j = 0; j < img.Width; j++)
                            if (badColor.ToArgb() != llih.GetLockedPixel(j, i).ToArgb()) { y = i; goto mark2; }
                mark2:
                for (int i = img.Width - 1; i >= 0; i--)
                    for (int j = 0; j < img.Height; j++)
                            if (badColor.ToArgb() != llih.GetLockedPixel(i, j).ToArgb()) {right = i; goto mark3; }
                mark3:
                for (int i = img.Height - 1; i >= 0; i--)
                    for (int j = 0; j < img.Width; j++)
                            if (badColor.ToArgb() != llih.GetLockedPixel(j, i).ToArgb()) { bottom = i; goto mark4; }
            }
            mark4: return new Rectangle(x, y, right - x, bottom - y);
        }
В метод подается Bitmap и цвет, который считается фоном. Возвращается прямоугольник, в котором находится искомое изображение на битмапе. Дальше можно создать битмап такого же размера, как возвращенный прямоугольник, и на него перерисовать изображение при помощи Graphics.DrawImage.

Добавлено через 1 минуту
Класс LowLevelImageHandler, используемый в методе выше:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.Drawing;
 
 
namespace Расчет_Лопатки
{
    public class LowLevelImageHandler : IDisposable //класс для низкоуровневой обработки изображений
    {
        private Bitmap img; //рисунок
        private BitmapData bmpData; //объект BitmapData, нужный для блокировки изображения в памяти
        private int byteLen = 4;
        private byte[] bitmapBuffer; //буфер, с которым работаем
        private Rectangle imageRect;
        public int ImageWidth { get { return img.Width; } }
        public int ImageHeigth { get { return img.Height; } }
        public Rectangle ImageRectangle { get { return imageRect; } }
        public LowLevelImageHandler(Bitmap img) { this.img = img; imageRect = new Rectangle(0, 0, img.Width, img.Height); }
 
        /// <summary>
        /// Блокирует изображение в памяти и копирует байты, из которых оно состоит, в массив
        /// </summary>
        public void LockImage()
        {
            bmpData = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadWrite, img.PixelFormat);
            bitmapBuffer = new byte[bmpData.Stride * bmpData.Height];
            Marshal.Copy(bmpData.Scan0, bitmapBuffer, 0, bitmapBuffer.Length);
            byteLen = bmpData.Stride / bmpData.Width;
        }
 
        /// <summary>
        /// Блокирует изображение в памяти и копирует байты, из которых оно состоит, в массив
        /// </summary>
        public bool ContainsPoint(Point pnt)
        {
            return imageRect.Contains(pnt);
        }
 
        /// <summary>
        /// Получает цвет пикселя с заблокированного в памяти изображения.
        /// </summary>
        /// <param name="location">Координаты запрашиваемого пикселя</param>
        public Color GetLockedPixel(Point location)
        {
            Color col;
            try
            {
                int index = bmpData.Stride * location.Y + location.X * byteLen;
                col = Color.FromArgb(bitmapBuffer[index + 2], bitmapBuffer[index + 1], bitmapBuffer[index + 0]);
            }
            catch (IndexOutOfRangeException) { throw new ArgumentException("Запрашеваемый находится за границами рисунка"); }
            catch (NullReferenceException) { throw new ArgumentException("В памяти не заблокировано изображение"); }
            return col;
        }
        /// <summary>
        /// Получает цвет пикселя с заблокированного в памяти изображения.
        /// </summary>
        /// <param name="x">Координата x запрашиваемого пикселя</param>
        /// <param name="y">Координата y запрашиваемого пикселя</param>
        public Color GetLockedPixel(int x, int y)
        {
            return GetLockedPixel(new Point(x, y));
        }
 
        /// <summary>
        /// Задает цвет пикселя заблокированного в памяти изображения.
        /// </summary>
        /// <param name="x">Координаты задаваемого пикселя</param>
        public void SetLockedPixel(Point location, Color col)
        {
            try
            {
                int index = bmpData.Stride * location.Y + location.X * byteLen;
                bitmapBuffer[index + 2] = col.R;
                bitmapBuffer[index + 1] = col.G;
                bitmapBuffer[index + 0] = col.B;
            }
            catch (IndexOutOfRangeException) { throw new ArgumentException("Запрашеваемый находится за границами рисунка"); }
            catch (NullReferenceException) { throw new ArgumentException("В памяти не заблокировано изображение"); }
        }
 
        /// <summary>
        /// Задает цвет пикселя заблокированного в памяти изображения.
        /// </summary>
        /// <param name="x">Координата x задаваемого пикселя</param>
        /// <param name="y">Координата y задаваемого пикселя</param>
        public void SetLockedPixel(int x, int y, Color col)
        {
            SetLockedPixel(new Point(x, y), col);
        }
 
        /// <summary>
        /// Сохраняет изменения и разблокирует изображение.
        /// </summary>
        public void SaveAndUnlock()
        {
            try
            {
                Marshal.Copy(bitmapBuffer, 0, bmpData.Scan0, bitmapBuffer.Length);
                img.UnlockBits(bmpData);
            }
            catch (NullReferenceException) { throw new InvalidOperationException("Изображение не заблокированно в памяти"); }
            catch (ArgumentException) { throw new InvalidOperationException("Изображение не заблокированно в памяти"); }
        }
 
        /// <summary>
        ///  Разблокирует изображение без сохранения изменений.
        /// </summary>
        public void UnlockWInthoutSaving()
        {
            try
            {
                img.UnlockBits(bmpData);
            }
            catch (NullReferenceException) { throw new InvalidOperationException("Изображение не заблокированно в памяти"); }
            catch (ArgumentException) { throw new InvalidOperationException("Изображение не заблокированно в памяти"); }
        }
 
        #region Члены IDisposable
        void IDisposable.Dispose()
        {
            try { UnlockWInthoutSaving(); }
            catch { }
        }
 
        #endregion
    }
}
Добавлено через 4 минуты
Тут можно увидеть более совершенную реализацию того же функционала, что реализован в классе выше
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2016, 04:20
Помогаю со студенческими работами здесь

Обрезка строки по флагу
имеется текст &quot;0хС2222222222BBBBAAAAAACCCCBBBBB0093839382...FFFFFFFF01937882928ACDACDDC...&quot; вопрос, как обрезать строку и вывести текс...

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

Обрезка строки до заданной длины, оставив последнее слово целым
Здравствуйте. Что то никак не могу придумать: Есть строка: &quot;Добыча титана на планете зависит от уровня титановой шахты. Титан...

Наложение изображения поверх другого изображения
Дорогие форумчане!Подскажите пожалуйста, как реализовать следующую задачу: необходимо наложить одно изображение поверх другого...

Автоматическая обрезка черных краев отсканированного изображения
Здравствуйте! Подскажите пожалуйста как можно реализовать автоматическую обрезку черных краев. Использовал AForge.NET: ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
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 и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru