Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Смешение цветов   Найти похожие ветки 

 
Fynjy1984 ©   (2004-10-08 12:45) [0]

Я когда-то видел здесь вопрос про смешение цветов (желтый+красный=оранжевый). Не помню, чем закончилось обсуждение?


 
TUser ©   (2004-10-08 12:49) [1]

Тем, что Gero предложил на основе битовой математики алгоритм быстрого получения смеси. Не совсем точный алгоритм был примерно такой
(((C1 shr 1) and $3F3F3F) + ((C2 shr 1) and $3F3F3F)) shl 1
Более точный - не помню, но можно сообразить, по аналогии.


 
Fynjy1984 ©   (2004-10-08 13:09) [2]

2 TUser ©
Да придется подумать, а то желтый+синий=серый не катит!


 
TUser ©   (2004-10-08 13:15) [3]

Поищи эту ветку в архиве


 
asafr ©   (2004-10-08 15:27) [4]

Про смешение цветов если хотите знать более полно - то неоходимо читать книги по оптике, в том числе и о смесях цветов... (я говорю о теории)... Посмотрите что-нибудь о цветовом треугольнике и вычислении цветов... КНиг в этой области предостаточно, в т.ч. с подробным разжевыванием....
успехов...


 
Fenik   (2004-10-08 19:42) [5]

А если смешивать значения CMYK?


 
Defunct ©   (2004-10-08 20:45) [6]

Смешение цветов:

Function MixColors(C1, C2: Integer): Integer;assembler;
Asm
 movd  mm7, EAx
 movd  mm6, EDx
 psubb mm6, mm7
 psrlq mm6, 1
 paddb mm7, mm6
 movd  Eax, mm7
 emms
end;


(С) Def


 
Fenik   (2004-10-08 20:50) [7]

Монстрообразный вариант через CMYK:

function MixCMYK(const Color1, Color2: TColor): TColor;
type
 TRGB = packed record
   R, G, B: Byte;
 end;
 TCMYK = packed record
   C, M, Y, K: Byte;
 end;

 function C2RGB(const Color: TColor): TRGB;
 begin
   with Result do begin
     B := Lo((Color shr 8) shr 8);
     G := Lo(Color shr 8);
     R := Lo(Color);
   end
 end;

 function RGB2CMYK(const RGB: TRGB): TCMYK;
 //Автор: Ajax, ajax@mail.kz  ||  Copyright: Ajax
 begin
   with Result, RGB do begin
     C := 255 - R;
     M := 255 - G;
     Y := 255 - B;
     if C < M then K := C
              else K := M;
     if Y < K then K := Y;
     if K > 0 then begin
       C := C - K;
       M := M - K;
       Y := Y - K;
     end;
   end;
 end;

 function CMYK2RGB(const CMYK: TCMYK): TRGB;
 //Автор: Ajax, ajax@mail.kz  ||  Copyright: Ajax
 begin
   with Result, CMYK do begin
     if (Integer(Y) + Integer(K)) < 255
       then B := 255 - (Y + K)
       else B := 0;
     if (Integer(M) + Integer(K)) < 255
       then G := 255 - (M + K)
       else G := 0;
     if (Integer(C) + Integer(K)) < 255
       then R := 255 - (C + K)
       else R := 0;
   end;
 end;

 function BL(B: Double): Byte;
 begin
   if B <= 255.0 then Result := Round(B)
                 else Result := 255;
 end;

var C1, C2: TCMYK;
begin
 C1 := RGB2CMYK(C2RGB(Color1));
 C2 := RGB2CMYK(C2RGB(Color2));
 with C1 do begin
   C := BL((C1.C + C2.C)/2);
   M := BL((C1.M + C2.M)/2);
   Y := BL((C1.Y + C2.Y)/2);
   K := BL((C1.K + C2.K)/2);
 end;
 with CMYK2RGB(C1) do
   Result := RGB(R, G, B);
end;


> Defunct ©  (08.10.04 20:45) [6]

