Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 27
1

Изменение тона изображения

03.06.2012, 16:01. Показов 1256. Ответов 3
Метки нет (Все метки)

Доброго времени суток.
Есть такая проблема:
дано: компонент TImage; нужно изменить тон изображения.

Я закинул на форму три TrackBar'a
наподобие "Тон/Насыщенность" в Photoshop.

Подскажите, как преобразовать RGB в HLS (тон, яркость, насыщенность) и обратно.

Или есть другой способ изменения тона, без перехода к HLS?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2012, 16:01
Ответы с готовыми решениями:

Изменение позиции изображения
В общем интересует такой вопрос. Есть много изображений на форме, и некоторые из них в процессе...

Изменение цвета изображения, из RGB в серые тона
есть вопрос: как из этого кода, сделать адекватное изменение цвета изображения на черно...

Чтение заголовка bmp и перевод изображения в серые тона
Доброго времени суток! Продлема состоит следующем: 1. Есть изоброжение в формате bmp, нужно...

О правилах хорошего тона в C++: изменение данных из private секции класса А в классе В через указатель
#include <iostream> using namespace std; class A { int *a; public: A()

3
Мишка Косолапый :)
284 / 254 / 86
Регистрация: 15.02.2012
Сообщений: 1,511
03.06.2012, 16:20 2
о мне тоже бы такое нужно. только чтобы картинка не на канве, а вставленная была
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31244 / 20423 / 7961
Регистрация: 22.10.2011
Сообщений: 35,453
Записей в блоге: 6
03.06.2012, 16:59 3
Цитата Сообщение от AnatolyDS Посмотреть сообщение
Подскажите, как преобразовать RGB в HLS (тон, яркость, насыщенность) и обратно.
Вот тут посмотри: Преобразование цвета RGB <-> HLS
0
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 27
03.06.2012, 17:12  [ТС] 4
Цитата Сообщение от UI Посмотреть сообщение
Делал так же, но преобразовывает как-то криво.
Вот мой код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
{ RGB -> HLS }
function RGB2HLS (px : TColor): integer;
var H, L, S, R, G, B, x, n : byte;
  dR, dG, dB : single;
begin
  R:= px shr 16;
  G:= (px shl 8) shr 16;
  B:= (px shl 16) shr 16;
 
  x:= max(max(r,g),b);
  n:= min(min(r,g),b);
 
  L:= round(((x+n)*HLSMAX + RGBMAX)/(2*RGBMAX));
 
  if x = n then
  begin
    S:= 0;
    H:= (HLSMAX*2) div 3;
  end
  else
  begin
    if (L <= (HLSMAX*2)) then
      S:= round(((x-n)*HLSMAX + ((x+n)/2)) / (x+n))
    else
      S:= round(((x-n)*HLSMAX + ((2*RGBMAX-x-n)/2)) / (2*RGBMAX-x-n));
 
    dR:= ((x - R)*HLSMAX/2 + ((x-n)/2)) / (x-n);
    dG:= ((x - G)*HLSMAX/2 + ((x-n)/2)) / (x-n);
    dB:= ((x - B)*HLSMAX/2 + ((x-n)/2)) / (x-n);
 
    if R = x then
      H:= round(dB - dG)
    else
      if G = x then
        H:= round((HLSMAX/3) + dR - dB)
      else
        H:= round(2*HLSMAX/3 + dG - dR);
 
    if H < 0 then
      H:= H + HLSMAX;
    if H > HLSMAX then
      H:= H - HLSMAX;
  end;
 
  RGB2HLS:= (H*$010000) + (L*$000100) + S;
end;
{ /! RGB -> HLS }
{--------------------------------------------}
 
{ HLS -> RGB }
function HLS2RGB(H, L, S : integer): integer;
var R, G, B : byte;
   n1, n2 :single;
 
  function H2RGB(hue: integer): integer;
  begin
    if (hue < 0) then hue := hue+HLSMAX;
    if (hue > HLSMAX) then
      hue:=hue -HLSMAX;
    if (hue < (HLSMAX/6)) then
      result:= round( n1 + (((n2-n1)*hue+HLSMAX/12)/(HLSMAX/6)) )
    else
      if (hue < (HLSMAX/2)) then
        result:=round(n2)
      else
        if (hue < ((HLSMAX*2)/3)) then
          result:= round( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue)+(HLSMAX/12))/(HLSMAX/6)))
        else result:= round( n1 );
  end;
 
begin 
  if (S = 0) then
  begin
      B:=round( (L*RGBMAX)/HLSMAX );
      R:=B;
      G:=B;
  end
  else
  begin
    if (L <= (HLSMAX/2)) then
      n2 := (L*(HLSMAX + S) + (HLSMAX/2))/HLSMAX
    else
      n2 := L + S - ((L*S) + (HLSMAX/2))/HLSMAX;
    n1 := 2*L-n2;
    R := round( (H2RGB(H+round(HLSMAX/3))*RGBMAX + (HLSMAX/2))/HLSMAX );
    G := round( (H2RGB(H)*RGBMAX + (HLSMAX/2)) / HLSMAX );
    B := round( (H2RGB(H-round(HLSMAX/3))*RGBMAX + (HLSMAX/2))/HLSMAX );
  end;
 
  if R < 0 then
    R:= 0;
  if R > RGBMAX then
    R:= RGBMAX;
 
  if G < 0 then
    G:= 0;
  if G > RGBMAX then
    G:= RGBMAX;
 
  if B < 0 then
    B:= 0;
  if B > RGBMAX then
    B:= RGBMAX;
 
  HLS2RGB:= (R*$010000) + (G*$000100) + B;
end;
И ещё вопрос: как можно изменения применить, а то попиксельный перебор много времени занимает?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2012, 17:12

Изменение яркости контрастности изображения. Бинаризация изображения
Товарищи программисты помогите с разработкой алкоритма для изменеие яркости контрастности...

Изменение изображения
Всем привет, я хотел бы узнать как можно убрать квадрат и оставить только изображение Вот...

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

Изменение изображения
Нужно при нажатии на кнопку изменить изображение, это всё просто, проблема в том что надо чтобы...


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

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

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