特定の色を少し暗くしたり明るくしたりするにはどうすればよいですか?


9

私はこの写真を持っています:

色

矢印は2つの異なる色を示していますが、実際には同じ色であるはずですが、少し明るいまたは暗いはずです。

私が作ったアプリケーションのこのスクリーンショットを作成しました。端の茶色がかった色は、30を合計した青色です。ご覧のように、それはうまくいきません。つまり、実際の色に30を追加しても、すべての場合には機能しません色。

実際の色

特定の色に陰影を付けるにはどうすればいいですか、つまり、明るくしたり暗くしたりできますか?

また、アルファで半透明にしたい場合はどうすればよいですか?


stackoverflowで質問する必要があるため、この質問をトピック外として閉じることに投票します。
joojaa

3
色とシェーディングカラーの背後にある数学について説明し、さまざまな色のバリエーションを生成するため、技術的にはまだグラフィックデザインの問題です。
Vlad

1
いいえ、16進数の変換については説明しません。私は色の問題で大丈夫ですが、あなたはこれをあなたの計算環境に強く拘束しているので、もはやあなたの主張を満足させません。だからあなたはそれをJavaScriptとマークアップのノードリングの質問になるように指定しましたが、それはグラフィックデザインではありません。
joojaa

1
質問に正解はありません。色を暗くしたり明るくしたりするにはどうすればよいですか。16進数値への変換は便利な追加ですが、必須ではありません。
Vlad

1
私は議論するつもりはありません。私は色とそれらがどのように機能するのか理解していません。誰かが私のためにコーディングするコードではなく、「方法」を求めていました。
Vlad

回答:


12

クールな質問。

16進値を扱うには、RGB値の相対的な割合を考える必要があります。

文字ではなく数字のスケールを使用するので、その背後にある数学を確認できます。

あなたがオレンジを持っていると想像してください。

あなたはR255 G128 B0の値を持つことができます

より暗い色が必要な場合は、値をたとえば50%に減らす必要があります。

これにより、R128 G64 B0が得られます。すべての色が比例スケールを使用して変更されていることに注意してください。

より複雑な色はR255 G200 B100にすることができます。前のケースほどではなく、暗くしましょう。80%暗くしましょう。

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

1つの色を明るくするという考え方はほとんど同じですが、色が255でキャップされるため、より注意が必要です。そのため、255と値の違いを考えることができます。

例えば同じオレンジ

R255 G128 B0

Rをもう増やすことはできず、同じ値、たとえば100を使って緑と青を増やすことはできません。

R255 G228 B100

黄色すぎます。

数学は

1) 255と現在の値(R255 G128 B0 の差は、R0 G127 B255です。

2)明るいオレンジを50%作りましょう

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

4)それを初期値に追加します:R255 + 0 G128 + 64 B0 + 128 = R255 G192 B128。

基本的なアイデアを与えるために画像を追加しています。怠惰な作業のためだけに、RGB値は私のテキストと同じではありませんが、オレンジ色の「階段」が本質的な比率を保持していることがわかります。

ここに画像の説明を入力してください

編集済み

私はとても馬鹿です。HSLカラー表記を使用することもできます。

{background-color:hsl(45、60%、70%);}そして、3番目の色を暗い色に、2番目と3番目の色を明るい色に変更します。

hslaバリアントを使用してアルファを含めることもできます。


これがブラウザーである場合の
オフコース

はい、JS /ブラウザアプリケーションです。しかし、JSは#345464形式の色を認識しません。私はparseInt(hashString.replace( '#'、 '')、16);を使用しています。ここで、hashStringは#345464のようなCSS形式の色です。
Vlad

あなたが好きなようにあなたの番号を翻訳します。数字を使用しているので、その背後にある数学を確認できます。しかし、原則は同じです。8はFの半分です
ラファエル

そして、常にrgba(255,128,0,1)表記を使用できます。
Rafael

実際にはCanvas要素を使用していますが、これは純粋なJSであり、CSSは組み込まれていません。しかし、私はこれをコードで解決する方法のアイデアを得ました。
Vlad

2

少し誤解しているかもしれませんが、javaScriptは色を16進数としてモデル化せず、システムもモデル化しません。16進表記は、人間が読めるドキュメント用です。システムは内部的に3つの整数値を格納します。これらを直接クエリして操作できます。

しかし、システム内部ではなく実際のドキュメントを操作したいとだけ言ってください。次に、これを行うライブラリに計算を延期するのが最善です。ブラウザーはさまざまな方法で色を表現できるので、ad rgbやhsv入力など、あらゆる種類のケースをプログラムする必要があります。ですから、Color.jsのようなものを使用することをお勧めします。ブレンド、暗くする、明るくするなどを自分で実装する必要がないため、頭痛が大幅に軽減されます。

Edity:

これを自分で行いたい場合は、お勧めしません。hexarepresentationを整数の数値トリプレットまたは0〜1の範囲の浮動小数点数に変換することから始めます。これにより、計算が容易になります。

色を簡単に操作できるように、RGB値をHSLまたはHSBに変換すると、明るさの計算が簡単になります(Wikipediaに公式があります)。したがって、明度または明るさを加算または減算します。実際の光のシミュレーションでは、計算は光の色にベース色を掛けるだけで十分簡単です。したがって、ニュートラルライトの場合は次のようになります。

結果=強度*色

ラファエルが説明したように、カラーチャンネルによって式が繰り返されます。あなたは色のついた光をシミュレートすることができます

結果=強度* LigtColor *色

これを最初に浮動小数点に変換するために、おそらく線形も。これはあなたの地域に暖かいか涼しい光を与えて、より自然な感じをもたらすことができます。

アルファブレンディング(他の色の上に色を重ねる)は簡単です

結果= ColorTop * alpha + ColorBottom *(1-alpha)

最終編集

最後に、あなたが尋ねたことに対して何かをするいくつかのコードがあります。これが見づらいのは、そのような形の抽象が現在あるからです。ここで利用可能なライブコード

ここに画像の説明を入力してください

画像1:以下のコードの結果は、ライブバージョンも参照してください。

{
  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これのほとんどは実際にはすでにstackoverfowで見つけることができるため、stackoverflowで確認する必要があります。


このライブラリをスタンドアロンにすることはできますか?
Vlad 2016

@Vlad確かに私は理由がないことを確認しません。
joojaa

私は試してみましたが、いくつかのNodeJSモジュールを使用していますが、サードパーティのライブラリでアプリに負荷をかけたくありません。私自身のコードを作ってみます。
Vlad

@Vladが頭皮にコードを追加しました
joojaa

:Dうわー、素晴らしい仕事!
Vlad

1

色を見ることなく、手動で色の濃さ/明るさを変更したい場合。16進数またはRGB では、各チャネルに等しい量の光を追加または減算するだけで、本当に簡単です。
RGBで132,145,167とすると、各数値に30を追加して、同じ色の明るいバージョンを162,175,207にすることができます。もし気づいたら、少しずつそれを行った場合は、それぞれから2を減算して160,173,205にします。16進数と同じですが、16進数です。したがって、e4c3d5はe4 c3 d5です。16を追加するとf4d3e5が明るくなり、16を減算すると同じ色のd4b3c5が暗いバージョンになります。
3つすべてのチャネル(3つすべての数値)に同じ量を追加する限り、必要なだけ追加または減算することができ、追加および減算する適切な量を推測するのに優れています。混合物に追加または削除する白が多い。


涼しい!これは非常に簡単で、コーダー以外のユーザーにとっても役立ちました。
ブルックダンサー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.