Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.042 c
3-1096400500
Вадим
2004-09-28 23:41
2004.10.24
Сохранность данных


14-1096634877
Aleckceych
2004-10-01 16:47
2004.10.24
Пожалуйста, скиньте ссылки


8-1088526424
lota
2004-06-29 20:27
2004.10.24
Азбука Морзе


14-1096545934
pasha_golub
2004-09-30 16:05
2004.10.24
TheBat3.0


3-1096128617
Гость
2004-09-25 20:10
2004.10.24
Связка Master-Detail





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский