Wie berechnet man die erforderliche Farbtondrehung, um eine bestimmte Farbe zu erzeugen?

Lesezeit: 10 Minuten

Benutzer-Avatar
Richard Parnaby-King

Ich habe ein weißes Bild, das ich als Hintergrund für ein Div verwende, und ich möchte es so färben, dass es der Hauptfarbe des Themas entspricht. Mir ist bewusst, dass ich Folgendes tun kann:

filter: sepia() saturate(10000%) hue-rotate(30deg);

und durchradeln hue-rotate um eine Farbe zu finden, aber ist es möglich, diesen Wert im Voraus zu berechnen? Angesichts der Tatsache, dass der angegebene Hex-Wert ziemlich dunkel ist, nehme ich an, dass ich die einbeziehen muss invert(%) auch filtern.

Bei einem Hex-Wert von #689d94 Welche Mathematik muss ich tun, um das gewünschte zu berechnen? hue-rotate und invert wert, mein weißes Hintergrundbild in die gleiche Farbe umzuwandeln?

Bearbeiten

Hier ist ein Ausschnitt von a div mit einem weißen Hintergrundbild, das grün gefiltert wird. Der Trick dabei ist, dass es das Ganze ist div das wird gefiltert, nicht nur das Bild. Wenn ich etwas Text in die eingeben sollte div die Textfarbe würde auch grün werden.

div {
  background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat scroll 0 0 transparent;
  background-size:5em;
  width:5em;
  height:5em;
  -webkit-filter: invert(25%) sepia() saturate(100000%) hue-rotate(174deg);
  filter: invert(25%) sepia() saturate(100000%) hue-rotate(174deg);
}
<div></div>
<p style="background: #689d94">​</p>

  • Ist es möglich, einen Inline-Svg-Filter zu verwenden?

    – Richard Parnaby-King

    27. April 2015 um 8:23 Uhr

  • Betreff: „Ist es möglich, einen Inline-Svg-Filter zu verwenden?“Ja absolut – Siehe meine Antwort unten.

    – Ωmega

    25. Mai um 14:18 Uhr

Der Schlüssel in diesem Fall ist die Definition einer Anfangsfarbe. Weiß, Schwarz oder andere Graustufen sind technisch gesehen eine tatsächliche Farbe – Sie können sie nicht sättigen oder drehen. Sie müssen es irgendwie “einfärben”, und der Sepiafilter ist der einzige Filter, der eine Art Einfärbung durchführt.

Es wäre einfacher, wenn Ihr Bild zu 100 % rein rot wäre. Dann könnten Sie einfach den Zielgrad direkt hinzufügen und Sättigung und Helligkeit mit HSL für Ziel anpassen. Für einen weißen Startpunkt besteht der erste Schritt darin, eine Zwischenfarbe zu konvertieren und zu definieren, damit wir sie später sättigen und drehen können.

Lassen Sie uns zuerst das weiße Bild abdunkeln und Sepia anwenden, um eine “Grundfarbe” zu erhalten, mit der wir arbeiten können:

filter: brightness(50%) sepia(1);

Dies ergibt einen RGB-Farbwert von ungefähr:

rgb(178, 160, 128)

Schritt zwei besteht darin, das in den HSL-Farbraum zu konvertieren, was uns Folgendes gibt:

hsl(38, 24.5%, 60%);

Ergebnis der Grundfarbe

div {
  background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat;
  background-size:5em;
  width:5em;
  height:5em;
  -webkit-filter: brightness(50%) sepia(1);
  filter: brightness(50%) sepia(1);
}
<div></div>

Grundfarbe in Zielfarbe umwandeln

Diese beiden ersten Schritte sind statisch und ihr Ergebnis wird jedes Mal wiederverwendet, wenn wir eine Zielanpassung finden müssen (der tatsächliche Wert von Sepia ist definiert in der SVG-Filterspezifikation).

Jetzt müssen wir berechnen, was wir auf diese Grundfarbe anwenden müssen, um die Zielfarbe zu erhalten. Konvertieren Sie zuerst die Zielfarbe, zum Beispiel #689d94, wie in der Frage angegeben, in HSL:

hsl(170, 21.3%, 51.2%);

