Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 10.05.2012
Сообщений: 7
1

Редактор изображений с фильтрами и перебивкой форматов

20.05.2013, 14:03. Просмотров 2568. Ответов 1
Метки нет (Все метки)


Ребят помогите,нужно сделать редактор,а именно чтобы было перебивка форматов изображения из JPG в gif допустим ну в принципе любые форматы главное чтобы перебивало,и чтобы к изображению применялись фильтры,из цветного в монохромный,желательно исходники если есть у кого поделитесь ребят пожалуйста
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2013, 14:03
Ответы с готовыми решениями:

Доступ к областям пикселей изображений основных графических форматов
Тема - стеганография. Цель - доступ к областям пикселей (NxN) изображений основных графических...

Редактор формул, генерация изображений
Доброго времени суток Сразу приношу извинения, если разместил тему не в том месте. Просто не знаю,...

Отрисовка изображений разных форматов
С помощью чего можно отрисовать jpeg,png,gif в окне приложения ? С помощью HBITMAP пробовал -...

Как написать конвертер форматов изображений
Помогите, нужно написать конвертор изображений, но я не могу сделать конвертацию tiff>bmp и...

1
LK
Заблокирован
20.05.2013, 18:17 2
Лучший ответ Сообщение было отмечено PashaNash как решение

Решение

Простые растровые операции
Не вникал, есть ли там это:
Простые алгоритмы работы с изображением

Цвета.

Для написания хорошего графического редактора, необходимо добавить такую простую функцию, как фильтр. Он позволяет изменить какие-то свойства изображения.

Давайте посмотрим, какие фильтры можно применить к цветам картинки. Первым делом нам необходимо получить массив пикселей, для дальнейшей работы с ними. Так как цветовые фильтры требуют работы с каждым отдельным пикселем, в нашем коде будет использоваться цикл, перебирающий пиксели и пременяющий фильтр:
Подготовочные действия
Цикл перебора по X, Y
Применение формулы
Конец цикла и заключительные действия

Итак: подготовительные действия
C++
1
2
3
Byte* ptr; //Это объявление необходимо только для первого способа перебора
Image->PixelFormat = pf24bit; // Наиболее оптимальный формат пикселей для наших фильтров
StatusBar1->SimpleText = "Подождите пожалуйста";
В VCL существует два варианта циклов перебора:
C++
1
2
3
4
5
6
7
for(int y = 0; y < Image->Height; y++) //Перебор строк
  ptr = (Byte*)Image->ScanLine[y]; //Получение текущей строки пикселей
for (int x = 0; x < Image->Width * 3; x+=1)  //Перебор каждого пикселя из строки
  //RGB:
  ptr[x] = ... //Красный
  ptr[x+1] = ... //Зеленый
  ptr[x+2] = ... //Синий
Этот способ достаточно быстрый, однако, при его использовании могут возникать некоторые проблемы. Второй способ проще для понимания:
C++
1
2
3
for(int y = 0; y < Image->Height; y++) //Перебор строк
for (int x = 0; x < Image->Width; x++)  //Перебор каждого пикселя из строки
  Image->Pixels[x][y] = ... //Красный + зеленый + синий
Рассмотрим сначала затемнение о осветление пикселей. В системе цветов RGB черным является цвет 0,0,0, а белым 255,255,255. Таким образом, при затемнении, каждый канал пиксела стремиться к 0,0,0 способом декрементирования. Также, следует учитывать тот факт, что если канал имеет значение 0, Декрементировать его нет смысла. Вот итоговый алгоритм:
C++
1
2
3
4
5
for(int y = 0; y < Image->Height; y++)
  ptr = (Byte*)Image->ScanLine[y];
for (int x = 0; x < Image->Width * 3; x++) 
  //Особое внимание на 3 бита на одну точку- Image->Canvas->Width * 3
  if(ptr[x] > 10) ptr[x] = (Byte)(ptr[x] - 10);
Полная версия алгоритма обладает одной интересной особенностью: по причине того, что над каждым каналом каждого пикселя совершается одно и тоже действие, полный цикл затемнения отличается от приведенного выше, однако, более оптимизированным считается код, выполняемый за меньшее число итераций. Вот оптимизированная версия алгоритма:
C++
1
2
3
4
5
6
7
8
for(int y = 0; y < Image->Height; y++)
  ptr = (Byte*)Image->ScanLine[y];
for (int x = 0; x < Image->Width * 3; x+=3) 
  //Особое внимание на 3 бита на одну точку- Image->Canvas->Width * 3
  if(ptr[x] > 10 && ptr[x+1] > 10 && ptr[x+2] > 10) 
    ptr[x] = (Byte)(ptr[x] - 10);
    ptr[x+1] = (Byte)(ptr[x+1] - 10);
    ptr[x+2] = (Byte)(ptr[x+2] - 10);
