package { import flash.display.Sprite; import flash.display.BitmapData; import flash.display.Bitmap; import flash.text.TextField; import flash.events.Event; import fl.events.SliderEvent; import flash.geom.Transform; import flash.geom.ColorTransform; public class Sepia extends Sprite { var bmd0, bmd:BitmapData; function Sepia():void { bmd0 = new SepiaBitmapData(250, 250); bmd = new SepiaBitmapData(250, 250); var bm:Bitmap = new Bitmap(bmd); addChild(bm); hSlider.addEventListener(fl.events.SliderEvent.CHANGE, onSliderChange); sSlider.addEventListener(fl.events.SliderEvent.CHANGE, onSliderChange); } function onSliderChange(event:Event):void { hLabel.text = "H = " + hSlider.value; sLabel.text = "S = " + sSlider.value; for (var i:int = 0; i < bmd0.width; i++) { for (var j:int = 0; j < bmd0.height; j++) { var c:uint = bmd0.getPixel(i, j); var hsv:Object = colorToHsv(c); hsv.h = hSlider.value; hsv.s = sSlider.value / 100.0; c = hsvToColor(hsv.h, hsv.s, hsv.v); bmd.setPixel(i, j, c); } } } /** * h: 0-360 * s, v: 0-1.0 * * Returns RGB color. */ function hsvToColor(h:Number, s:Number, v:Number):Number { var cv:Number = Math.round(v * 255); var r:Number = cv; var g:Number = cv; var b:Number = cv; if (s > 0) { var i:Number = Math.floor(h / 60); var f:Number = h / 60 - i; var m:Number = Math.round(v * (1 - s) * 255); var n:Number = Math.round(v * (1 - s * f) * 255); var k:Number = Math.round(v * (1 - s * (1 - f)) * 255); switch (i) { case 0 : g = k; b = m; break; case 1 : r = n; b = m; break; case 2 : r = m; b = k; break; case 3 : r = m; g = n; break; case 4 : r = k; g = m; break; case 5 : g = m; b = n; break; } } return r << 16 | g << 8 | b; } /** * color: RGB color. * * Returns an object of h, s, v where * h: 0-360 * s, v: 0-1.0 */ function colorToHsv(color:Number):Object { var r:Number = color >> 16; var g:Number = (color >> 8) & 0xFF; var b:Number = color & 0xFF; var max:Number = Math.max(r, Math.max(g, b)); var min:Number = Math.min(r, Math.min(g, b)); var range:Number = max - min; var h:Number = 0; var s:Number = 0; var v:Number = max / 255; if (v > 0) { s = range / max; if (s > 0) { var cr:Number = (max - r) / range; var cg:Number = (max - g) / range; var cb:Number = (max - b) / range; if (r == max) { h = cb - cg; } else if (g == max) { h = 2 + cr - cb; } else { h = 4 + cg - cr; } h *= 60; if (h < 0) { h += 360; } } } return {h:Math.round(h * 100) * 0.01,s:Math.round(s * 100) * 0.01,v:Math.round(v * 100) * 0.01}; } } }