Работа с обесцвеченным растром

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Работа с обесцвеченным растром

Сообщение qivi » 29.09.2012 00:56:59

Необходимо сделать следующее, загрузить изображение в TBitMap, обесцветить его (преобразовать в тона серого), а потом попиксельно считывать цвета не в РГБ, а в тех самых тонах серого. Скорость выполнения не сильно критична.

Даже не знаю как подступится, подскажите пожалуйста.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Работа с обесцвеченным растром

Сообщение evb87ar » 29.09.2012 12:16:54

Ну, загрузка - это типовое действие.
Проход по пиклесям тоже просто: двойной цикл для Canvas.Pixels[x, y] если будете использовать TImage.

Преобразование в оттенки серого - зависит от того, по каким критериям вы будете определять "серость" цвета.
Разница между серым и цветным только в том, что у серого цвета все значения каналов RGB равны.
Приведение к серому можете сделать банально: (R +G +B) div 3. А можете и (((R +G) div 2 +B) div 2) и т.д.

Считывать потом цвет - тоже простейшая задача. Считываете любой канал функцией Reg, Green, или Blue.
Последний раз редактировалось evb87ar 01.10.2012 20:35:32, всего редактировалось 1 раз.
Аватара пользователя
evb87ar
новенький
 
Сообщения: 52
Зарегистрирован: 18.01.2012 21:08:02
Откуда: г. Архангельск

Re: Работа с обесцвеченным растром

Сообщение Widowmaker » 29.09.2012 12:25:42

Аватара пользователя
Widowmaker
новенький
 
Сообщения: 37
Зарегистрирован: 27.04.2011 18:32:04

Re: Работа с обесцвеченным растром

Сообщение qivi » 01.10.2012 14:53:03

evb87ar, спасибо!
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Работа с обесцвеченным растром

Сообщение qivi » 17.12.2012 08:12:46

Выяснилась небольшая заморочка, процедуры обесцвечивания и инверсии цвета работают в Win но зависают в Linux. Почему?

Код: Выделить всё
procedure Tgf.MonoColor(MCMap:TBitMap);
  var
    n,i,m:integer;
    C:TColorRef;
begin
  MCMap.Canvas.Lock;
  for n:=0 to MCMap.Width do
  begin
    for i:=0 to MCMap.Height do
    begin
      C:=ColorToRGB(MCMap.Canvas.Pixels[n,i]);
      m:=(Red(C)+Green(C)+Blue(C)) div 3;
      MCMap.Canvas.Pixels[n,i]:=RGBToColor(m,m,m);
    end;
  end;
  MCMap.Canvas.Unlock;
end;

procedure Tgf.InvertColor(MCMap:TBitMap);
  var
    n,i:integer;
    C1:TColor;
    C2:TColorRef;
begin
  MCMap.Canvas.Lock;
  for n:=0 to MCMap.Width do
  begin
    for i:=0 to MCMap.Height do
    begin
      C2:=ColorToRGB(MCMap.Canvas.Pixels[n,i]);
      C1:=RGBToColor(255-Red(C2), 255-Green(C2), 255-Blue(C2));
      MCMap.Canvas.Pixels[n,i]:=C1;
    end;
  end;
  MCMap.Canvas.Unlock;
end;
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Работа с обесцвеченным растром

Сообщение qivi » 18.12.2012 17:11:08

Выяснилась небольшая заморочка, процедуры обесцвечивания и инверсии цвета работают в Win но зависают в Linux. Почему?


Как выяснилось работает... но ОООООООООООООООООООООООООчень медленно... через что оно там реализованно :(
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 257

Рейтинг@Mail.ru
cron