Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/188: Рейтинг темы: голосов - 188, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 19

C# работа с изображениями

26.07.2011, 06:05. Показов 38232. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, требуется помощь по работе с изображениями, в частности - как открыть изображение это понятно, а как изменить его не знаю - например получить цвет первого (или любого другого) пикселя, изменить цвет пикселя, и самое интересное как построить бинарную матрицу изображения.

Больше интересуют не теоретические изыскания, а пример кода. Так что если примерчики, буду очень благодарен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.07.2011, 06:05
Ответы с готовыми решениями:

Работа с изображениями
Недавно пришла в голову сногсшибательная идея. Для ее реализации потребуется создать изображение формата .jpg определенного размера и...

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

Работа с изображениями Entity Framework и WPF
Имеется БД пациентов в SQL Server. Приложение создается в WPF с применением EF. В таблице пациентов, кроме прочего, имеется поле...

8
615 / 539 / 115
Регистрация: 24.03.2011
Сообщений: 576
26.07.2011, 06:36
Цитата Сообщение от bot_man Посмотреть сообщение
получить цвет первого (или любого другого) пикселя
Bitmap.GetPixel - метод
Bitmap.SetPixel - метод
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
26.07.2011, 08:03
Вот, может поможет, когда-то найдено на просторах Ин-та
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
this._image = (Bitmap)Image.FromFile(@"C:\image.bmp");
this._imageGraphics = Graphics.FromImage(this._image);
 
ColorMap[] colorSwapper= new ColorMap[2]; 
colorSwapper[0] = new ColorMap(); 
colorSwapper[1] = new ColorMap(); 
colorSwapper[0].OldColor = Color.Blue; // цвет который будем менять
colorSwapper[0].NewColor = Color.Yellow; // цвет на который меняем
colorSwapper[1].OldColor = Color.Black; // цвет который будем менять
colorSwapper[1].NewColor = Color.Green; // цвет на который меняем
 
ImageAttributes imageAttr = new ImageAttributes(); 
imageAttr.SetRemapTable(colorSwapper); 
this._imageGraphics.DrawImage(this._image, new Rectangle(0, 0, 
this._image.Width, this._image.Height),0, 0, this._image.Width, 
this._image.Height, GraphicsUnit.Pixel, imageAttr);
0
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 19
26.07.2011, 10:10  [ТС]
Всем спасибо за ответы, с пикселями разобрался

На данный момент бьюсь с построением битовой матрицы изображения. В теории понимаю, что изображение должно быть черно-белым, а потом надо составить матрицу где белые пиксели будут 0, а черные 1. Пытаюсь найти способ максимально быстрого формирования битовой матрицы.
А далее интересно как быстро произвести сравнение двух битовых матриц, или как в большом изображении найти маленькую часть - то есть в большой матрице найти маленькую.
Потом встает проблема как правильно перевести цветное изображение в черно - белое...

Или я не правильно понимаю принцип формирования битовой матрицы изображения
0
 Аватар для ZI_DAN
4 / 4 / 0
Регистрация: 25.07.2011
Сообщений: 10
26.07.2011, 16:32
Я много раз встретил слово «быстро», поэтому сразу хочу предупредить, что с пикселями изображения в безопасном коде быстро работать не получится (про GetPixel и SetPixel сразу можно забыть). Приведу пример небезопасного кода, который работает раз в 25 быстрее безопасного аналога:
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
int width = 1024;
int height = 768;
Bitmap imgNoise = new Bitmap(width, height, PixelFormat.Format24bppRgb);
BitmapData bmpData = imgNoise.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
IntPtr scan = bmpData.Scan0;
 
Random rand = new Random();
byte color = 0;
 
