Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.08.2008, 20:31
GeG GeG вне форума
Прохожий
 
Регистрация: 19.07.2008
Сообщения: 24
Репутация: 0
По умолчанию Как програмно определить цвет

народ помогите как мне програмно определить цвет у меня чёрно серая картинка.... я хочу отделить чисто чёрный от серого цвета (серый полностью убрать чтобы было чёрно белое изображение). помогите плизз как это реализовать?

Последний раз редактировалось GeG, 06.08.2008 в 20:33.
Ответить с цитированием
  #2  
Старый 06.08.2008, 21:12
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

У тебя серая картинка на черном фоне?
Если тебе надо заменить например в картинке черный цвет на белый делай так
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 i,j: integer;
begin
 for i:=0 to Image1.Picture.Width do
  for j:=0 to Image1.Picture.Height do
   if Image1.Canvas.Pixels[i,j]=clBlack then
    Image1.Canvas.Pixels[i,j]:=clWhite;
end;
Ответить с цитированием
  #3  
Старый 06.08.2008, 22:19
Burka Burka вне форума
Начинающий
 
Регистрация: 10.06.2007
Сообщения: 163
Репутация: 10
По умолчанию

Только наверно это будет немного посложнее, придется сравнивать с диапазоном цветов, потому что на картинке будет куча оттенков серого
P.S.
Серый это когда три цвета в RGB одиннаковые, (1,1,1)..(255,255,255)
Ответить с цитированием
  #4  
Старый 06.08.2008, 22:20
GeG GeG вне форума
Прохожий
 
Регистрация: 19.07.2008
Сообщения: 24
Репутация: 0
По умолчанию


вот типа такой картинки... в данном примере всего 2 оттенка серого и 1 чёрный... вот мне нужно чтобы програмно можно было отделить чёрный цвет а серый превратить в белый
вот так
Ответить с цитированием
  #5  
Старый 06.08.2008, 23:03
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 i,j: integer;
 tmp: Tcolor;
begin
 tmp:=Image1.Canvas.Pixels[0,0]; // или Image1.Canvas.Pixels[1,1]
 for i:=0 to Image1.Picture.Width do
  for j:=0 to Image1.Picture.Height do
   if Image1.Canvas.Pixels[i,j]=tmp then
    Image1.Canvas.Pixels[i,j]:=clWhite;
end;

Добжно работать, закрасишь фон. для закраски всего серого надо писать подцункцию. поределеющую цвета на картинки

Последний раз редактировалось dmdx, 06.08.2008 в 23:06.
Ответить с цитированием
  #6  
Старый 06.08.2008, 23:12
GeG GeG вне форума
Прохожий
 
Регистрация: 19.07.2008
Сообщения: 24
Репутация: 0
По умолчанию

