Come rendere un determinato colore un po 'più scuro o più chiaro?


9

Ho questa immagine:

colori

Le frecce mostrano due colori diversi ma in realtà dovrebbero essere dello stesso colore ma un po 'più chiari o più scuri.

Ho realizzato questa schermata dell'applicazione che faccio e il colore brunastro sui bordi è solo il colore blu sommato a 30. Come puoi vedere, non fa il trucco, cioè aggiungere 30 al colore effettivo non funzionerà per tutti colori.

colori reali

Come posso solo sfumare un determinato colore, cioè renderlo più luminoso o più scuro?

Inoltre cosa devo fare se voglio che appaia semitrasparente con l'alfa?


Sto votando per chiudere questa domanda come fuori tema perché dovrebbe essere posta su StackOverflow.
joojaa,

3
Tecnicamente è ancora una domanda di progettazione grafica poiché discutiamo di matematica dietro colori e colori di ombreggiatura, producendo diverse varianti di colori.
Vlad

1
no parliamo di conversione esadecimale. Starei bene con una domanda a colori ma tu l'hai legato così fortemente al tuo ambiente di calcolo che non soddisfa più la tua richiesta. Quindi lo hai specificato per diventare una domanda di nodeling javascript e markup e che non è graphic design.
joojaa,

1
No la domanda dice bene, cosa devo fare per rendere un colore più scuro o più luminoso. La conversione in valore esadecimale è un'aggiunta utile ma non una necessità.
Vlad

1
Non ho intenzione di discutere. Non capisco i colori e come funzionano, stavo chiedendo un "come fare", non un pezzo di codice che qualcuno codificherà per me.
Vlad,

Risposte:


12

Bella domanda.

Per lavorare con valori esadecimali è necessario pensare in termini di proporzione relativa dei valori RGB.

Userò una scala in numeri, non con lettere, così possiamo vedere la matematica dietro di essa.

Immagina di avere un'arancia.

Puoi avere un valore di R255 G128 B0

Se si desidera un colore più scuro, è necessario ridurre i valori, ad esempio al 50%

Questo ti darà R128 G64 B0 Notare che tutti i colori sono stati modificati usando una scala proporzionale.

Un colore più complesso potrebbe essere R255 G200 B100 Scuriamolo, ma non tanto quanto il caso precedente. Cerchiamo di scurirlo dell'80%.

R255x0,8 G200x0,8 B100x0,8 = R204 G160 B80

Per rendere un colore più chiaro l'idea è più o meno la stessa, ma è più complicata perché i colori saranno a 255, quindi puoi pensare alla differenza tra i 255 e i tuoi valori.

Ad esempio la stessa arancia

R255 G128 B0

Non puoi più aumentare R e non puoi aumentare il Verde e il Blu con gli stessi valori, ad esempio 100 in più, perché avrai

R255 G228 B100

che è troppo giallo.

Sarebbe la matematica

1) La differenza da 255 al valore corrente (R255 G128 B0) è: R0 G127 B255

2) Facciamo un'arancia più chiara del 50%

3) Rx50% Gx50% Bx50% = R0 G64 B128

4) Aggiungilo al tuo valore iniziale: R255 + 0 G128 + 64 B0 + 128 = R255 G192 B128.

Sto aggiungendo un'immagine per darti l'idea di base. I valori RGB non sono gli stessi del mio testo, solo perché un lavoro pigro, ma puoi vedere che le "scale" arancioni mantengono le sue proporzioni intrinseche.

inserisci qui la descrizione dell'immagine

Modificato

Sono così stupido Puoi anche usare la notazione Colore HSL:

{background-color: hsl (45, 60%, 70%);} e modifica il terzo colore per i colori più scuri e il secondo e il terzo per quelli più chiari.

Puoi anche usare una variante hsla per includere l'alfa.


Offcourse se questo è un browser è completamente in grado di calcolarlo per te
joojaa