Аналогичен код осветления:
C++
1
2
3
4
5
6
7
8
for(int y = 0; y < Image->Height; y++)
  ptr = (Byte*)Image->ScanLine[y];
for (int x = 0; x < Image->Width * 3; x+=3) 
  //Особое внимание на 3 бита на одну точку- Image->Canvas->Width * 3
  if(ptr[x] < 245 && ptr[x+1] < 245 && ptr[x+2] < 245) 
    ptr[x] = (Byte)(ptr[x] + 10);
    ptr[x+1] = (Byte)(ptr[x+1] + 10);
    ptr[x+2] = (Byte)(ptr[x+2] + 10);
Можно также привести изображение к определенному оттенку. Для этого необходимо изменить соотношение между каналами. Например, если вы хотите сделать так, чтобы каждый канал содержал только оттенки красного, надо рассчитать среднее значение между тремя каналами, а затем установить каналы G и B в 0, а R в полученное значение:
C++
1
2
3
4
5
6
7
8
9
10
11
int r = 0, g = 0, b = 0, color = 0;
for(int y = 0; y < Image->Height; y++)
  ptr = (Byte*)Image->ScanLine[y];
  for (int x = 0; x < Image->Width * 3; x+=3) 
    r = ptr[x];   //Получаем
    g = ptr[x+1]; //значения
    b = ptr[x+2]; //каналов
    color = (r + g + b) / 3; //Выссчитываем среднее значение
    ptr[x]   = 0;
    ptr[x+1] = 0;
    ptr[x+2] = color;
Фильтра "Оттенки серого" установливает значения всех каналов пикселя в одинаковые значения. Таким образом, все каналы уравновешены, и не добавляют в цвет пикселя "примеси".
C++
1
2
3
4
5
6
7
8
9
10
11
int r = 0, g = 0, b = 0, color = 0;
for(int y = 0; y < Image->Height; y++)
  ptr = (Byte*)Image->ScanLine[y];
    for (int x = 0; x < Image->Width * 3; x+=3) 
      r = ptr[x];   //Получаем
      g = ptr[x+1]; //значения
      b = ptr[x+2]; //каналов
      color = (r + g + b) / 3; //Выссчитываем среднее значение
      ptr[x]   = color;
      ptr[x+1] = color;
      ptr[x+2] = color;
И, наконец, последний фильтр: "Инвертация цветов".
C++
1
2
3
4
5
6
for(int y = 0; y < Image->Height; y++)
  ptr = (Byte*)Image->ScanLine[y];
  for (int x = 0; x < Image->Width * 3; x+=3) 
    ptr[x] = (Byte)(256 - ptr[x]);
    ptr[x+1] = (Byte)(256 - ptr[x+1]);
    ptr[x+2] = (Byte)(256 - ptr[x+2]);
Примечание: в данной статье представлены неоптимизированные версии алгоритмов. Наиболее узкими местами являются: использование промежуточных переменных и постоянное использование свойств Image->Width и Image->Height в цикле, для них рекомендуется исользовать промежуточные переменные, желательно типа register.

Фильтра "Оттенки серого" установливает значения всех каналов пикселя в одинаковые значения.
Здесь советуют почитать про конвертацию RGB->YUV и забыть про среднее арифметическое.

Как Paint'е реализовано распыление и карандаш

В OnMouseMove.

Распыление
C++
1
2
3
4
5
6
7
8
9
10
int x0, y0;
for(float i=1;i<BrushRad; i++) {
  for(float f=1;f<360; f+=0.2) {
    if(rand()>16384) {
      x0 = X+cos(f)*i;
      y0 = Y+sin(f)*i;
      Image->Canvas->Pixels[x0][y0] = Image->Canvas->Brush->Color;
    }
  }
}
Карандаш
C++
1
2
Image->Canvas->Pen->Mode = pmCopy;
Image->Canvas->LineTo(X, Y);
говорят, код не оптимальный, смотрим исключительно как пример
Конвертация графических форматов
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2013, 18:17

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

редактор изображений
Всем привет! я писала курсовую на тему обработка изображений с помощью конволюционных фильтров....

Редактор изображений.
Привет всем!нужно написать программу,которая создает и редактирует 8-разрядное изображение с...

Редактор изображений
Всем доброго времени суток. В универе задали сделать &quot;Программа обработки фотографий: создание...

Написать редактор изображений
Нужно написать редактор изображений. Подскажите плиз ресурсы в помощь с примерами.


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.