угу я уже это попробовал там всего 1 линия стала белой и всё (((
Ответить с цитированием
  #7  
Старый 06.08.2008, 23:14
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

Если картинка действительно 256 цветов или 16 цветов. то можно написать небольшой тип перечисления или множества куда будут заноситься все цвета серого и сообветственно если это цвет серого оттенка затирать.
Ответить с цитированием
  #8  
Старый 06.08.2008, 23:21
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

Цитата:
Сообщение от GeG
угу я уже это попробовал там всего 1 линия стала белой и всё (((

Значит у тебя картинка не 16 цветовая а 256 или больше. тут надо только путем сравнения как говорит Burka. Приши подфункцию

Код:
function GetTrueGrey(inParam: Tcolor): integer;
begin
 // Если inParam = оттенку серого то возвращать 0 в противном случае 1
 // так же можно использовать Boolean в качестве возврата.
 // надо разложить цвет на R G B отдельно и сравнить если они одинаковые то гуд
end;
Ответить с цитированием
  #9  
Старый 06.08.2008, 23:27
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

Вот код процедуры относительно медленно но вроде как дубово

Код:
function GetTrueGrey(inParam: Tcolor): integer;
var
 r,g,b: integer;
begin
 for r:=1 to 255 do
  for g:=1 to 255 do
   for b:=1 to 255 do
    if (RGB(r,g,b)=InParam) and (r=g) and (r=b) then result:=0
 else result:=-1;
end;
и в коде указываешь
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 i,j: integer;
 tmp: Tcolor;
begin
 tmp:=Image1.Canvas.Pixels[0,0]; // или Image1.Canvas.Pixels[1,1]
 for i:=0 to Image1.Picture.Width do
  for j:=0 to Image1.Picture.Height do
   if GetTrueGrey(Image1.Canvas.Pixels[i,j])=0 then
    Image1.Canvas.Pixels[i,j]:=clWhite;
end;

Но лучше писать процедуру которая раскладывает по цветам. т.к. если у тебя будет рисунок с расширением 800х600 эта обработка займет кучу времени. 800*600*(255*255*255) операций

Последний раз редактировалось dmdx, 06.08.2008 в 23:33.
Ответить с цитированием
  #10  
Старый 06.08.2008, 23:29
GeG GeG вне форума
Прохожий
 
Регистрация: 19.07.2008
Сообщения: 24
Репутация: 0
По умолчанию

ок... завтра посмотрю....
я просто раньше с картинками дела не имел ... так лёгкие программы делал а тут решыл за более серьёзную взяться и всё поплыло
Ответить с цитированием
  #11  
Старый 07.08.2008, 01:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от dmdx
Вот код процедуры относительно медленно но вроде как дубово

Код:
function GetTrueGrey(inParam: Tcolor): integer;
var
 r,g,b: integer;
begin
 for r:=1 to 255 do
  for g:=1 to 255 do
   for b:=1 to 255 do
    if (RGB(r,g,b)=InParam) and (r=g) and (r=b) then result:=0
 else result:=-1;
end;

Ребята, вы что, совсем охренели? Для чего существуют функции RGBToColor и ColorToRGB?
Ответить с цитированием
  #12  
Старый 07.08.2008, 09:25
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

В принцепе усли тебе надо оставить только черный цвет, а весь остальной убрать. то можно сделать вот так.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 i,j: integer;
begin
 for i:=0 to Image1.Picture.Width do
  for j:=0 to Image1.Picture.Height do
   if Image1.Canvas.Pixels[i,j]<>clBlack then
    Image1.Canvas.Pixels[i,j]:=clWhite;
end;

или преобразовать картинку в 16 цвветов и сней работать. или ваще быстрый вариант это преобразовать в монохромный. Но тут есть свои косяки. Дело в том что если серый будет более темный чем надо он может замениться на черный.
Ответить с цитированием
  #13  
Старый 07.08.2008, 09:53
GeG GeG вне форума
Прохожий
 
Регистрация: 19.07.2008
Сообщения: 24
Репутация: 0
По умолчанию

а задать оттенки как то можно? те скажем выеше такого то оттенка чёрный ниже серый....
Ответить с цитированием
  #14  
Старый 07.08.2008, 10:20
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

Цитата:
Сообщение от GeG
а задать оттенки как то можно? те скажем выеше такого то оттенка чёрный ниже серый....

преобразуй в картинку 16 цветов. как сделать не помню надо ковыряться. и тогда оттенки церно-серые станут черными.
Ответить с цитированием
  #15  
Старый 07.08.2008, 11:08
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Замена "серых" цветов на черный:

Код:

procedure replacecolor(p: integer); //ниже p - серый
var
x, y:integer;
r, g, b:byte;
begin
for y := 0 to image.height - 1 do 
 for x := 0 to image.width - 1  do begin
  r := getRValue(Image.canvas.pixels[x, y]);
  g := getGValue(Image.canvas.pixels[x, y]);
  b := getBValue(Image.canvas.pixels[x, y]);
  if (r = g) and (g = b) {and (b = r)} and (r < p) then Image.canvas.Pixels[x, y] := rgb(255, 255, 255);
 end;
end;

Последний раз редактировалось ART, 07.08.2008 в 11:10.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:51.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025