Конференция "Media" » Как получить один цвет из другого? [D7, WinXP]
 
  • Dr. Andrew (01.09.07 20:05) [0]
    Добрый вечер, Мастера! Есть ли формула получения одного цвета из другого? Допустим имеем цвет $00F5EDE3. Как используя это значение программно (алгоритмом) получить цвет $005C4500? Спасибо!
  • Dr. Andrew (01.09.07 20:16) [1]
    Мне необходимо что-то вроде такого алгоритма:


    var NewColor : TColor;

    function Convert(AColor : TColor) : TColor;
    begin
     ?????????
     Result := ??????;
    end;

    procedure TForm1.Button1Click(Sender : TObject);
    begin
      NewColor := Convert($00F5EDE3); // NewColor = $005C4500
    end;



    Спасибо за любые идеи и подсказки!
  • Dr. Andrew (01.09.07 20:26) [2]
    Небольшое дополнение. получение не любого цвета, а от светлых тонов - темных оттенков того же тона. Например, из светло-голубого получить (программно!) насыщенный синий, из розового - насыщенный красный и так далее. Все в пределах одного тона, только большей насыщенности. Спасибо!
  • Efir © (01.09.07 20:56) [3]
    Так тебе контрасность или насыщенность?

    Если контрасность, то можно сделать так:

    procedure Contrast(var Bitmap:TBitmap;L:Integer);
    var
     pix:PByteArray;
     x,y,i:integer;
     dl:real;

    function Limit(R:Smallint):byte;
    begin
     if R>255 then R:=255;
     if R<0 then R:=0;
     Result:=R;
    end;

    begin
     dl:=L/127;
     Bitmap.PixelFormat:=pf24bit;
     for y:=0 to Bitmap.Height-1 do begin
       pix:=Bitmap.ScanLine[y];
       for x:=0 to Bitmap.Width*3-1 do begin
         if pix[x]>128 then pix[x]:=Limit(Round((pix[x]-128)*dl+pix[x])) else
         pix[x]:=Limit(Round(pix[x]-(128-pix[x])*dl));
       end;
     end;
    end;

    А если насыщенность, то можно перевети цвет из RGB в модель HLS, изменить значение S и перевети снова в RGB.
  • Pavia © (01.09.07 21:23) [4]
    Триминг, переход от однй велечены к другой y*A+(1-y)*C
    y - коэффицент от 0 до 1
    Для изменения насыщенности
    C=(R+G+B)/3
    A=R,G,B для каждой состовляющей цвета

    y -  будешь менять от 1 до 2 для увиличени, а от 0 до 1 для уменьшения
  • homm © (01.09.07 21:40) [5]
    > Допустим имеем цвет $00F5EDE3. Как используя это значение
    > программно (алгоритмом) получить цвет $005C4500?

    Ммм…

    function PoluchitZnachtenie(Par1: DWORD): DWORD;
    begin
      Result := Par1 - $0099A8E3;
    end;

  • Dr. Andrew (01.09.07 21:50) [6]
    Спасибо за идеи.

    Efir
    Исапользование битмапа не годится так как надо манипулировать исключительно переменной : TColor.

    Pavia
    А можно привести практический пример.

    homm
    А что это за константа - $0099A8E3? Она одна для всех тонов?
  • Dr. Andrew (01.09.07 21:58) [7]
    homm
    Функция не работает если ввести иные параметры. Вот например, если так:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Form1.Color := PoluchitZnachtenie($009FC8FF);
    end;


    то светло-оранжевый должен стать насыщенно оранжевым, а получаем после функции черный цвет. Значит константа $0099A8E3 не универсальная? Тогда как ее вычислить?
  • homm © (01.09.07 22:05) [8]
    > Значит константа $0099A8E3 не универсальная? Тогда как ее
    > вычислить?

    Нет, она не универсальна, но она позволяет получить допустим цвет $005C4500 из цвета $00F5EDE3 :)
  • Dr. Andrew (01.09.07 22:48) [9]
    homm
    Хорошо тогда как вывести универсальное выражения для получения нужного цвета?
  • homm © (01.09.07 22:59) [10]
    > [9] Dr. Andrew   (01.09.07 22:48)

    Если так и не понял, то [5] — всего лишь стеб над твоим искусством задавать вопросы, та функция делает ровно то, что написано в [0], не больше, не меньше.
  • Pavia © (01.09.07 23:15) [11]
    Тут коэффицент Y от -100 до +100
    function Saturation(Color:TColor; Y:Integer):TColor;
    var R,G,B:Integer;
    A,C:Real;
    begin
    A:=(Y+100)/100;
    R:=(Color shr 16) and $FF;
    G:=(Color shr 8) and $FF;
    B:=Color and $FF;

    C:=(R+G+B)/3;

    R:=Round(A*R+(1-A)*C);
    if R<0 then R:=0;
    if R>255 then R:=255;

    G:=Round(A*G+(1-A)*C);
    if G<0 then G:=0;
    if G>255 then G:=255;

    B:=Round(A*B+(1-A)*C);
    if B<0 then B:=0;
    if B>255 then B:=255;
    Result:=(R shl 16)+(G shl 8) +B;
    end;

  • Dr. Andrew (02.09.07 01:37) [12]
    Всем Мастерам спасибо. Особенно Pavia! Вопрос решен. Обсуждение закрыто. Спокойной ночи!
  • vrem (02.09.07 22:24) [13]
    >вопрос решён, обсуждение закрыто
    ну ты даёшь, тебе вправляли вот и всё,
    а ты даже вникать не хотел, деятель :)
  • Dr. Andrew (03.09.07 03:05) [14]
    Ну почему же я внял все что мне внимали. Спасибо всем.
 
Конференция "Media" » Как получить один цвет из другого? [D7, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]