![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() народ помогите как мне програмно определить цвет у меня чёрно серая картинка.... я хочу отделить чисто чёрный от серого цвета (серый полностью убрать чтобы было чёрно белое изображение). помогите плизз как это реализовать?
Последний раз редактировалось GeG, 06.08.2008 в 20:33. |
#2
|
|||
|
|||
![]() У тебя серая картинка на черном фоне?
Если тебе надо заменить например в картинке черный цвет на белый делай так Код:
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
|
|||
|
|||
![]() Только наверно это будет немного посложнее, придется сравнивать с диапазоном цветов, потому что на картинке будет куча оттенков серого
P.S. Серый это когда три цвета в RGB одиннаковые, (1,1,1)..(255,255,255) |
#4
|
|||
|
|||
![]() ![]() вот типа такой картинки... в данном примере всего 2 оттенка серого и 1 чёрный... вот мне нужно чтобы програмно можно было отделить чёрный цвет а серый превратить в белый вот так ![]() |
#5
|
|||
|
|||
![]() Код:
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
|
|||
|
|||
![]() угу я уже это попробовал там всего 1 линия стала белой и всё (((
|
#7
|
|||
|
|||
![]() Если картинка действительно 256 цветов или 16 цветов. то можно написать небольшой тип перечисления или множества куда будут заноситься все цвета серого и сообветственно если это цвет серого оттенка затирать.
|
#8
|
|||
|
|||
![]() Цитата:
Значит у тебя картинка не 16 цветовая а 256 или больше. тут надо только путем сравнения как говорит Burka. Приши подфункцию Код:
function GetTrueGrey(inParam: Tcolor): integer; begin // Если inParam = оттенку серого то возвращать 0 в противном случае 1 // так же можно использовать Boolean в качестве возврата. // надо разложить цвет на R G B отдельно и сравнить если они одинаковые то гуд end; |
#9
|
|||
|
|||
![]() Вот код процедуры относительно медленно но вроде как дубово
Код:
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
|
|||
|
|||
![]() ок... завтра посмотрю....
я просто раньше с картинками дела не имел ... так лёгкие программы делал а тут решыл за более серьёзную взяться и всё поплыло ![]() |
#11
|
|||
|
|||
![]() Цитата:
Ребята, вы что, совсем охренели? Для чего существуют функции RGBToColor и ColorToRGB? |
#12
|
|||
|
|||
![]() В принцепе усли тебе надо оставить только черный цвет, а весь остальной убрать. то можно сделать вот так.
Код:
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
|
|||
|
|||
![]() а задать оттенки как то можно? те скажем выеше такого то оттенка чёрный ниже серый....
|
#14
|
|||
|
|||
![]() Цитата:
преобразуй в картинку 16 цветов. как сделать не помню надо ковыряться. и тогда оттенки церно-серые станут черными. |
#15
|
|||
|
|||
![]() Замена "серых" цветов на черный:
Код:
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. |