Sì, un'applicazione JS / browser. Ma Js non riconosce il colore formulato # 345464. Uso parseInt (hashString.replace ('#', ''), 16); dove hashString è un colore formattato CSS come # 345464.
Vlad,

Traduci i tuoi numeri come preferisci. Ho detto che stava usando i numeri in modo da poter vedere la matematica dietro di esso. Ma il principio è lo stesso. 8 è la metà di F.
Rafael,

E puoi sempre usare la notazione rgba (255,128,0,1).
Rafael,

In realtà io uso l'elemento Canvas ed è puro JS, senza CSS inculded. Ma ho avuto un'idea di come risolverlo con il codice.
Vlad,

2

Hai frainteso un po 'le cose, javaScript non modella il colore come esadecimale, né il sistema. La notazione esadecimale è solo per il documento leggibile dall'uomo. Internamente il sistema memorizza tre valori interi. Puoi interrogarli e manipolarli direttamente.

Ma diciamo solo che vuoi manipolare il documento reale invece che gli interni del sistema. Quindi è meglio rimandare il tuo calcolo a qualche libreria che lo fa per te. Vedete che il browser può rappresentare i colori in molti modi, quindi è necessario programmare tutti i tipi di casi come input ad rgb e hsv. Quindi ti suggerisco di usare qualcosa come Color.js che ti fa risparmiare un sacco di mal di testa, poiché non è necessario implementare da solo il blending, l'oscuramento, il schiarimento ecc ....

Edity:

Nel caso tu voglia farlo da solo, cosa che non ti consiglio. Inizia trasformando la rappresentazione esadecimale in terzine numeriche di numeri interi o in virgola mobile nell'intervallo 0-1, questo semplifica il calcolo.

Ora, per una facile manipolazione dei valori RGB di conversione del colore in HSL o HSB, ciò rende banali i calcoli della luminosità (Wikipedia ha formulazioni). Quindi basta aggiungere o sottrarre leggerezza o luminosità. Per la simulazione della luce reale, il calcolo è abbastanza semplice: basta moltiplicare il colore della luce per il colore di base. Quindi per la luce neutra è semplicemente:

Risultato = Intensità * Colore

Come spiegato da Rafael, formula ripetuta per canale di colore. Puoi simulare la luce colorata facendo

Risultato = Intensità * LigtColor * Colore

Per questo meglio convertire prima in float, forse anche lineare. Ciò consente una luce calda o fredda sulla tua zona che può dare una sensazione più naturale.

