2

ASコードに次の設定があるとします。

var color:String = "#0000FF"; //blue
var alpha:Number = 42; //42% or 42/100

それらをどのように組み合わせて#RRGGBBAA16進色にしますか?私はグーグルで調べて、運がなくても16進変換と表記法を理解しようとしてきました。

4

2 に答える 2

8

これを行うには 2 つの方法があります。1 つは、int のtoString()メソッドを使用し、基数/基数として 16 を渡す、少しハックです。

var rgb:int = (int)("#0000FF".replace("#","0x"));//convert the string to a int (note you can type hex ints starting with 0x (e.g. 0x0000FF)
var a:int = 42;
var rgba:int = int("0x"+rgb.toString(16) + a.toString(16));

または、ビット単位の演算子を使用したハックが少なく、おそらくより高速な計算方法:

var rgb:uint = (uint)("#0000FF".replace("#","0x"));
//extract components using bit shifting (>>) and masking (0xFF)
var r:uint = rgb >> 16 & 0xFF;
var g:uint = rgb >>  8 & 0xFF;
var b:uint = rgb >>  0 & 0xFF;//same as rgb >> 0xFF, just added >> 0 to make the shift obvious
var a:uint = 42;
var rgba:uint = r << 24 | g << 16 | b << 8 | a;
var argb:uint = a << 24 | r << 16 | g << 8 | b;
//test
trace(rgba.toString(16));
trace(argb.toString(16));

上記のトレースでの使用toString(16)は、私たち人間に役立つようにするためのものであることに注意してください。

また、たとえばBitmapDataを操作する場合など、 as3 で ARGB を使用したい場合があることに注意してください。

addChild(new BitmapData(100,100,true,0x2a0000ff));//add a 42% transparent blue box (100x100 px)

アップデート

上記の bitshift コード スニペットは、実際には RGB 抽出を詳細に説明しているため、理解が深まりますが、既に RGB があるため、アルファ コンポーネントを追加するだけです。また、0 から 255 のスケールと同じではない 42% について言及しました。したがって、あなたの答えは次のとおりです。

var rgb:uint = (uint)("#0000FF".replace("#","0x"));
var   a:uint = (uint)((42 * .01) * 255);//map 42 from 0<>100 to 0<>255 ( *.01 is the same as / 100 but faster
var rgba:uint = rgb << 8 | a;
var argb:uint = a << 24 | rgb;

速度に関しては、2 つの異なる変換メソッドを 100 万回実行した場合の実行時間は次のとおりです。

using strings (var rgba:int = int("0x"+rgb.toString(16) + a.toString(16));) takes 851 ms 
using bitwise ops (var rgba:uint = rgb << 8| a;) takes 3 ms

あなたができるように、ビット単位のバージョンははるかに高速であり、あなたのケースでは文字列バージョンよりもさらに冗長ではありません. また、ビット単位の演算子を理解したので、おそらく読みやすく、理解しやすくなっています。

結論は:

var color:String = "#0000FF"; //blue
var alpha:Number = 42; //42% or 42/100
var rgb:uint = (uint)(color.replace("#","0x"));
var   a:uint = (uint)((alpha * .01) * 255);
var rgba:uint = rgb << 8 | a;
trace("hex: #",rgba.toString(16),"test",0x0000ff6b.toString(16));

また、検索を使用して hex に変換できるため、Googleについて言及したのは面白いです。

更新: 少し混乱しているように見えるので、3 つのステップを関数に分割しました。

  1. 16 進文字列を int に変換する
  2. アルファ パーセンテージ (0-100) を 0-255 int に変換する
  3. 上記を連結

次のようになります。

function getHex(hexStr:String):uint{
    return (uint)(hexStr.replace("#","0x"));
}
function getHexAlpha(alpha:uint):uint{
    return (uint)((alpha * .01) * 255);
}
function rgbaConcat(rgb:uint,a:uint):uint{
    return rgb << 8 | a;
}
trace("test",rgbaConcat(getHex("#FF9900"),getHexAlpha(50)).toString(16));

または一度にすべて:

function rgbaConcat(hexStr:String,alpha:uint):uint{
    var rgb:uint = (uint)(hexStr.replace("#","0x"));
    var a:uint = (uint)((alpha * .01) * 255);
    return (rgb << 8 | a);
}
trace("test",rgbaConcat("#123456",100).toString(16));
于 2012-10-18T04:04:47.603 に答える
2

アクション スクリプトで sprintf などを使用できるかどうかはわかりませんが、次のようなものを使用します。

var alpha_2:int = Math.round(255*alpha/100);
var rgba:String = sprintf("%s%2x", color, alpha_2);

ちなみに、それが想定されているかどうかを必ず確認してください#RRGGBBAA#AARRGGBB

明らかに sprintf は利用できません。Is there something like printf in Action Script 3? に記載されているように、代替手段を使用できます。

printf のような関数を使用したくない場合は、次を使用できます。

function hex_char(value:int) {
  if (value < 0)
    return "X";
  if (value < 10)
    return String.fromCharCode("0".charCodeAt(0)+value);
  if (value < 16)
    return String.fromCharCode("A".charCodeAt(0)+value-10);
  return "X";
}

var alpha_2:int = Math.round(255*alpha/100);
var rgba:String = color + hex_char(alpha_2/16) + hex_char(alpha_2%16);

代わりに、次の定義を使用することもできますhex_char(私が推測する) では、以下の値に対して例外/エラーが発生し0ます15"X"

function hex_char(value:int) {
  return "0123456789ABCDEF".charAt(value);
}
于 2012-10-18T03:14:14.643 に答える