unsafe
{
   byte* ptr = (byte*)scan.ToPointer();
   byte* ptrHelper = ptr;
 
   for (int y = 0; y < height; y++) //Порядок перебора критичен, т. к. изображение хранится в памяти построчно
   {
      for (int x = 0; x < width; x++)
      {
         color = (byte)rand.Next(0, 256);
         *(ptr++) = color ; //Присвоение красного компонента цвета и установка указателя на следующий байт
         *(ptr++) = color ; //Присвоение зелёного компонента цвета и установка указателя на следующий байт
         *(ptr++) = color ; //Присвоение синего компонента цвета и установка указателя на следующий байт
      }
 
      ptrHelper += bmpData.Stride;
      ptr = ptrHelper;
   }
}
 
imgNoise.UnlockBits(bmpData);
1
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 19
26.07.2011, 17:49  [ТС]
ZI_DAN, ничего в твоем примере не понял, а он чего делает то?
и чем он не безопасен?
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
26.07.2011, 17:54
Если Вы работаете в C# с указателями или ссылками, то считается, что код небезопасный. Для этого кода придумали блоки unsafe. Есть еще fixed. Читайте на msdn что это такое.
0
 Аватар для ZI_DAN
4 / 4 / 0
Регистрация: 25.07.2011
Сообщений: 10
26.07.2011, 19:06
ZI_DAN, ничего в твоем примере не понял, а он чего делает то?
и чем он не безопасен?
В примере создаётся картинка, каждый пиксель которой является случайным оттенком серого. Т. е. получившаяся картинка напоминает «снег» (шум) в телевизоре. Это самый простой пример работы с пикселями, который мне пришёл в голову.

Небезопасный — условное понятие. Т. е. ручное управление памятью, как на C++. В картинке размером 1 024 на 768 находится 786 432 пикселей. Соответственно в цикле проводится именно такое число итераций (довольно много). Вызов метода весьма ресурсоёмкая процедура сама по себе, кроме того в нём ещё и куча операций может выполнятся. Выходит, что вызов метода 786 432 раз — крайне неоптимальное решение. Поэтому приходится записывать байты в память напрямую.
1
sh
3 / 3 / 0
Регистрация: 25.07.2011
Сообщений: 8
28.07.2011, 04:40
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Lock the bitmap's bits.
BitmapData bits = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
IntPtr ptr = bits.Scan0;
// Declare an array to hold the bytes of the bitmap.
int bytes = bits.Stride * bitmap.Height;
byte[] rgbValues = new byte[bytes];
// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
// Unlock the bits.
bitmap.UnlockBits(bits);
.
.
//your code (`rgbValues` contains bitmap data )
.
.
// Lock the bitmap's bits  again.
bits = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);
ptr = bits.Scan0;
// Copy the array of color values into bitmap
System.Runtime.InteropServices.Marshal.Copy(rgbValues, ptr, 0, bytes);
// Unlock the bits.
bitmap.UnlockBits(bits);
Это на случай если изображение большое или обработка ресурсоемкая.
Где-то я писал уже про блокировку ресурсов...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.07.2011, 04:40
Помогаю со студенческими работами здесь

Работа с векторными изображениями
Есть задача воткнуть векторное изображение в бэкграунд контрола. Как это можно сделать? По умолчанию понимаются только растровые изображения

Работа с изображениями в WPF
Не совсем понимаю логику разработчиков. Нужен талчок ((( Для одной из домашек пишу пятнашки ну или что то подобное. В файле XAML...

[WPF] Работа со ScrollViewer и изображениями
Доброго дня! Сейчас мне надо сделать что-то вроде витрины изображений, которую можно было бы просматривать, прокручивая вниз. Я думаю, что...

WPF, работа с изображениями. BitmapImage, BitmapSource, BitmapFrame, и их отличия
Я запутался в них. 1. В чем разница между BitmapImage, BitmapSource, BitmapFrame в общих чертах (если языком попроще MSDN) ? Можете...

Работа с изображениями
Задание Написать программу в которой есть три каких то изображения и при нажатие ПЕРВОМ нажатие на кнопку будет видно только первое...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru