Oto funkcja, nad którą pracowałem, aby programowo rozjaśnić lub przyciemnić kolor heksadecymalny o określoną wartość. Wystarczy podać ciąg znaków jak "3F6D2A"
dla color ( col
) i liczbę całkowitą base10 ( amt
) dla ilości rozjaśnienia lub przyciemnienia. Aby przyciemnić, podaj liczbę ujemną (tj -20
.).
Powodem, dla którego to zrobiłem, były wszystkie znalezione przeze mnie rozwiązania, które jak dotąd wydawały się nadmiernie komplikować problem. I miałem wrażenie, że można to zrobić za pomocą zaledwie kilku linii kodu. Daj mi znać, jeśli znajdziesz jakieś problemy lub masz jakieś poprawki, aby to przyspieszyć.
function LightenDarkenColor(col, amt) {
col = parseInt(col, 16);
return (((col & 0x0000FF) + amt) | ((((col >> 8) & 0x00FF) + amt) << 8) | (((col >> 16) + amt) << 16)).toString(16);
}
// TEST
console.log( LightenDarkenColor("3F6D2A",40) );
Do użytku programistycznego tutaj jest łatwiejsza do odczytania wersja:
function LightenDarkenColor(col, amt) {
var num = parseInt(col, 16);
var r = (num >> 16) + amt;
var b = ((num >> 8) & 0x00FF) + amt;
var g = (num & 0x0000FF) + amt;
var newColor = g | (b << 8) | (r << 16);
return newColor.toString(16);
}
// TEST
console.log(LightenDarkenColor("3F6D2A", -40));
I wreszcie wersja do obsługi kolorów, które mogą (ale nie muszą) mieć na początku „#”. Plus dostosowanie do niewłaściwych wartości kolorów:
function LightenDarkenColor(col,amt) {
var usePound = false;
if ( col[0] == "#" ) {
col = col.slice(1);
usePound = true;
}
var num = parseInt(col,16);
var r = (num >> 16) + amt;
if ( r > 255 ) r = 255;
else if (r < 0) r = 0;
var b = ((num >> 8) & 0x00FF) + amt;
if ( b > 255 ) b = 255;
else if (b < 0) b = 0;
var g = (num & 0x0000FF) + amt;
if ( g > 255 ) g = 255;
else if ( g < 0 ) g = 0;
return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);
}
OK, więc teraz nie jest to tylko kilka linii, ale wydaje się o wiele prostsze, a jeśli nie używasz „#” i nie musisz sprawdzać kolorów poza zakresem, to tylko kilka linii.
Jeśli nie używasz „#”, możesz po prostu dodać go w kodzie:
var myColor = "3F6D2A";
myColor = LightenDarkenColor(myColor,10);
thePlaceTheColorIsUsed = ("#" + myColor);
Myślę, że moje główne pytanie brzmi: czy mam rację tutaj? Czy nie obejmuje to niektórych (normalnych) sytuacji?
źródło
Odpowiedzi:
Ta odpowiedź stała się własną bestią. Wiele nowych wersji robiło się głupio długo. Ogromne podziękowania dla wszystkich bardzo wielu autorów tej odpowiedzi. Ale dla uproszczenia dla mas. Zarchiwizowałem wszystkie wersje / historię ewolucji tej odpowiedzi na moim githubie . I zaczął to od nowa w StackOverflow tutaj z najnowszą wersją. Specjalne podziękowania należą się Mike'owi „Pomax” Kamermansowi za tę wersję. Dał mi nową matematykę.
Ta funkcja (
pSBC
) przyjmuje kolor WWW HEX lub RGB.pSBC
może przyciemnić go ciemniej lub jaśniej lub zmieszać go z drugim kolorem, a także przesłać go od razu, ale konwertować z Hex na RGB (Hex2RGB) lub RGB na Hex (RGB2Hex). Wszystko to bez Twojej wiedzy na temat używanego formatu kolorów.Działa to naprawdę szybko, prawdopodobnie najszybciej, zwłaszcza biorąc pod uwagę jego wiele funkcji. Trwało to długo. Zobacz całą historię na moim githubie . Jeśli chcesz mieć absolutnie najmniejszy i najszybszy możliwy sposób cieniowania lub łączenia, zapoznaj się z poniższymi funkcjami Micro i użyj jednego z 2-liniowych demonów prędkości. Świetnie nadają się do intensywnych animacji, ale ta wersja tutaj jest wystarczająco szybka dla większości animacji.
Ta funkcja wykorzystuje mieszanie logów lub liniowe. Jednak NIE konwertuje on na HSL, aby właściwie rozjaśnić lub przyciemnić kolor. Dlatego wyniki tej funkcji będą się różnić od znacznie większych i wolniejszych funkcji korzystających z HSL.
Funkcje:
"#AA6622"
lub"#bb551144"
."rgb(123,45,76)"
lub"rgba(45,15,74,0.45)"
."#C41"
staje się"#CC4411"
.c0
kolor (z) lubc1
(do) ma kanał alfa, wówczas zwracany kolor będzie miał kanał alfa. Jeśli oba kolory mają kanał alfa, wówczas zwracany kolor będzie liniowym połączeniem dwóch kanałów alfa z wykorzystaniem podanego procentu (tak jakby to był normalny kanał koloru). Jeśli tylko jeden z dwóch kolorów ma kanał alfa, ta alfa zostanie po prostu przekazana do zwracanego koloru. Umożliwia to mieszanie / cieniowanie przezroczystego koloru przy zachowaniu poziomu przezroczystości. Lub, jeśli poziomy przezroczystości również powinny się mieszać, upewnij się, że oba kolory mają alfy. Podczas cieniowania przejdzie kanał alfa prosto przez. Jeśli chcesz podstawowego cieniowania, które również zacienia kanał alfa, użyjrgb(0,0,0,1)
lubrgb(255,255,255,1)
jako własnegoc1
(do) kolor (lub ich odpowiedniki szesnastkowe). W przypadku kolorów RGB kanał alfa zwracanego koloru zostanie zaokrąglony do 3 miejsc po przecinku.c0
(z) koloru; zwracany kolor będzie zawsze w formacie koloruc1
(do) koloru, jeśli taki istnieje. Jeśli nie mac1
koloru (do), wprowadź go'c'
jakoc1
kolor, a będzie cieniował i przekształcał niezależnie odc0
koloru. Jeśli pożądana jest tylko konwersja, należy również podać0
wartość procentową (p
). Jeślic1
kolor zostanie pominięty lub niestring
zostanie przekazany żaden element , nie zostanie on przekonwertowany.pSBCr
można przekazać kolor Hex lub RGB i zwraca obiekt zawierający tę informację o kolorze. Ma postać: {r: XXX, g: XXX, b: XXX, a: X.XXX}. Gdzie.r
,.g
i.b
mają zakres od 0 do 255. A gdy nie ma alfa:.a
wynosi -1. W przeciwnym razie:.a
ma zakres od 0,000 do 1,000.rgba()
kończy się,rgb()
gdy kolor z kanałem alfa został przekazany doc0
(od) i / lubc1
(do).null
. Przykład:pSBC(0.5,"salt") == null
gdzie, jak myśli,#salt
jest prawidłowy kolor. Usuń cztery linie, które kończą się,return null;
aby usunąć tę funkcję i uczynić ją szybszą i mniejszą.true
dlal
(czwarty parametr), aby użyć mieszania liniowego.Kod:
Stosowanie:
Poniższy obrazek pomoże pokazać różnicę w dwóch metodach mieszania:
Funkcje mikro
Jeśli naprawdę chcesz prędkości i rozmiaru, będziesz musiał użyć RGB, a nie HEX. RGB jest prostszy i prostszy, HEX pisze zbyt wolno i występuje w zbyt wielu odmianach dla prostego dwuliniowego (IE. Może to być 3, 4, 6 lub 8 cyfrowy kod HEX). Będziesz także musiał poświęcić niektóre funkcje, bez sprawdzania błędów, bez HEX2RGB ani RGB2HEX. Musisz także wybrać konkretną funkcję (na podstawie jej nazwy poniżej) dla matematyki mieszania kolorów, a jeśli chcesz cieniować lub mieszać. Te funkcje obsługują kanały alfa. A gdy oba kolory wejściowe mają litery, będzie je liniowo mieszać. Jeśli tylko jeden z dwóch kolorów ma alfa, przekaże go bezpośrednio do uzyskanego koloru. Poniżej znajdują się dwie funkcje liniowe, które są niezwykle szybkie i małe:
Chcesz więcej informacji? Przeczytaj pełny tekst na github .
PT
(Ps Jeśli ktoś ma matematykę do innej metody mieszania, proszę się podzielić.)
źródło
tinycolor.darken(color,amount);
function shadeColor2($color, $percent) { $color = str_replace("#", "", $color); $t=$percent<0?0:255; $p=$percent<0?$percent*-1:$percent; $RGB = str_split($color, 2); $R=hexdec($RGB[0]); $G=hexdec($RGB[1]); $B=hexdec($RGB[2]); return '#'.substr(dechex(0x1000000+(round(($t-$R)*$p)+$R)*0x10000+(round(($t-$G)*$p)+$G)*0x100+(round(($t-$B)*$p)+$B)),1); }
8
, dodaj10%
, do8.8
którego rundy9
. Następnie9.09%
od9
i masz8.1819
. Które zaokrągla do,8
więc to zły przykład. Ale nadal pokazuje, że pacjent9.09%
o9
nie8.8
. Może więc być tam kilka liczb, które nie zaokrąglają dokładnie tego samego, co mój przykład tutaj.Stworzyłem rozwiązanie, które działa dla mnie bardzo dobrze:
Przykład rozjaśnienia:
Przykład przyciemnienia:
źródło
R = ((R<255)?R:255).toString(16);
następnieR = R.length==1 ? "0"+R : R
do prędkości. I nie jestem pewien, o co chodzi z toUpperCase?var R = parseInt(color.substring(1, 3), 16) var G = parseInt(color.substring(3, 5), 16) var B = parseInt(color.substring(5, 7), 16) if (R == 0) R = 32; if (G == 0) G = 32; if (B == 0) B = 32;
Oto super prosta liniówka oparta na odpowiedzi Erica
Przykłady:
źródło
Tego użyłem na podstawie twojej funkcji. Wolę używać kroków powyżej wartości procentowej, ponieważ jest to dla mnie bardziej intuicyjne.
Na przykład 20% z 200 niebieskich wartości różni się znacznie od 20% z 40 niebieskich wartości.
Tak czy inaczej, oto moja modyfikacja, dzięki za oryginalną funkcję.
źródło
Wypróbowałem twoją funkcję i wystąpił mały błąd: jeśli jakaś końcowa wartość „r” ma tylko 1 cyfrę, pojawia się wynik: „a0a0a”, gdy poprawną wartością jest na przykład „0a0a0a”. Właśnie to naprawiłem, dodając to zamiast twojego zwrotu:
Może to nie jest takie miłe, ale działa. Świetna funkcja, BTW. Dokładnie to, czego potrzebowałem. :)
źródło
myślałeś o konwersji rgb> hsl? to po prostu przesuwaj Luminosity w górę i w dół? w ten sposób bym poszedł.
Szybki przegląd niektórych algorytmów dał mi następujące strony.
PHP: http://serennu.com/colour/rgbtohsl.php
JavaScript: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascriptEDYTUJ powyższy link nie jest już ważny. Możesz wyświetlić git hub dla źródła strony lub gist
Alternatywnie, dobrym pytaniem może być inne pytanie StackOverflow .
Mimo, że nie jest to właściwy wybór dla OP, poniżej podano przybliżenie kodu, który pierwotnie sugerowałem. (Zakładając, że masz funkcje konwersji rgb / hsl)
Zakłada to:
hslToRgb
irgbToHsl
.colorValue
jest łańcuchem w postaci #RRGGBBChociaż, jeśli dyskutujemy o css, istnieje składnia określająca hsl / hsla dla IE9 / Chrome / Firefox.
źródło
Wersja C # ... zauważ, że otrzymuję ciągi kolorów w tym formacie # FF12AE34, i muszę wyciąć #FF.
źródło
int
I dwavars
dla tego samego typu danych.Chciałem zmienić kolor na określony poziom jasności - bez względu na to, jaka była wcześniej jasność koloru - oto prosta funkcja JS, która wydaje się działać dobrze, chociaż jestem pewien, że może być krótsza
źródło
p
ma zasięg0-100
? Nie wiem nawet, jak poprawnie zdefiniować jasność w RGB, to jest kwestia HSL. Na przykład jest#FF00FF
jaśniejszy niż#FF0000
? Jeśli tak, oznaczałoby to, że magenta jest dwa razy jaśniejsza niż czerwień. Dlatego stosuje się czysty czerwony test. Przepuść czystą czerwień#FF0000
, ustaw 50% jasności, a oto dostajemy#FF4040
, prawda? Domyślam się, że zrobimy czerwoną 50% jasnością, zrobilibyśmy się ciemniejsi, widząc, że jest już w pełni jasna .. tak jak w przypadku#800000
150% jasności#FF8080
. Czy różowy jest jaśniejszy czerwony? czy czerwony jest już w pełni jasny?L
kanał ma dosłownie jasność. Moim [osobistym mentalnym] problemem jest to, że dla mnie#FF0000
jest w pełni jasny. I#FF4040
jest jaśniejszy, ale nie jaśniejszy ... dla mnie jaśniejszy oznacza bliżej bieli, tak jak różowy jest. A jasność jest tym, ile ma, a jego kolor jest całkowicie czerwony, więc czerwony jest w pełni jasny. Dlatego#FF0000
nie można go rozjaśnić ... ale raczej ... jaśniej ... może jestem po prostu dziwakiem, lol !! Naprawdę nie znam teorii kolorów, więc, tak naprawdę mówię o moim ...Poniższa metoda pozwala rozjaśnić lub przyciemnić wartość ekspozycji ciągu kolorów szesnastkowych (Hex):
Dla ostatniej wartości parametru w GetHexFromRGB () przekaż podwójną wartość gdzieś pomiędzy -1 a 1 (-1 to czarny, 0 to niezmieniony, 1 to biały):
źródło
Jak prosty odcień koloru w PHP?
źródło
Zrobiłem port doskonałej biblioteki xcolor, aby usunąć jej zależność od jQuery. Istnieje mnóstwo funkcji, w tym rozjaśnianie i przyciemnianie kolorów.
Naprawdę, konwersja heksów na RGB jest całkowicie oddzielną funkcją od rozjaśniania lub przyciemniania kolorów. Proszę, zachowaj suchość. W każdym razie, gdy już masz kolor RGB, możesz po prostu dodać różnicę między pożądanym poziomem światła a poziomem światła, jaki masz do każdej z wartości RGB:
Więcej informacji na https://github.com/fresheneesz/xolor .
źródło
Od dawna chciałem być w stanie tworzyć odcienie / odcienie kolorów, oto moje rozwiązanie JavaScript:
źródło
#
kolorów heksadecymalnych. Przepraszam, jeśli wydawało się to… „zatwierdzeniem”… Widziałem to jako recenzję. Jeśli nie chcesz, aby ktoś analizował Twój kod lub udzielał opinii, przepraszam.Twoje podejście jest w porządku :) Upraszczam trochę twoją najkrótszą wersję (w celu kontroli nasycenia zajrzyj tutaj )
Pokaż fragment kodu
I wersja ze sprawdzaniem # i zakresów kolorów
Pokaż fragment kodu
źródło
Zrobiłem też prosty pakiet. Użyłem wypukłości IR ^ 3, oczywiście wartości RGB są w IN ^ 3, co nie jest wypukłe, więc to nie jest naprawdę idealne
Aby przyciemnić, użyłem następujących
I rozjaśnić
Oto pakiet https://github.com/MarchWorks/colortone
Demo https://colortone.now.sh/
ze sposobem, w jaki robię rzeczy, jeśli przekroczysz współczynnik -1, skończysz na czarnym, białym, jeśli współczynnik wynosi 1. Przekazanie 0, ponieważ współczynnik nie zmieni koloru
źródło
Potrzebowałem go w języku C #, może to pomóc programistom .net
źródło