La fusione alfa (strato di colore sopra l'altro) è semplicemente

Risultato = ColorTop * alpha + ColorBottom * (1-alpha)

Modifica finale

Finalmente ecco un codice che fa qualcosa per quello che chiedi. La ragione per cui questo è difficile da vedere è che il suo tipo di astratto in forma in questo momento. Codice live disponibile qui

inserisci qui la descrizione dell'immagine

Immagine 1 : risultato del codice qui sotto vedi anche la versione live .

{
  var canvas = document.getElementById('canvas');
  if (canvas.getContext) {
    var ctx = canvas.getContext('2d');

    var Color = function(r, g, b) {
      this.r = r;
      this.g = g;
      this.b = b;
    }
    Color.prototype.asHex = function() {
      return "#" + ((1 << 24) + (this.r << 16) + (this.g << 8) + this.b).toString(16).slice(1);
    }
    Color.prototype.asRGB = function() {
      return 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')';
    }
    Color.prototype.blendWith = function(col, a) {
      r = Math.round(col.r * (1 - a) + this.r * a);
      g = Math.round(col.g * (1 - a) + this.g * a);
      b = Math.round(col.b * (1 - a) + this.b * a);
      return new Color(r, g, b);
    }
    Color.prototype.Mul = function(col, a) {
      r = Math.round(col.r/255 * this.r * a);
      g = Math.round(col.g/255 * this.g * a);
      b = Math.round(col.b/255 * this.b * a);
      return new Color(r, g, b);
    }
    Color.prototype.fromHex = function(hex) {
      // http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
      hex = hex.substring(1,7)
      var bigint = parseInt(hex, 16);
      this.r = (bigint >> 16) & 255;
      this.g = (bigint >> 8) & 255;
      this.b = bigint & 255;
    }

    ctx.font = "16px Arial";
    ctx.fillText("Manual Alpha Blend", 18, 20);

    var a = new Color(220, 0, 150);

    var b = new Color();
    b.fromHex('#00C864');

    //Alpha blend
    ctx.fillStyle = a.asHex();
    ctx.fillRect(25, 25, 100, 100);
    ctx.fillStyle = '#FFFFFF';
    ctx.fillText(a.asHex(), 30, 45);
    ctx.fillStyle = b.asRGB()
    ctx.fillRect(50, 50, 100, 100);
    ctx.fillStyle = '#FFFFFF';
    ctx.fillText(a.asHex(), 55, 145);
    var bl = a.blendWith(b, 0.3);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(50, 50, 75, 75);
    ctx.fillStyle = '#FFFFFF';
    ctx.fillText(bl.asHex(), 55, 70);

    // lighten 1

    ctx.fillStyle = '#000000';
    ctx.fillText('Neutral Light', 200, 20);

    var c = new Color(100, 100, 100);
    var purelight= new Color(255, 255, 255);

    ctx.fillStyle = c.asRGB();
    ctx.fillRect(200, 25, 100, 100);

    var bl = c.Mul(purelight,1.2);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(225, 50, 100, 100);

    var bl = c.Mul(purelight, 0.8);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(250, 75, 100, 100);

     // lighten 2

    ctx.fillStyle = '#000000';
    ctx.fillText('Yellowish Light', 400, 20);

    var c = new Color(100, 100, 100);
    var yellowlight= new Color(255, 255, 220);

    var bl = c.Mul(yellowlight,1.0);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(400, 25, 100, 100);

    var bl = c.Mul(yellowlight,1.2);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(425, 50, 100, 100);

    var bl = c.Mul(yellowlight, 0.8);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(450, 75, 100, 100);
  }
}

PS, dovresti chiedere su StackOverflow poiché la maggior parte di questo può essere già trovata su StackOverFow.


Questa libreria può essere autonoma?
Vlad,

@Vlad sicuramente non vedo motivo per cui no.
joojaa,

L'ho provato, utilizza alcuni moduli NodeJS, ma non voglio appesantire app su librerie di terze parti. Proverò a creare il mio codice.
Vlad,

@Vlad ha aggiunto del codice per il cuoio capelluto
joojaa,

: D wow, lavoro fantastico!
Vlad

1

Manualmente se si desidera modificare manualmente l'oscurità / luminosità di un colore e senza nemmeno guardarlo. in esadecimale o rgb è davvero facile aggiungere o sottrarre una quantità uguale di luce a ciascun canale.
Diciamo che in rgb hai 132.145.167 che puoi aggiungere 30 a ciascun numero per ottenere una versione più leggera dello stesso colore, quindi 162.175.207, e se ti rendi conto di averlo fatto per un po ', sottrai 2 da ciascuno, quindi 160.173.205. Lo stesso con esadecimale ma in numeri esadecimali. quindi e4c3d5 è e4 c3 d5 puoi aggiungere 16 per renderlo più leggero f4d3e5 o sottrarre 16 per rendere la versione più scura dello stesso colore d4b3c5.
Puoi aggiungere o sottrarre quanto vuoi e migliorerai nell'indovinare l'importo giusto per aggiungere e sottrarre gli straordinari, purché aggiungi lo stesso ammontare a tutti e tre i canali (tutti e tre i numeri) cambierai solo il come molto bianco aggiungi o rimuovi dalla miscela.


Freddo! Questo è stato così facile e utile per un non programmatore!
brookdancer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.