Внимание!
Эта публикация перенесена в раздел уроков по адресу Графические фильтры на основе попиксельной обработки изображений (Часть 1).К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.
Графические фильтры на основе попиксельной обработки изображений (Часть 1)
Всем привет! В этом уроке я расскажу, как создать негатив и сепию.
Пример изображения после обработки:
[spoiler]
Негатив
Негатив – это фильтр, который инвертирует цвета. Приступим к написанию кода. Сначала создадим основу для всех наших фильтров. Создадим новый класс с именем Filter, и впишем в него следующие функции и свойства:
• Picture (свойство) – возвращает изображение.
• Height (свойство) – возвращает высоту изображения.
• Width (свойство) – возвращает ширину изображения.
• BytesPerPixel (свойство) – возвращает количество байт на пиксель.
• Safe_IMG_Scan0 (свойство) – возвращает управляемый указатель (IntPtr) на массив пикселей.
• Unsafe_IMG_Scan0 (свойство) – возвращает неуправляемый указатель (*byte) на массив пикселей.
• AllPixelsBytes (свойство)-возвращает количество байт, занимаемое всеми пикселями.
• Unlock (функция) – разблокирует массив пикселей.
• GetPixel (функция) – возвращает структуру RGB_Color со значениями цветов.
• SetPixel (функция) – присваивает пикселю с координатами X,Y цвет, который задан в структуре RGB_Color.
Структура RGB_Color:
Реализация класса Filter:
Теперь начнём реализовывать негатив,используя класс Filter.Создадим новый класс с названием
Negative :
Добавим функцию ProcessImage:
В этой функции мы использовали неуправляемые указатели , так как это самый лучший способ добиться максимального быстродействия в C#.В ёё реализации нет ничего сложного,я думаю,что коментарии не нужны.
Сепия
Сразу перейдём к ёё реализации.В этой функции мы снова будем использовать класс Filter и неуправляемые указатели.Создадим класс Sepia:
И добавим в него функцию ProcessImage :
Использование в своих приложениях
• Негатив
• Сепия
Готово!
Пример изображения после обработки:
[spoiler]
Негатив
Негатив – это фильтр, который инвертирует цвета. Приступим к написанию кода. Сначала создадим основу для всех наших фильтров. Создадим новый класс с именем Filter, и впишем в него следующие функции и свойства:
• Picture (свойство) – возвращает изображение.
• Height (свойство) – возвращает высоту изображения.
• Width (свойство) – возвращает ширину изображения.
• BytesPerPixel (свойство) – возвращает количество байт на пиксель.
• Safe_IMG_Scan0 (свойство) – возвращает управляемый указатель (IntPtr) на массив пикселей.
• Unsafe_IMG_Scan0 (свойство) – возвращает неуправляемый указатель (*byte) на массив пикселей.
• AllPixelsBytes (свойство)-возвращает количество байт, занимаемое всеми пикселями.
• Unlock (функция) – разблокирует массив пикселей.
• GetPixel (функция) – возвращает структуру RGB_Color со значениями цветов.
• SetPixel (функция) – присваивает пикселю с координатами X,Y цвет, который задан в структуре RGB_Color.
Структура RGB_Color:
|
Реализация класса Filter:
|
Теперь начнём реализовывать негатив,используя класс Filter.Создадим новый класс с названием
Negative :
|
Добавим функцию ProcessImage:
|
В этой функции мы использовали неуправляемые указатели , так как это самый лучший способ добиться максимального быстродействия в C#.В ёё реализации нет ничего сложного,я думаю,что коментарии не нужны.
Сепия
Сразу перейдём к ёё реализации.В этой функции мы снова будем использовать класс Filter и неуправляемые указатели.Создадим класс Sepia:
|
И добавим в него функцию ProcessImage :
|
Использование в своих приложениях
• Негатив
|
• Сепия
|
Готово!
Внимание!
Эта публикация перенесена в раздел уроков по адресу Графические фильтры на основе попиксельной обработки изображений (Часть 1).К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.
Только при создании негатива опечатка в коде:
Main.Unsafe_IMG_Scan0 +0
а должно быть
Main.Unsafe_IMG_Scan0 +I
исправьте, пожалуйста…
почта: gusinec.com@tut.by
почта: gusinec.com@tut.by
я не опытный в этой части программирования, но мне почти все было понятно.
Скинь мне исходник, пожалуйста.
почта bydanila@gmail.com
вот только мне подход не нравится
что negative и sepia как класс используются Negative.ProcessImage(new Filter(TestBitmap))
по мне лучше Picture.filter(«negative»);
ну или FilterManager.Negative(Picture);
но тут каждому свое