Плохо смешивает.


 
Defunct ©   (2004-10-08 21:11) [8]

> Плохо смешивает.

ну да, она была немного специфична.
щас сделаю в общем случае.


 
Mihey_temporary ©   (2004-10-08 21:38) [9]

Побачьте. Может лучше (может нет).
http://www.efg2.com/Lab/Graphics/Colors/ColorMix.htm


 
Defunct ©   (2004-10-08 21:56) [10]

Смещивает цвета с прозрачностью 50% на каждый цвет.

Function MixColors(C1, C2: Integer): Integer;assembler;
Asm
 movd  mm7, EAx
 pxor  mm5, mm5
 movd  mm6, EDx
 punpcklbw mm7, mm5
 punpcklbw mm6, mm5
 paddw mm6, mm7
 psraw mm6, 1
 packuswb mm6, mm6
 movd  Eax, mm6
 emms
end;


(С) def

пример использования:

procedure TForm1.Button4Click(Sender: TObject);
begin
 Canvas.Brush.Color := MixColors(clYellow, clRed);
 Canvas.Rectangle( ClientRect);
end;


 
Defunct ©   (2004-10-08 21:57) [11]

Mihey_temporary ©   (08.10.04 21:38) [9]

[10] лучше


 
GuAV ©   (2004-10-08 23:09) [12]

TUser ©   (08.10.04 12:49) [1]
Моя версия того же

неточная

function GetMixedColorThursday(C1, C2: TColor): TColor;
begin
 Result:=C1 shr 1 and $7F7F7F + C2 shr 1 and $7F7F7F +
   C1 and C2 and $010101;
end;

точная
function GetMixedColorThursday1(C1, C2: TColor): TColor;
begin
 Result:=C1 shr 1 and $7F7F7F + C2 shr 1 and $7F7F7F;
end;


но

> [10] лучше

, хотя всё равно
> желтый+синий=серый


 
Defunct ©   (2004-10-09 00:02) [13]

> желтый+синий=серый

Так и должно быть:
$FF 00 00
$00 FF FF

при наложении будет: $7F 7F 7F


 
Mihey_temporary ©   (2004-10-09 22:37) [14]


> Defunct ©   (08.10.04 21:56) [10]


При компиляции в Delphi 5 выводит синтаксическую ошибку по ассемблера.


 
Defunct ©   (2004-10-09 22:48) [15]

> Mihey_temporary ©   (09.10.04 22:37) [14]

D5 не поддерживает MMX инструкции.

Функция [10] для D5 и ниже:

Function MixColorsD5(C1, C2: Integer): integer; assembler;
asm
 db $0F, $6E, $F8
 db $0F, $EF, $ED
 db $0F, $6E, $F2
 db $0F, $60, $FD
 db $0F, $60, $F5
 db $0F, $FD, $F7
 db $0F, $71, $E6, $01
 db $0F, $67, $F6
 db $0F, $7E, $F0
 db $0F, $77
end;


 
Mihey_temporary ©   (2004-10-10 01:33) [16]

2 Defunct:

Что-то мне серый цвет всё-же не нравится. Я попробовал сделать смешивание при помощи цветового колеса (через модель HSV) и получилось вот что (первые два ряда - моё, вторые два ряда - твоё):

http://www.hot.ee/mvps24/colormix1.png

Жёлтый + Синий = Зелёный (0,255,128) - это хорошо
Смешение чёрного с цветами даёт почти одинаковый результат
Мне не понравилось в моём случае 2-ой ряд 2-ое и 3-е смешение. Как ты на него смотришь?

ИМХО истиное смешение - это что-то среднее между двумя способами.


 
Defunct ©   (2004-10-10 02:08) [17]

Мое смешивание основано на простой формуле прозрачности из Abobe Photoshop. Где слой2 накладывается на слой1 с Opacity процентом непрозрачности. Opacity в случае [10] = 50% для второго слоя.


 
Defunct ©   (2004-10-10 02:14) [18]