Dann müssen wir die Differenz zwischen diesen berechnen. Der Farbton wird berechnet, indem einfach die Basis vom Ziel abgezogen wird. Dasselbe gilt für Sättigung und Helligkeit, aber da wir 100 % des Basiswerts annehmen, müssen wir das Ergebnis von 100 % subtrahieren, um am Ende einen Unterschied für die akkumulierten Werte zu erhalten:

H:  170 - 38             ->  132°
S:  100 + (24.5 - 21.3)  ->  103.2%  (relative to base 100% =  3.2%)
L:  100 + (51.2 - 60.0)  ->   91.2%  (relative to base 100% = -8.8%)

Konvertieren Sie diese Werte in eine Filterzeichenfolge, indem Sie sie an den vorhandenen Filter anhängen, und legen Sie sie dann für das div fest:

/*      ------ base color ------  -------  new target -------------------------------*/
filter: brightness(50%) sepia(1)  hue-rotate(132deg) saturate(103.2%) brightness(91.2%);

Und um es einzustellen, würden Sie wahrscheinlich so etwas tun, vorausgesetzt, Filter und divElement sind bereits deklariert:

...
filter = "brightness(0.5) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%)";
divElement.style.filter = filter;
divElement.style.webkitFilter = filter;

Beachten Sie, dass wahrscheinlich Rundungsfehler auftreten, da RGB als Ganzzahl dargestellt wird, während HSL ein Gleitkommawert ist, sodass das tatsächliche Ergebnis möglicherweise nicht genau ist, aber ziemlich nahe kommen sollte.

Live-Beispiel

div {
  background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat;
  background-size:5em;
  width:5em;
  height:5em;
  -webkit-filter: 
      brightness(50%) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%);
  filter: 
      brightness(50%) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%);
}
<div></div>
<span style="font:14px sans-serif;padding:7px;color:#fff;background:#689d94">
Target color</span>

Mögliche Alternativen sind:

  • SVGs mit bereits eingestellter Farbe vordefinieren.
  • Arbeiten Sie mit HSL/RGB direkt in JavaScript und ändern Sie den SVG-Baum mit der Farbe direkt für die Form, anstatt Filter zu verwenden. Filter sind leistungsintensiv, besonders wenn viele wie hier verkettet sind und sie außerdem ein dominanter Teil einer Seite sind. Sie werden auch nicht in allen Browsern unterstützt.

  • Dies ist ein netter Versuch, aber völlig irreführend.

    – schabunc

    22. September 2018 um 20:12 Uhr

  • Diese Antwort ist falsch. Dafür gibt es eine präzise und elegante Lösung.

    – Ωmega

    25. Mai um 15:01 Uhr

Benutzer-Avatar
Michael Mullany

Die akzeptierte Antwort ist falsch. Hue-Rotate bewahrt weder Sättigung noch Helligkeit und Sie müssen verrückte Berechnungen anstellen, um die richtigen Werte zu erhalten. Der weitaus einfachere Weg – der zu einem korrekten Ergebnis führt – besteht darin, einen CSS-Filter zu erstellen, der auf einen SVG-Filter verweist. Das Grundelement feColorMatrix in SVG-Filtern ermöglicht es Ihnen, eine Farbe direkt auszuwählen.

Nehmen Sie Ihre Farbe #424242 – teilen Sie jeden RGB-Kanalwert durch #FF und setzen Sie sie in die fünfte Spalte, die ersten drei Zeilen Ihrer Farbmatrix. In diesem Fall ist Hex #42 dezimal 68, also teilen Sie das durch 255 (#FF dezimal) und Sie erhalten 0,257 – was Sie in die fünfte Spalte, die ersten drei Zeilen, eingeben.

