Необходимо сделать следующее, загрузить изображение в TBitMap, обесцветить его (преобразовать в тона серого), а потом попиксельно считывать цвета не в РГБ, а в тех самых тонах серого. Скорость выполнения не сильно критична.
Даже не знаю как подступится, подскажите пожалуйста.
Работа с обесцвеченным растром
Модератор: Модераторы
Ну, загрузка - это типовое действие.
Проход по пиклесям тоже просто: двойной цикл для Canvas.Pixels[x, y] если будете использовать TImage.
Преобразование в оттенки серого - зависит от того, по каким критериям вы будете определять "серость" цвета.
Разница между серым и цветным только в том, что у серого цвета все значения каналов RGB равны.
Приведение к серому можете сделать банально: (R +G +B) div 3. А можете и (((R +G) div 2 +B) div 2) и т.д.
Считывать потом цвет - тоже простейшая задача. Считываете любой канал функцией Reg, Green, или Blue.
Проход по пиклесям тоже просто: двойной цикл для 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 раз.
- Widowmaker
- новенький
- Сообщения: 37
- Зарегистрирован: 27.04.2011 18:32:04
evb87ar, спасибо!
Выяснилась небольшая заморочка, процедуры обесцвечивания и инверсии цвета работают в 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; Выяснилась небольшая заморочка, процедуры обесцвечивания и инверсии цвета работают в Win но зависают в Linux. Почему?
Как выяснилось работает... но ОООООООООООООООООООООООООчень медленно... через что оно там реализованно