> Жёлтый + Синий = Зелёный (0,255,128) - это хорошо

Не всегда.
В RGB схеме желтый = зеленый + красный, если добавить синий цвет мы должны получить белый, т.к. составляющие белого - все три цвета.

Белый = зеленый + красный + синий
желтый = зеленый + красный
соответственно:
Белый = Желтый + Синий.

В твоем же случае получается неразбериха, при смешивании двух темных цветов у тебя получается более яркий цвет, а это просто невозможно.


 
Mihey_temporary ©   (2004-10-10 12:57) [19]


> Defunct ©   (10.10.04 02:14) [18]


Суть в том, чтобы независимо от RGB приблизить это дело к реальности. Формула полупрозрачности почти везде одинаковая, но это не значит, что так оно и есть. Вообще, жёлтый + синий должен быть белый, так как эти цвета - дополняющие.

>В твоем же случае получается неразбериха, при смешивании двух темных цветов у тебя получается более яркий цвет, а это просто невозможно.

Где такое?


 
Defunct ©   (2004-10-11 01:00) [20]

> Суть в том, чтобы независимо от RGB приблизить это дело к реальности.

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

> Формула полупрозрачности почти везде одинаковая, но это не значит, что так оно и есть.

А как тогда?

> Вообще, жёлтый + синий должен быть белый, так как эти цвета - дополняющие.

Правильно, но только когда тело прозрачное, мы получаем серый (затемненный белый).

>> В твоем же случае получается неразбериха, при смешивании двух темных цветов у тебя получается более яркий цвет, а это просто невозможно.

> Где такое?


Желтый + Синий = Ярко зеленый.
Зеленый + Красный = Ярко желтый.
Синий + Красный = Ярко сиреневый.
Зеленый + Синий = Голубой!

да что говорить, вы сами имеете глаза, и прекрасно видете прогрешности вашего способа.

Хотя почти во всех остальных случаях смешивания результат у вас почти совпадает с [10]. отсюда и вывод.


 
Mihey_temporary ©   (2004-10-11 01:38) [21]

Ну так жёлтый + синий = серый. Если у меня цвета ярче получаются, то у тебя - темнее, чем надо. Белого хочу.


 
Defunct ©   (2004-10-11 02:54) [22]

> Mihey_temporary ©   (11.10.04 01:38) [21]

Вот алгоритм по которому работает [10]. Меняйте значение непрозрачности (Opacity) требуемого слоя.

Type TRGBColor = Record
      B          : Byte;
      G          : Byte;
      R          : Byte;
      AlfaChanel : Byte;
    End;

Function Mix(SourceColor, DestColor, Opacity:Byte):Byte;
Var Delta:Integer;
Begin
 Delta := DestColor - SourceColor;
 Delta := (Delta*Opacity) div 100;
 Result := Byte(SourceColor + Delta);
End;

Function MixColor2(C1, C2, opacity: Integer):Integer;
Begin
 With TRGBColor(Result) Do
 Begin
    R := Mix( TRGBColor(C1).R, TRGBColor(C2).R, opacity);
    G := Mix( TRGBColor(C1).G, TRGBColor(C2).G, opacity);
    B := Mix( TRGBColor(C1).B, TRGBColor(C2).B, opacity);
    AlfaChanel := 0;
 End;
End;


 
Fynjy1984 ©   (2004-10-11 11:22) [23]

Всем, всем, всем ОГРОМНОЕ СПАСИБО !!!



Страницы: 1 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.368 c
1-1097232233
Andrey_
2004-10-08 14:43
2004.10.24
Исключение от MaskEdit


6-1092814512
Dmitry_K
2004-08-18 11:35
2004.10.24
Где можно найти хелп по iphlpapi


4-1095760732
romario
2004-09-21 13:58
2004.10.24
Буфер обмена.


14-1096431982
MBo
2004-09-29 08:26
2004.10.24
Новосибирск. Осенняя встреча.


14-1096729927
kaZaNoVa
2004-10-02 19:12
2004.10.24
Обработка видео