div {
  background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat scroll 0 0 transparent;
  background-size:5em;
  width:5em;
  height:5em;
  -webkit-filter: url(#colorize);
  filter: url(#colorize);
}
<div>
  </div>

<svg>
<defs>
<filter id="colorize" color-interpolation-filters="sRGB">
<feColorMatrix type="matrix" values="0 0 0 0 .257
                                 0 0 0 0 .257
                                 0 0 0 0 .257
                                 0 0 0 1 0"/>
 
/filter>
</defs>
</svg>

Benutzer-Avatar
Ωmega

Die einzige Möglichkeit, die genaue Übereinstimmung zu erhalten, ist die Verwendung eines SVG-Farbmatrixfilters.

Für RGB-Farbe #689d94welches ist rgb(104, 157, 148)teilen Sie den Wert jeder Primärfarbe durch 255:

Wie berechnet man die erforderliche Farbtondrehung um eine bestimmte Farbe.58039}

Fügen Sie diese Gewichte in das SVG ein <filter> Matrix (5ᵗʰ-Spalte in den ersten 3 Zeilen):

<svg xmlns="http://www.w3.org/2000/svg">
  <defs>
    <filter id="689d94" color-interpolation-filters="sRGB">
      <feColorMatrix type="matrix" 
        values="0 0 0 0 0.40784 
                0 0 0 0 0.61569 
                0 0 0 0 0.58039 
                0 0 0 1 0"/>
    </filter>
  </defs>
</svg>

Das <filter> muss haben Ich würde (Ich habe den RGB-Hex-Code verwendet 689d94), damit wir es als Referenz verwenden können.

Da einige Browser (z. B. Firefox) den SVG-Filter nicht sehen/verwenden, wenn die display -Eigenschaft des SVG-Elements festgelegt ist noneund dieses SVG-Element im HTML-Code unpraktischerweise etwas Platz beanspruchen würde, ist der beste Weg, dieses SVG in einen reinen Inline-CSS-Filter umzuwandeln.

Um ein zu bekommen Inline-Filter value, nehmen Sie den oben aufgeführten SVG-Code, wandeln Sie ihn in eine einzelne Zeile um, indem Sie Zeilenumbrüche und unnötige Leerzeichen entfernen, und stellen Sie ihn dann voran url('data:image/svg+xml, und fügen Sie die zuvor genannten an Ich würde wie #689d94'):

div {
  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="71.063" height="60.938"><path d="M33.938 0l-16.97 19.906H1.625L0 21.781v8.781l1.25 1.407h4.781l5.875 28.969h46.969l6.188-28.97h4.687l1.313-1.343v-8.844L69.5 19.906H54.656L37.312 0h-3.375zm1.593 7.594l9.594 12.312H26.25l9.281-12.312zm-20.281 16s-.405 2.9 1.594 3.844c1.998.942 4.406.03 4.406.03-1.666 2.763-3.638 3.551-5.469 2.688-3.312-1.562-.531-6.562-.531-6.562zm41.188.031s2.749 4.969-.563 6.531c-2.487 1.162-4.848-1.541-5.438-2.656 0 0 2.377.88 4.375-.063 1.999-.942 1.625-3.812 1.625-3.812z"/></svg>') no-repeat; // optimized from http://richard.parnaby-king.co.uk/basket.svg
  background-size: 100%;
  display: inline-block;
  height: 5em;
  width: 5em;
}
#colored {
  filter: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><defs><filter id="689d94" color-interpolation-filters="sRGB"><feColorMatrix type="matrix" values="0 0 0 0 0.40784 0 0 0 0 0.61569 0 0 0 0 0.58039 0 0 0 1 0"/></filter></defs></svg>#689d94');
  margin-left: 20px;
}
<!-- No <svg> in HTML; pure CSS -->
<div></div><div id="colored"></div>
<p style="background: #689d94">​</p>

Benutzer-Avatar
Azi

Wenn SVG verwendet wird, dann …

Sie können SVG-Dateien mit einem Texteditor öffnen, kopieren und in die HTML-Datei einfügen und dann die Pfadfarbe nach Bedarf ändern.

Im folgenden Beispielcode … habe ich gerade die Pfadfarbe des Mittelrings geändert. Hoffe das hilft..

        var imgg =document.getElementById("path");
        imgg.style="fill:#424242";
   
