RGB値が与えられた場合、色合い(またはシェード)をどのように作成しますか?


124

のようなRGB値が与えられた場合168, 0, 255、色の濃淡(明るくする)と色合い(暗くする)を作成するにはどうすればよいですか?

回答:


153

シェーディングとティントのいくつかのオプションの中で:

  • シェードの場合は、各コンポーネントに前の値の1 / 4、1 / 2、3 / 4などを掛けます。係数が小さいほど、色合いは暗くなります。

  • 濃淡については、(255-以前の値)を計算し、その値に1 / 4、1 / 2、3 / 4などを掛けて(係数が大きいほど、色合いが明るくなります)、それを以前の値に追加します(それぞれを想定) .componentは8ビット整数です)。

色の操作(ティントやその他のシェーディングなど)は線形RGBで行う必要があることに注意してください。ただし、ドキュメントで指定された、または画像やビデオでエンコードされたRGBカラーは、線形RGBである可能性は低く、その場合、いわゆる逆伝達関数を RGBカラーの各コンポーネントに適用する必要があります。この関数は、RGB色空間によって異なります。たとえば、sRGBカラースペース(RGBカラースペースが不明の場合に想定される)では、この関数は各sRGBカラーコンポーネント(0から1の範囲)を2.2の累乗に上げるのとほぼ同じです。(「線形RGB」はRGB色空間ではないことに注意してください。)

「ガンマ補正」に関するViolet Giraffeのコメントも参照してください。


20
私はこれを試してみましたが、うまくいきました。数式の例を書くと参考になると思いました。オリジナル(r、g、b); シェード(RS、GS、BS) 、rs = r * 0.25gs = g * 0.25bs = b * 0.25これはかなり暗いシェードです)。色合い(RT、GT、BT) 、rt = r + (0.25 * (255 - r))gt = g + (0.25 * (255 - g))bt = b + (0.25 * (255 - b))これはかなり軽い色合いです)。多くの色相を作成するクールな配列の一部としてそれを行い、それはうまくいきました。お役に立てば幸いです。ピーターに感謝します。
トーマス

1
あなたは間違いを犯しました。それは逆です。
Francesco Menzani 2014

これらの操作はガンマ補正を考慮してはいけませんか?
バイオレットキリン

1
@VioletGiraffe:あなたはガンマ補正で良い点を作ります。私の編集を参照してください。(これは、22時間前に削除された私のコメントを置き換えます。)
Peter O.

97

いくつかの定義

  • シェードは、色相を「暗く」又は「黒添加」により製造されます
  • 色合いは色合いを「ligthening」または「白添加」により製造されます

ティントまたはシェードを作成する

お使いのカラーモデルに応じて、より暗い(網掛け)またはより明るい(色合い)色を作成する方法はいくつかあります。

  • RGB

    • シェーディングするには:

      newR = currentR * (1 - shade_factor)
      newG = currentG * (1 - shade_factor)
      newB = currentB * (1 - shade_factor)
      
    • 色合いを付けるには:

      newR = currentR + (255 - currentR) * tint_factor
      newG = currentG + (255 - currentG) * tint_factor
      newB = currentB + (255 - currentB) * tint_factor
      
    • より一般的には、色RGB(currentR,currentG,currentB)と色を重ね合わせる結果の色RGBA(aR,aG,aB,alpha)は次のとおりです。

      newR = currentR + (aR - currentR) * alpha
      newG = currentG + (aG - currentG) * alpha
      newB = currentB + (aB - currentB) * alpha
      

    どこ(aR,aG,aB) = black = (0,0,0)シェーディングのため、および(aR,aG,aB) = white = (255,255,255)着色のために

  • HSVまたはHSB

    • 日陰にする:Value/を下げるか、BrightnessまたはSaturation
    • 色合いを付ける:/を下げるSaturationか、Value/Brightness
  • HSL
    • シェーディングするには: Lightness
    • 色合いを付ける: Lightness

あるカラーモデルから別のカラーモデルに変換する数式が存在します。最初の質問のとおり、たとえば、モデルをRGB使用してシェーディングHSVするHSV場合は、に変換し、シェーディングを実行して、に戻すことができRGBます。変換する式は簡単ではありませんが、インターネットで見つけることができます。言語によっては、コア関数として使用できる場合もあります。

モデルの比較

  • RGB 実装が本当に簡単であるという利点がありますが、
    • あなたは相対的にあなたの色をシェーディングまたはティントすることができるだけです
    • あなたの色がすでに色付けされているか、シェーディングされているかどうかはわかりません
  • HSVまたは、HSB必要なものを取得するために2つのパラメーターを使用する必要があるため、複雑なものになります(SaturationValue/ Brightness
  • HSL 私の観点からは最高です:
    • CSS3でサポート(webapp用)
    • シンプルで正確:
      • 50% 変更されていない色相を意味します
      • >50% 色相が明るい(色合い)ことを意味します
      • <50% 色相が暗い(濃い)ことを意味します
    • 与えられた色を使用して、それがすでに着色またはシェーディングされているかどうかを判断できます
    • Lightnessパーツを交換するだけで)比較的または絶対的に色を濃くしたり濃淡を付けたりできます


1
私はここで「色合いは、色相を「暗くすること」によって生成される」と信じています。HSL / HSVのように色相について話している場合、色相を変更すると、色合いや色合いではなく、異なる色が生成されるためです。色相(0〜360°)だけでは、暗くなったり明るくなったりすることはできません。色合い/色合いを与えるには、SL / SV値を変更する必要があります。この定義は、色相を変更すると暗い/明るい色が生成されると考えるように誰かを誤解させるかもしれません。
akinuri

シェードバージョンは、0から始まる色範囲でのみ機能します。色範囲の半分をカラーチャネル値に追加してから、計算を行ってから、その範囲を再度減算します。あなたの色が署名されていて、オーバーフローのために何かを破壊することなく計算を行うことができる場合、これは意図したとおりに機能します。
t0b4cc0 2018年

3

現在、キャンバスとピクセルを実験しています...このロジックがうまく機能していることがわかりました。

  1. これを使用して、グレーネスを計算します(輝度?)
  2. ただし、既存の値と新しい「色合い」値の両方
  3. 差を計算します(乗算する必要がないことがわかりました)
  4. 「色合い」値をオフセットするために追加

    var grey =  (r + g + b) / 3;    
    var grey2 = (new_r + new_g + new_b) / 3;
    
    var dr =  grey - grey2 * 1;    
    var dg =  grey - grey2 * 1    
    var db =  grey - grey2 * 1;  
    
    tint_r = new_r + dr;    
    tint_g = new_g + dg;   
    tint_b = new_b _ db;
    

またはそのようなもの...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.