イナヅマTVログ

HydroTween, ColorMatrixFilterでcolorをtweenできる?(2)

hex(0xRRGGBB)をRGBに分解する。
Quasimondo – Mario KlingemannのColorMatrix 、Grant SkinnerさんのColorMatrixとHydroTweenを参考にした。

hex:uintをRGB成分を持った配列へ変換する関数。

function hexToRGB(rgb:int, returnmode:Boolean=false):Array{
	var r:Number;
	var g:Number;
	var b:Number;
 
	r = (((rgb >> 16 ) & 0xFF) / 0xFF);
	g = (((rgb >> 8 ) & 0xFF) / 0xFF);
	b = ((rgb & 0xFF ) / 0xFF);
 
	if (returnmode) return [r*255,g*255,b*255];
	return [r,g,b];
}


1.hexToRGB(0xff0000); // [1,0,0]
2.hexToRGB(0xff0000,true); // [255,0,0]


取得したRGBをもとにColorMatrixFilterのmatrixを生成する。使用するRGBは1の形式。
MarioさんとHydroTweenでは微妙に違っている。

Mario

const LUMA_R:Number = 0.212671;
const LUMA_G:Number = 0.71516;
const LUMA_B:Number = 0.072169;
var amount:Number=1;
var inv_amount:Number = 1 - amount;
[(inv_amount + ((amount * r) * LUMA_R)), ((amount * r) * LUMA_G), ((amount * r) * LUMA_B), 0, 0,
((amount * g) * LUMA_R), (inv_amount + ((amount * g) * LUMA_G)), ((amount * g) * LUMA_B), 0, 0,
((amount * b) * LUMA_R), ((amount * b) * LUMA_G), (inv_amount + ((amount * b) * LUMA_B)), 0, 0,
0, 0, 0, 1, 0]

HydroTween

const _r_lum:Number = 0.212671;
const _g_lum:Number = 0.715160;
const _b_lum:Number = 0.072169;
var s:Number = 2.81;
var srlum:Number = (s * _r_lum);
var sglum:Number = (s * _g_lum);
var sblum:Number = (s * _b_lum);
 
var amount:Number=1;
var inv:Number = (1 - amount);
 
[(inv + ((amount * r) * srlum)), ((amount * r) * sglum), ((amount * r) * sblum), 0, 0,
((amount * g) * srlum), (inv + ((amount * g) * sglum)), ((amount * g) * sblum), 0, 0,
((amount * b) * srlum), ((amount * b) * sglum), (inv + ((amount * b) * sblum)), 0, 0,
0, 0, 0, 1, 0]

HydroTweenが定数Luminanceをx2.81してるところが違う。
donovanさんはなぜx2.81したのだろう?

両者に共通して使われている定数Luminanceは、MarioさんのColorMatrixのクレジットによるとCharles A. Poynton’s colorspace-faqが出典だとのこと。

The weights to compute true CIE luminance from
linear red, green and blue (indicated without prime symbols), for the Rec.
709, are these:
Y = 0.212671 * R + 0.715160 * G + 0.072169 * B;
This computation assumes that the luminance spectral weighting can be
formed as a linear combination of the scanner curves, and assumes that the
component signals represent linear-light. Either or both of these
conditions can be relaxed to some extent depending on the application.

う〜ん、アタマが痛い!

コメントは受け付けていません。