<html>
<body>
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg id="imgg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 296.838 296.838" style="enable-background:new 0 0 296.838 296.838;" xml:space="preserve" width="512px" height="512px">
<g>
	<path  d="M58.733,64.566L41.763,47.596C14.832,74.526,0,110.333,0,148.419s14.832,73.893,41.763,100.823l16.971-16.971   C36.335,209.874,24,180.095,24,148.419S36.335,86.964,58.733,64.566z" fill="#91DC5A"/>
	<path d="M82.137,81.969c-17.75,17.748-27.525,41.348-27.525,66.45s9.775,48.702,27.525,66.45l16.971-16.971   c-13.218-13.216-20.496-30.788-20.496-49.479s7.278-36.264,20.496-49.48L82.137,81.969z" fill="#91DC5A"/>
	<path d="M255.075,47.596l-16.971,16.971c22.399,22.397,34.733,52.177,34.733,83.853s-12.335,61.455-34.733,83.852l16.971,16.971   c26.931-26.931,41.763-62.737,41.763-100.823S282.006,74.526,255.075,47.596z" fill="#91DC5A"/>
	<path d="M214.701,81.969L197.73,98.939c13.218,13.216,20.496,30.788,20.496,49.48s-7.278,36.264-20.496,49.479l16.971,16.971   c17.75-17.748,27.525-41.348,27.525-66.45S232.451,99.717,214.701,81.969z" fill="#91DC5A"/>
	<path id="path" d="M148.586,114.789c-8.607,0-17.212,3.284-23.78,9.851c-13.131,13.133-13.131,34.424,0,47.559   c6.568,6.566,15.174,9.851,23.78,9.851c8.606,0,17.212-3.284,23.779-9.851c13.131-13.135,13.131-34.426,0-47.559   C165.798,118.073,157.192,114.789,148.586,114.789z M155.395,155.228c-2.454,2.454-5.319,2.821-6.809,2.821   c-1.489,0-4.356-0.367-6.808-2.818c-3.755-3.756-3.755-9.867-0.003-13.619c2.455-2.455,5.321-2.822,6.811-2.822   c1.489,0,4.354,0.367,6.808,2.82C159.147,145.363,159.147,151.475,155.395,155.228z" fill="#91DC5A"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
    
    
</body>
</html>

Für Hintergrundbild

        var myimg='url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 296.838 296.838" style="enable-background:new 0 0 296.838 296.838;" xml:space="preserve" width="512px" height="512px"><g><path  d="M58.733,64.566L41.763,47.596C14.832,74.526,0,110.333,0,148.419s14.832,73.893,41.763,100.823l16.971-16.971   C36.335,209.874,24,180.095,24,148.419S36.335,86.964,58.733,64.566z" fill="#91DC5A"/><path d="M82.137,81.969c-17.75,17.748-27.525,41.348-27.525,66.45s9.775,48.702,27.525,66.45l16.971-16.971   c-13.218-13.216-20.496-30.788-20.496-49.479s7.278-36.264,20.496-49.48L82.137,81.969z" fill="#91DC5A"/><path d="M255.075,47.596l-16.971,16.971c22.399,22.397,34.733,52.177,34.733,83.853s-12.335,61.455-34.733,83.852l16.971,16.971   c26.931-26.931,41.763-62.737,41.763-100.823S282.006,74.526,255.075,47.596z" fill="#91DC5A"/><path d="M214.701,81.969L197.73,98.939c13.218,13.216,20.496,30.788,20.496,49.48s-7.278,36.264-20.496,49.479l16.971,16.971   c17.75-17.748,27.525-41.348,27.525-66.45S232.451,99.717,214.701,81.969z" fill="#91DC5A"/><path d="M148.586,114.789c-8.607,0-17.212,3.284-23.78,9.851c-13.131,13.133-13.131,34.424,0,47.559   c6.568,6.566,15.174,9.851,23.78,9.851c8.606,0,17.212-3.284,23.779-9.851c13.131-13.135,13.131-34.426,0-47.559   C165.798,118.073,157.192,114.789,148.586,114.789z M155.395,155.228c-2.454,2.454-5.319,2.821-6.809,2.821   c-1.489,0-4.356-0.367-6.808-2.818c-3.755-3.756-3.755-9.867-0.003-13.619c2.455-2.455,5.321-2.822,6.811-2.822   c1.489,0,4.354,0.367,6.808,2.82C159.147,145.363,159.147,151.475,155.395,155.228z" fill="#91DC5A"/></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></svg> \')';
        
        document.getElementById("mydiv").style.backgroundImage =myimg ;  
        
        
        
        //changing color according to theme .. new theme color :#424242
        myimg=myimg.replace(/#91DC5A/g,"#424242");
       document.getElementById("mydiv").style.backgroundImage =myimg ; 
             div {

  background-size:5em;
  width:5em;
  height:5em;
  
}
<html>
<body>

    
    <div id="mydiv"></div>
<span style="font:14px sans-serif;padding:7px;color:#fff;background:#689d94">
Target color</span>
   
  
    
</body>
</html>
1017560cookie-checkWie berechnet man die erforderliche Farbtondrehung, um eine bestimmte Farbe zu erzeugen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy