RGB zu HSL Umwandlung scheint OK-Wert-Schraubstock, aber nicht visuell
-
08-10-2019 - |
Frage
eine noob Frage hier.
- Lassen Sie uns sagen, ich habe RGB-Werte: R: 53, G: 37 und B: 11
-
, so dass ich eine Hintergrundfarbe eines Rechtecks ??mit:
[UIColor colorWithRed:0.53 green:0.37 blue:0.11 alpha:1.00];
-
Jetzt habe ich einen RGB zu HSL-Konvertierung, die Ausbeuten: H: 0,10, S: 0,16, und L: 0,13
-
, so dass ich eine Hintergrundfarbe des gleichen Rechtecks ??mit:
[UIColor colorWithHue:0.10 saturation:0.16 brightness:0.13 alpha:1.00];
Die Sache ist, dass das HSL-Farb Aussehen nichts , wie die RGB-Farbe. Ich vergleichen mein Wandlungsergebnis gegen einen Online-Konverter und es sieht nicht gut aus, soweit ich das beurteilen kann.
Ich bin am wahrscheinlichsten Interpretation falsch etwas.
Lösung
Die UIColor Funktion gilt HSB was HSL unterscheidet.
Andere Tipps
Wie Dominik wies darauf hin, Sie verwechselt HSB / HSV und HSL.
Hier können Sie als Kategorie für UIImage finden für HSB Umwandlung
Bearbeiten
Der Link führt nun zu einem Kern ich von diesem Code erstellt. Ich fand es in einem anderen GitHub Projekt .
Hier ist ein Open-Source-Mischung aus Drupals Farbfunktionen + einige verschiedene Programmierer in einer einzigen Funktion Prahlerei RGB> HSL und wieder gemischt arbeiten. Es funktioniert einwandfrei.
<?php
### RGB >> HSL
function _color_rgb2hsl($rgb) {
$r = $rgb[0]; $g = $rgb[1]; $b = $rgb[2];
$min = min($r, min($g, $b)); $max = max($r, max($g, $b));
$delta = $max - $min; $l = ($min + $max) / 2; $s = 0;
if ($l > 0 && $l < 1) {
$s = $delta / ($l < 0.5 ? (2 * $l) : (2 - 2 * $l));
}
$h = 0;
if ($delta > 0) {
if ($max == $r && $max != $g) $h += ($g - $b) / $delta;
if ($max == $g && $max != $b) $h += (2 + ($b - $r) / $delta);
if ($max == $b && $max != $r) $h += (4 + ($r - $g) / $delta);
$h /= 6;
} return array($h, $s, $l);
}
### HSL >> RGB
function _color_hsl2rgb($hsl) {
$h = $hsl[0]; $s = $hsl[1]; $l = $hsl[2];
$m2 = ($l <= 0.5) ? $l * ($s + 1) : $l + $s - $l*$s;
$m1 = $l * 2 - $m2;
return array(_color_hue2rgb($m1, $m2, $h + 0.33333),
_color_hue2rgb($m1, $m2, $h),
_color_hue2rgb($m1, $m2, $h - 0.33333));
}
### Helper function for _color_hsl2rgb().
function _color_hue2rgb($m1, $m2, $h) {
$h = ($h < 0) ? $h + 1 : (($h > 1) ? $h - 1 : $h);
if ($h * 6 < 1) return $m1 + ($m2 - $m1) * $h * 6;
if ($h * 2 < 1) return $m2;
if ($h * 3 < 2) return $m1 + ($m2 - $m1) * (0.66666 - $h) * 6;
return $m1;
}
### Convert a hex color into an RGB triplet.
function _color_unpack($hex, $normalize = false) {
if (strlen($hex) == 4) {
$hex = $hex[1] . $hex[1] . $hex[2] . $hex[2] . $hex[3] . $hex[3];
} $c = hexdec($hex);
for ($i = 16; $i >= 0; $i -= 8) {
$out[] = (($c >> $i) & 0xFF) / ($normalize ? 255 : 1);
} return $out;
}
### Convert an RGB triplet to a hex color.
function _color_pack($rgb, $normalize = false) {
foreach ($rgb as $k => $v) {
$out |= (($v * ($normalize ? 255 : 1)) << (16 - $k * 8));
}return '#'. str_pad(dechex($out), 6, 0, STR_PAD_LEFT);
}
/* $testrgb = array(0.2,0.75,0.4); //RGB to start with
print_r($testrgb); */
print "Hex: ";
$testhex = "#b7b700";
print $testhex;
$testhex2rgb = _color_unpack($testhex,true);
print "<br />RGB: ";
var_dump($testhex2rgb);
print "<br />HSL color module: ";
$testrgb2hsl = _color_rgb2hsl($testhex2rgb); //Converteren naar HSL
var_dump($testrgb2hsl);
print "<br />RGB: ";
$testhsl2rgb = _color_hsl2rgb($testrgb2hsl); // En weer terug naar RGB
var_dump($testhsl2rgb);
print "<br />Hex: ";
$testrgb2hex = _color_pack($testhsl2rgb,true);
var_dump($testrgb2hex);
?>