Форум: "Основная";
Текущий архив: 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