【JavaScript】 RGBAを下地を考慮してRGBに変換する
更新日:2022/07/08
考え方
RGBAは、赤(R)緑(G)青(B)透明度(A)を意味しています。
赤青緑は、0から255の整数値をとります。
透明度は0から1の小数で、100倍するとパーセントと考えることができます。
ただし、0から255の整数値で表されていることがあります。
この場合は255で割り、小数化します。
透明度0は、完全に透明な状態です。
1は、完全に不透明な状態です。
透明度1は100%という意味なのに、完全に不透明なのは違和感がありますね。
意味合い的には不透明度の方が合っているかもしれませんが、あまり気にしない方がよさそうです。
下地と透明度を考慮して、赤青緑の色値を変換するときは、次の式を使用します。
変換式
変換後色値 = 変換前色値 × 透明度 + ( 1 - 透明度 ) × 下地色値
透明度が1なら、下地に0が掛け算され、変換前の色値がそのまま残ります。
0なら、下地がそのまま残ります。
0より大きくて1より小さいときは、その割合に応じて下地と変換前色が合成されます。
コード例
次の条件で、RGBAをRGBに変換する関数を作成してみます。
- 引数はRGBA各値を、配列にしたもの
- A値は、0から255で表現されている
- 下地は、白(R255,G255,B255)
RGBAからRGB変換関数例
const RGBAtoRGB = ( RGBA_Array ) =>{
const [r,g,b,a] = RGBA_Array;
if( a === 0 ) return [255,255,255];
const opacity = a / 255;
const cb = Math.round(b * opacity + 255 * ( 1 - opacity));
const cg = Math.round(g * opacity + 255 * ( 1 - opacity));
const cr = Math.round(r * opacity + 255 * ( 1 - opacity));
return [cr,cg,cb];
};
更新日:2022/07/08
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。