Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.239.150.167] |
|
Сообщ.
#1
,
|
|
|
Вот допустим у меня есть три цвета: clRed, clBlue, clWhite которые я смешиваю и получаю 16711871 ($00BF7FBF),
function SummColors2(C1, C2: TColor): TColor; begin Result := RGB( (GetRValue(C1) - (GetRValue(C1) - GetRValue(C2)) div 2) , (GetGValue(C1) - (GetGValue(C2) - GetGValue(C2)) div 2) , (GetBValue(C1) - (GetBValue(C2) - GetBValue(C2)) div 2)) ; end; ... SummColors2( SummColors2(clRed, clBlue), clWhite ) = 16711871 ... а как теперь этот цвет 16711871 ($00BF7FBF) разделить на исходные цвета, которые при сложении дадут тот же результат 16711871 ($00BF7FBF)? Мне на ум приходит только брутфорсить все возможные комбинации RGB пока не будет совпадения с исходным, но это долго, может есть какой-то более быстрый вариант ? |
Сообщ.
#2
,
|
|
|
Вариант 1. Использовать определение типа данных
type TRGBunion = packed record case Byte of 0: (clRed, clGreen, clBlue, Reserved: Byte); 1: (clLoWord, clHiWord: Word); 2: (clColor: Cardinal); end; var a : TRGBunion; begin a.clColor := $BF7FBF; WriteLn(a.clRed, ' ', a.clGreen, ' ', a.clBlue); a.clRed := 255; a.clGreen := 0; a.clBlue := 127; WriteLn(Format('0x%6X', [a.clColor])); ReadLn; end. Тогда при обращении к нужному полю вы будете получать нужный вариант и при этом никаких лишних операций не потребуется. Компилятор сам будет знать как взять нужную компоненту цвета или все целиком. Вариант 2. Использовать алгебру логики var clColor : Cardinal = 0; clRed : Byte = $BF; clGreen : Byte = $7F; clBlue : Byte = $BF; begin clColor := (clRed and 255) or ((clGreen and 255) shl 8) or ((clBlue and 255) shl 16); WriteLn(Format('0x%6X', [clColor])); // Обратное clColor := $FFFFFF; clRed := clColor and 255; clGreen := (clColor shr 8) and 255; clBlue := (clColor shr 16) and 255; WriteLn(clRed, ' ', clGreen, ' ', clBlue); ReadLn; end. А вот оба этих метода в одной программе program Project1; uses SysUtils, Classes; type TRGBunion = packed record case Byte of 0: (clRed, clGreen, clBlue, Reserved: Byte); 1: (clLoWord, clHiWord: Word); 2: (clColor: Cardinal); end; var unColor: TRGBunion; clColor: Cardinal; clRed, clGreen, clBlue: Byte; begin clRed := 255; clGreen := 127; clBlue := 63; clColor := (clRed and 255) or ((clGreen and 255) shl 8) or ((clBlue and 255) shl 16); WriteLn(Format('0x%06X - логические операции', [clColor])); clColor := $BF7FBF; clRed := clColor and 255; clGreen := (clColor shr 8) and 255; clBlue := (clColor shr 16) and 255; WriteLn(Format('0x%02X 0x%02X 0x%02X - обратное преобразование', [clRed, clGreen, clBlue])); with unColor do begin clRed := 255; clGreen := 127; clBlue := 63; WriteLn(Format('0x%06X - определение структуры данных в памяти', [clColor])); clColor := $BF7FBF; WriteLn(Format('0x%02X 0x%02X 0x%02X - обратно в компоненты цвета', [clRed, clGreen, clBlue])); end; ReadLn; end. 0x3F7FFF - логические операции 0xBF 0x7F 0xBF - обратное преобразование 0x3F7FFF - определение структуры данных в памяти 0xBF 0x7F 0xBF - обратно в компоненты цвета |
Сообщ.
#3
,
|
|
|
Я немного подправил вопрос что бы было понятнее в чём задача.
macomics Похоже вы вопрос не поняли ... |
Сообщ.
#4
,
|
|
|
Так тут простая математика. Просто сделайте обратные операции и решите систему с 3 неизвестными от 3 уравнений
|
Сообщ.
#5
,
|
|
|
Цитата macomics @ Так тут простая математика. Просто сделайте обратные операции и решите систему с 3 неизвестными от 3 уравнений интересно как вы себе это представляете, потому, что я это представить немогу... Добавлено зы: до меня сейчас дошло, что задача решения не имеет. |
Сообщ.
#6
,
|
|
|
// GetRValue(C1) - (GetRValue(C1) - GetRValue(C2)) div 2; (X1 - (X1 - X2)) / 2 = R // (GetGValue(C1) - (GetGValue(C2) - GetGValue(C2)) div 2); (Y1 - (Y2 - Y2)) / 2 = G // (GetBValue(C1) - (GetBValue(C2) - GetBValue(C2)) div 2); (Z1 - (Z2 - Z2)) / 2 = B // (X1 - (X1 - X2)) / 2 = R; X2 / 2 = R; X2 = 2 * R; // (Y1 - (Y2 - Y2)) / 2 = G; Y1 / 2 = G; Y1 = 2 * G; // (Z1 - (Z2 - Z2)) / 2 = B; Z1 / 2 = B; Z1 = 2 * B; function backSummColors2(CX: TColor; out C1: TColor): TColor; begin C1 := RGB(0, 2 * GetGValue(CX), 2 * GetBValue(CX)); Result := RGB(2 * GetRValue(CX), 0, 0) ; end; При таких формулах найти все компоненты исходных цветов нельзя, но вывести обратные формулы можно, хотя они не дадут вам все исходные данные. |
Сообщ.
#7
,
|
|
|
По сути, изначальное преобразование - весьма какоета странное! Ассиметричное какоета:
Result := RGB( (GetRValue(C1) - (GetRValue(C1) - GetRValue(C2)) div 2) , (GetGValue(C1) - (GetGValue(C2) - GetGValue(C2)) div 2) , (GetBValue(C1) - (GetBValue(C2) - GetBValue(C2)) div 2)) ; Вангую - лутше выяснить суть первоначальных преобразований, ну а потом уже напрягаться. |
Сообщ.
#8
,
|
|
|
Majestio
Ну это первое что нашлось по теме смешивания цветов, чего-то более лучшего не нашлось. Как пишут в интернетах, идеального алгоритма нету. |