×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
会社の貸与PCにとうとうEclipse入れてまった。もう後には引けない・・・!と言いつつも、ASは楽しすぎるのでSJC-Pの受験勉強は一向に進みません。
さて、今日は2つのARGBカラーの中間の値を求める方法を考えていました。
さて、今日は2つのARGBカラーの中間の値を求める方法を考えていました。
正攻法で行くなら、2つのuint値についてARGBそれぞれのチャネルに分解して、得られた4組のuintについて足して2で割る、といったところでしょうか。
先に足してしまうとオーバーフローしてしまうので、先にそれぞれ1ビット右にシフトして、それから足してやればうまくいきそうです。
でも考えてみれば、それぞれの引数の各チャネルのバイト値がともに奇数のときだけ、戻り値の対応するチャネルについて1を足してあげればいいだけ、ですね。( 1 + 1 ) >>> 1 = 1 というわけです。で、改良。
フェフェフェフェ法と名づけよう。
function averageOfColors(c1:uint, c2:uint):uint{
var argb1:Array = [];
var argb2:Array = [];
argb1[0] = c1 >>>24;
argb1[1] = (c1 & 0x00ff0000) >>> 16;
argb1[2] = (c1 & 0x0000ff00) >>> 8;
argb1[3] = c1 & 0x000000ff;
//以下 argb2も同様
var a: uint = (argb1[0] + argb2[0])>>>1;
//以下 r,g,bについて同様
return (a<<24)|(r<<16)|(g<<8)|b;
}
実に、長ったらしいったらないですね。では各チャネルに分解せずに計算出来ないもんでしょうか。 先に足してしまうとオーバーフローしてしまうので、先にそれぞれ1ビット右にシフトして、それから足してやればうまくいきそうです。
function averageOfColors2(c1:uint, c2:uint):uint{
//まず各チャネルのバイト値を偶数にする
c1 &= 0xfefefefe;
c2 &= 0xfefefefe;
//すると1ビットシフトさせても別のチャネルに影響しない
c1 >>>= 1;
c2 >>>= 1;
//各チャネルは127以下なので普通に足しても255を超えない
return c1 + c2;
}
チャネルを分解する方だと足し算が4回行われているので、足し算が最後の1回になった上の方法は随分高速になるはず。ただ、最下位ビットを落としたために、戻り値の各チャネルは254までしか出力できません。 でも考えてみれば、それぞれの引数の各チャネルのバイト値がともに奇数のときだけ、戻り値の対応するチャネルについて1を足してあげればいいだけ、ですね。( 1 + 1 ) >>> 1 = 1 というわけです。で、改良。
function averageOfColors3(c1:uint, c2:uint):uint{
//各チャネルがともに奇数なら0x01がセットされる
var odd:uint = c1 & c2 & 0x01010101;
//各チャネルのバイト値を偶数にする
c1 &= 0xfefefefe;
c2 &= 0xfefefefe;
//1ビットシフトさせても別のチャネルに影響しない
c1 >>>= 1;
c2 >>>= 1;
//c1,c2の各チャネルは127以下なので足し合わせて更に1を加えても255を超えない
return c1 + c2 + odd;
}
足し算が一回増えてしまいましたが、各チャネルに分解するよりは随分スッキリとしたコードになりましたね。フェフェフェフェ法と名づけよう。
PR
この記事にコメントする
26歳のハローワールド
カレンダー
| 10 | 2025/11 | 12 |
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
最新記事
(05/23)
(05/11)
(05/09)
(05/08)
(05/08)
(03/07)
(02/25)
(02/07)
(02/07)
(01/28)
最新コメント
[11/27 gyzwviyehl]
[11/18 Tepexaxyonelo]
[09/12 gomFolley]
[08/16 CypeBachCoece]
[06/02 gb]
[03/06 kishima]
[01/18 KNDY]
[01/16 kage]
[12/23 KNDY]
[12/23 kage]
最新トラックバック
カテゴリー
アーカイブ
ブログ内検索
アクセス解析