クラスの例を作ったので貼っておきます。
カラーピッカーとかで使ってるアルゴリズムをゲームとかで使う関係で修正しました。
下手っぴですが、必要な部分だけ持ってくなり使うなり自由にしてください。
/*
* ColorSet
*
* 色の管理と、カラーコード⇔RGB分解⇔HSV分解を自動で行います。
*
* HSVは本来はHSB(Brightness)とすべきですが、bがBlueと被るためv(Value)としてあります。
* この表記はわりと一部で使用されているもので、WikiPedia等はHSVと表記しています。
* HSBとHSVはまったく同じ意味です。
*
* HSVの最大値はPhotoShopにあわせて、360、100、100となっています。
* RGBはFlashの標準で255、255、255です。
* cはRGBを統合したカラーコードですが、整数のみ返す仕様なので、
* HSV、RGBに対して小数点以下で誤差が発生することがあります。
*
* RGBが入力された時は直ちにHSVを計算せず、HSVが呼び出されるまでズレた状態になります。
* これはHSVを使用しない場合に、計算量を抑えるためです。
*
* @version 0.9
* @author しっぽ
*
*/
class ColorSet
{
static private var _RGB_MAX:Number = 255;
static private var _H_MAX:Number = 360;
static private var _SV_MAX:Number = 100;
private var _r:Number = 255; // 赤色 0~255
private var _g:Number = 255; // 緑色 0~255
private var _b:Number = 255; // 青色 0~255
private var _h:Number = 0; // 色相 0~360
private var _s:Number = 0; // 再度 0~100
private var _v:Number = 100; // 明度 0~100
private var _rightnessHSV:Boolean = true; // RGBとHSVが同じ値をとっているかのフラグ。違う場合RGB優先。
function ColorSet(arg_1:Object, arg_g:Number, arg_b:Number){
if (arguments.length == 1){ // 値が1つの場合はカラーコードと考える。
c = arguments[0];
}else if (arguments.length == 3){ // 3つの値ならRGB
_r = Number(arguments[0]);
_g = arguments[1];
_b = arguments[2];
}else{ c = 0xffffff;} // 値が無い場合とかは白
_rightnessHSV = false;
}
// RGB 普通の変数として使える。
function get r():Number{ return _r;}
function set r(arg:Number){
_r = Math.min(Math.max(0, arg), _RGB_MAX);
_rightnessHSV = false;
}
function get g():Number{ return _g;}
function set g(arg:Number){
_g = Math.min(Math.max(0, arg), _RGB_MAX);
_rightnessHSV = false;
}
function get b():Number{ return _b;}
function set b(arg:Number){
_b = Math.min(Math.max(0, arg), _RGB_MAX);
_rightnessHSV = false;
}
// カラー。 RGBの変動で自動的に変わる。
function get c():Number{
// RGBから統合。四捨五入をするので誤差あり。
return Math.round(_r)*0x10000 + Math.round(_g)*0x100 + Math.round(_b);
}
function set c(arg_c:Number){
arg_c = Math.min(Math.max(0, arg_c), 0xffffff);
// RGBに分割。
_r = Math.floor(arg_c / 0x10000);
_g = Math.floor(arg_c / 0x100) % 0x100;
_b = arg_c % 0x100;
_rightnessHSV = false;
}
// HSV 呼び出された時にRGBとズレていれば計算し、そうでない場合は保存してある値を返す。
function get h():Number{
if (!_rightnessHSV) calcHSV();
return _h;
}
function set h(arg:Number){
if (!_rightnessHSV) calcHSV();
_h = (arg % _H_MAX + _H_MAX) % _H_MAX;
calcRGB();
}
function get s():Number{
if (!_rightnessHSV) calcHSV();
return _s;
}
function set s(arg:Number){
if (!_rightnessHSV) calcHSV();
_s = Math.min(Math.max(0, arg), _SV_MAX);
calcRGB();
}
function get v():Number{
if (!_rightnessHSV) calcHSV();
return _v;
}
function set v(arg:Number){
if (!_rightnessHSV) calcHSV();
_v = Math.min(Math.max(0, arg), _SV_MAX);
calcRGB();
}
// HSVから入力された時にRGBを計算する。
private function calcRGB(){
if (_s == 0){ // 無彩色
_r = _g = _b = _v*_RGB_MAX/_SV_MAX;
}else{
var hi:Number = Math.floor(_h / (_H_MAX / 6)) % 6;
var f:Number = _h / (_H_MAX / 6) - hi;
var p:Number = _v / _SV_MAX * ( 1 - _s / _SV_MAX );
var q:Number = _v / _SV_MAX * ( 1 - _s / _SV_MAX * f);
var t:Number = _v / _SV_MAX * ( 1 - _s / _SV_MAX * ( 1 - f));
switch (hi) {
case 0 :
_r = _v/_SV_MAX; _g = t; _b = p;
break;
case 1 :
_r = q; _g = _v/_SV_MAX; _b = p;
break; ;
case 2 :
_r = p; _g = _v/_SV_MAX; _b = t;
break;
case 3 :
_r = p; _g = q; _b = _v/_SV_MAX;
break;
case 4 :
_r = t; _g = p; _b = _v/_SV_MAX;
break;
case 5 :
_r = _v/_SV_MAX; _g = p; _b = q;
break;
}
_r *= _RGB_MAX;
_g *= _RGB_MAX;
_b *= _RGB_MAX;
}
_rightnessHSV = true;
}
// RGBから入力された時にHSVを計算する。
private function calcHSV(){
var maxRGB = Math.max(_r, Math.max(_g, _b));
var difference = maxRGB - Math.min(_r, Math.min(_g, _b));
if (maxRGB == 0){ // 最大値が0。つまり黒。
_v = 0; // V以外の値は元の値を維持する。
}else if (difference == 0){ // 全ての色が均一。つまり無彩色
_v = maxRGB * _SV_MAX / _RGB_MAX;
_s = 0; // Hは未定義になるため元の値を維持する。
}else{ // 普通の色。
_v = maxRGB * _SV_MAX / _RGB_MAX;
_s = (difference / maxRGB)*_SV_MAX;
if (maxRGB == _r) _h = ((_g - _b)/difference + 0)*_H_MAX/6;
else if (maxRGB == _g) _h = ((_b - _r)/difference + 2)*_H_MAX/6;
else _h = ((_r - _g)/difference + 4)*_H_MAX/6;
_h = (_h % _H_MAX + _H_MAX)%_H_MAX;
}
_rightnessHSV = true;
}
// 文字列変換
function toString():String{
if (!_rightnessHSV) calcHSV();
return "color:" + colorCode + "(" + _r + ", " + _g + "," + _b +")(" + _h + ", " + _s + "," + _v + ")";
}
// カラーコードを文字列で返す
function get colorCode():String{
var ans = c.toString(16);
var zero = "";
for (var i = 0; i < 6 - ans.length; i++) zero += "0";
return zero + ans;
}
/*
* カラーコードを文字列で入力する。#とか0xとかいうのも消してくれる。
* あと、f0aみたいな3文字を、ff00aaと解釈。
* fa03のような場合は00fa03と解釈。
*/
function set colorCode(arg:String){
arg = arg.split("#").join("");
arg = arg.split("0x").join("");
if (arg.length == 3){
arg = arg.substr(0, 1) + arg.substr(0, 1)
+ arg.substr(1, 1) + arg.substr(1, 1)
+ arg.substr(2, 1) + arg.substr(2, 1);
}
c = parseInt(arg, 16);
}
static function get RGB_MAX():Number{ return _RGB_MAX;}
static function get H_MAX():Number{ return _H_MAX;}
static function get SV_MAX():Number{ return _SV_MAX;}
バグとかあっても責任は負いません。
2.0が分からない人は、上の部分を全部コピーしてColorSet.asという名前で.flaファイルと同じ場所に保存して下さい。
分かる人は適当にパッケージつけるか、まあ、改造するとか、好きにどうぞ。
trace(testcolor.r); // 255;
trace(testcolor.h); // 0;
testcolor.h = 60; // 色相を60にする(色相60は黄色)
trace(testcolor.colorCode); //ffff00
こんな感じに使えます。
変数、r、g、b がそれぞれ、赤緑青の要素で最大255
変数、h、s、v がそれぞれ、色相、彩度、明度で、色相は最大360、彩度明度は最高100です。
変数、cで普通のカラーコードを返し、colorCodeでは文字列のカラーコードを返します。
変数に値を入力すると別の変数も全て影響を受けて変化します。
なので、入れた変数の彩度だけ変更してカラーコードを返す、みたいな使い方ができます。
HSV(HSB)って何って人はここらへんに説明があります。
凄く関係ないけど、今までこうやってブログに貼り付けてる人の見て
みんな難しそうなの作るなーとか思ってたんだけど
自分のブログに貼り付けたらなんか元のより5割増しくらいに難しく見えるw
エディタって大切だね。
コメント
1836 投稿者: Teena Howell (2007年09月03日 01:08)
spawneater supranormal unparrel yurucare nonapparent chitter nonconvertible mermithized
http://www.angelfire.com/aoyobu/2.html >am
http://www.angelfire.com/aoyobu/1.html
しっぽのブログ