Flash / Flex / ActionScript/Graphics/Bitmap
Содержание
- 1 Add Bitmap to Sprite
- 2 Adding a Bitmap Fill
- 3 An image-based color picker
- 4 Apply filter to bitmap
- 5 Applying Flood Fills
- 6 Applying Rectangular Fills
- 7 Copying Images
- 8 Copying Pixels: bitmap.copyPixels(sourceBmp, srcRect, destPoint);
- 9 Create bitmap and set pixel
- 10 Display objects composited into a bitmap
- 11 Dissolving Between Two Bitmaps
- 12 Embedding a bitmap at compile time
- 13 Examining a Bitmap
- 14 Image Smoothing
- 15 Pixel Snapping
- 16 Runtime Bitmap
- 17 Transforming Colors
- 18 Use perlinNoise
Add Bitmap to Sprite
<source lang="java">
package{
import flash.display.Sprite; import flash.display.*; import flash.geom.*; public class Main extends Sprite{ public function Main(){ var imgData:BitmapData = new BitmapData(20, 20, false, 0xFF00FF00); imgData.fillRect(new Rectangle(5, 5, 10, 10), 0xFF0000FF); var bmp1:Bitmap = new Bitmap(imgData); addChild(bmp1); var bmp2:Bitmap = new Bitmap(imgData); bmp2.rotation = 45; bmp2.x = 50; bmp2.scaleX = 2; // 200% bmp2.scaleY = 2; // 200% addChild(bmp2); } }
}
</source>
Adding a Bitmap Fill
<source lang="java">
package {
import flash.display.*; import flash.events.Event; import flash.net.URLRequest; public class Main extends Sprite { private var shape:Sprite; private var loader:Loader; private var bmpImage:BitmapData; private var mShape:Sprite; public function Main() { loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.ruPLETE, picLoaded); loader.load(new URLRequest("image1.jpg")); mShape = new Sprite(); mShape.x = 100; mShape.y = 200; } private function picLoaded(event:Event):void { bmpImage = new BitmapData(loader.width, loader.height); bmpImage.draw(loader); mShape.graphics.lineStyle(10); mShape.graphics.beginBitmapFill(bmpImage); mShape.graphics.curveTo(100, -50, 200, 0); mShape.graphics.lineTo(200, 100); mShape.graphics.lineTo(0, 100); mShape.graphics.lineTo(0, 0); mShape.graphics.endFill(); addChild(mShape); } }
}
</source>
An image-based color picker
<source lang="java">
package {
import flash.display.*; import flash.events.*; import flash.text.*; import flash.net.*; public class Main extends Sprite { private var img:Bitmap; // The Bitmap object private var imgContainer:Sprite; // Container for the Bitmap object private var t:TextField = new TextField( ); public function Main( ) { t.text = "Please come to my party..."; t.autoSize = TextFieldAutoSize.LEFT; addChild(t); var loader:Loader = new Loader( ); loader.contentLoaderInfo.addEventListener(Event.INIT, initListener); loader.load(new URLRequest("s.jpg")); } private function initListener (e:Event):void { img = e.target.content; imgContainer = new Sprite( ); imgContainer.addChild(img); addChild(imgContainer); imgContainer.y = 30; imgContainer.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener); } private function mouseMoveListener (e:MouseEvent):void { t.textColor = img.bitmapData.getPixel32(e.localX, e.localY); } }
}
</source>
Apply filter to bitmap
<source lang="java">
package {
import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.filters.BlurFilter; import flash.events.Event; import flash.geom.Point; public class Main extends Sprite { private var _bitmap:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0xff000000); private var _image:Bitmap = new Bitmap(_bitmap); private var _blurFilter:BlurFilter = new BlurFilter( ); public function Main( ) { addChild(_image); addEventListener(Event.ENTER_FRAME, onEnterFrame); } public function onEnterFrame(event:Event):void { for(var i:int = 0; i < 500; i++) { _bitmap.setPixel(mouseX + Math.random( ) * 20 - 10, mouseY + Math.random( ) * 20 - 10, 0xffffffff); } _bitmap.applyFilter(_bitmap, _bitmap.rect, new Point( ), _blurFilter); } }
}
</source>
Applying Flood Fills
<source lang="java">
package {
import flash.display.BitmapData; import flash.display.Bitmap; import flash.display.Sprite; import flash.geom.Rectangle; import flash.events.MouseEvent; public class Main extends Sprite { private var _bitmapData:BitmapData = new BitmapData(200, 200); public function Main () { _bitmapData.fillRect(new Rectangle(0, 0, 100, 100), 0xFFFF0000); _bitmapData.fillRect(new Rectangle(100, 0, 100, 100), 0xFF00FF00); _bitmapData.fillRect(new Rectangle(0, 100, 100, 100), 0xFF0000FF); _bitmapData.fillRect(new Rectangle(100, 100, 100, 100), 0xFFFFFF00); var container:Sprite = new Sprite(); addChild(container); var bitmap:Bitmap = new Bitmap(_bitmapData); container.addChild(bitmap); container.addEventListener(MouseEvent.CLICK, clickHandler); } private function clickHandler(event:MouseEvent):void { _bitmapData.floodFill(mouseX, mouseY, 0xFF000000 | Math.random() * 0xFFFFFF); } }
}
</source>
Applying Rectangular Fills
<source lang="java">
package{
import flash.display.*; import flash.geom.*; public class Main extends Sprite{ public function Main(){ var bitmapData:BitmapData = new BitmapData(200, 200); bitmapData.fillRect(new Rectangle(0, 0, 100, 100), 0xFFFF0000); bitmapData.fillRect(new Rectangle(100, 0, 100, 100), 0xFF00FF00); bitmapData.fillRect(new Rectangle(0, 100, 100, 100), 0xFF0000FF); bitmapData.fillRect(new Rectangle(100, 100, 100, 100), 0xFFFFFF00); var bitmap:Bitmap = new Bitmap(bitmapData); addChild(bitmap); } }
}
</source>
Copying Images
<source lang="java">
package{
import flash.display.*; import flash.geom.*; public class Main extends Sprite{ public function Main(){ var shape:Shape = new Shape(); shape.graphics.lineStyle(0, 0, 1); shape.graphics.drawCircle(100, 100, 100); shape.graphics.drawCircle(100, 100, 50); shape.graphics.drawRect(25, 50, 150, 100); shape.graphics.drawRect(50, 25, 100, 150); var bitmapDataA:BitmapData = new BitmapData(200, 200, false, 0xFFFFCCCC); bitmapDataA.draw(shape, new Matrix(), null, null, new Rectangle(0, 0, 100, 100)); var bitmapA:Bitmap = new Bitmap(bitmapDataA); addChild(bitmapA); var bitmapDataB:BitmapData = new BitmapData(200, 200, false, 0xFFCCFFCC); bitmapDataB.draw(shape, new Matrix(), null, null, new Rectangle(100, 0, 100, 100)); var bitmapB:Bitmap = new Bitmap(bitmapDataB); addChild(bitmapB); bitmapB.x = 200; var bitmapDataC:BitmapData = new BitmapData(200, 200, false, 0xFFCCCCFF); bitmapDataC.draw(shape, new Matrix(), null, null, new Rectangle(0, 100, 100, 100)); var bitmapC:Bitmap = new Bitmap(bitmapDataC); addChild(bitmapC); bitmapC.y = 200; var bitmapDataD:BitmapData = new BitmapData(200, 200, false, 0xFFFFFFCC); bitmapDataD.draw(shape, new Matrix(), null, null, new Rectangle(100, 100, 100, 100)); var bitmapD:Bitmap = new Bitmap(bitmapDataD); addChild(bitmapD); bitmapD.x = 200; bitmapD.y = 200; addChild(shape); shape.x = 100; shape.y = 100; } }
}
</source>
Copying Pixels: bitmap.copyPixels(sourceBmp, srcRect, destPoint);
<source lang="java">
package {
import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.net.URLRequest; import flash.events.Event; import flash.geom.Point; import flash.geom.Rectangle; public class Main extends Sprite { private var _bitmap:BitmapData= new BitmapData(stage.stageWidth,stage.stageHeight,false, 0xffffffff); private var _loader:Loader = new Loader( ); public function Main( ) { _loader.contentLoaderInfo.addEventListener(Event.ruPLETE, onLoad); _loader.load(new URLRequest("m.jpg")); var image:Bitmap = new Bitmap(_bitmap); addChild(image); } public function onLoad(event:Event):void { var loaderBmp:Bitmap = Bitmap(_loader.content); var w:Number = loaderBmp.width / 5; for(var i:int = 0; i < 10; i++) { _bitmap.copyPixels(loaderBmp.bitmapData, new Rectangle(i * w, 0, w, loaderBmp.height), new Point(i * (w + 2), i)); } } }
}
</source>
Create bitmap and set pixel
<source lang="java">
package {
import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.filters.BlurFilter; import flash.events.Event; import flash.geom.Point; public class Main extends Sprite { private var _bitmap:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0xff000000); private var _bitmap2:BitmapData= new BitmapData(stage.stageWidth, stage.stageHeight, false, 0xff000000); private var _image:Bitmap= new Bitmap(_bitmap); private var _blurFilter:BlurFilter = new BlurFilter( ); public function Main( ) { addChild(_image); addEventListener(Event.ENTER_FRAME, onEnterFrame); } public function onEnterFrame(event:Event):void { for(var i:int = 0; i < 100; i++) { _bitmap2.setPixel(mouseX + Math.random( ) * 20 - 10, mouseY + Math.random( ) * 20 - 10, 0xffffffff); } _bitmap.applyFilter(_bitmap2, _bitmap.rect, new Point( ), _blurFilter); } }
}
</source>
Display objects composited into a bitmap
<source lang="java">
package{
import flash.display.*; import flash.geom.*; public class Main extends Sprite{ public function Main(){ var rect:Shape = new Shape( ); rect.graphics.beginFill(0xFF0000); rect.graphics.drawRect(0,0,25,50); var ellipse:Shape = new Shape( ); ellipse.graphics.beginFill(0x0000FF); ellipse.graphics.drawEllipse(0,0,35,25); var canvas:BitmapData = new BitmapData(100, 100, false, 0xFFFFFFFF); canvas.draw(rect); var matrix:Matrix = new Matrix( ); matrix.translate(10, 10); canvas.draw(ellipse, matrix); var bmp:Bitmap = new Bitmap(canvas); addChild(bmp); } }
}
</source>
Dissolving Between Two Bitmaps
<source lang="java">
seed = srcBmp.pixelDissolve(destBmp, sourceRect, destPoint,
seed, numPixels, fillColor);
package {
import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.Event; import flash.geom.Point; public class Main extends Sprite { private var _bitmap:BitmapData= new BitmapData(stage.stageWidth,stage.stageHeight,false, 0xffffffff); private var _bitmap2:BitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false, 0xff000000); private var _image:Bitmap = new Bitmap(_bitmap); private var _seed:Number = 11111111; private var _pixelCount:int = 0; public function Main( ) { addChild(_image); addEventListener(Event.ENTER_FRAME, onEnterFrame); } public function onEnterFrame(event:Event):void { _seed = _bitmap.pixelDissolve(_bitmap2, _bitmap.rect, new Point( ), _seed, 1000); _pixelCount += 1000; if(_pixelCount > _bitmap.width * _bitmap.height) { removeEventListener(Event.ENTER_FRAME, onEnterFrame); } } }
}
</source>
Embedding a bitmap at compile time
<source lang="java">
package {
import flash.display.*; import flash.events.*; import mx.core.BitmapAsset; [Embed(source="photo.jpg")] public class Main extends Sprite { private var Photo:Class; public function Main( ) { var photo:BitmapAsset = new Photo( ); addChild(photo); trace(photo.bitmapData.getPixel(0, 0)); } }
}
</source>
Examining a Bitmap
<source lang="java">
package{
import flash.display.*; public class Main extends Sprite{ public function Main(){ var imgData:BitmapData = new BitmapData(20, 20, false, 0xFF0000FF); trace(imgData.getPixel32(0, 0)); // Displays: 4278190335
} }
}
</source>
Image Smoothing
<source lang="java">
package{
import flash.display.*; public class Main extends Sprite{ public function Main(){ var squareData:BitmapData = new BitmapData(200, 200, false, 0xFFCC00CC); var bitmap:Bitmap = new Bitmap(bitmapData, PixelSnapping.AUTO, false); bitmap.smoothing = false; addChild(bitmap); } }
}
</source>
Pixel Snapping
<source lang="java">
package{
import flash.display.*; public class Main extends Sprite{ public function Main(){ var squareData:BitmapData = new BitmapData(200, 200, false, 0xFFCC00CC); var bitmap:Bitmap = new Bitmap(bitmapData, PixelSnapping.ALWAYS); bitmap.pixelSnapping = PixelSnapping.NEVER; addChild(bitmap); } }
}
</source>
Runtime Bitmap
<source lang="java">
package {
import flash.net.URLRequest; import flash.display.BitmapData; import flash.display.Bitmap; import flash.display.Sprite; import flash.display.Loader; import flash.geom.Point; import flash.geom.Rectangle; import flash.events.Event; public class Main extends Sprite { private var _loaderA:Loader = new Loader(); private var _loaderB:Loader = new Loader(); private var _loadCount:Number; public function Main () { _loadCount = 0; _loaderA.load(new URLRequest("http://www.wbex.ru/image1.jpg")); _loaderA.contentLoaderInfo.addEventListener(Event.ruPLETE, completeHandler); _loaderB.load(new URLRequest("http://www.wbex.ru/image2.jpg")); _loaderB.contentLoaderInfo.addEventListener(Event.ruPLETE,completeHandler); } private function completeHandler(event:Event):void { _loadCount++; if(_loadCount == 2) { mergeImages(); } } private function mergeImages():void { var w:Number = _loaderA.width; var h:Number = _loaderA.height; var bitmapDataA:BitmapData = new BitmapData(w, h); bitmapDataA.draw(_loaderA); var bitmapDataB:BitmapData = new BitmapData(w, h); bitmapDataB.draw(_loaderB); bitmapDataA.merge(bitmapDataB, new Rectangle(0, 0, w, h), new Point(0, 0), 0, 256, 0, 100); var bitmap:Bitmap = new Bitmap(bitmapDataA); addChild(bitmap); } }
}
</source>
Transforming Colors
<source lang="java">
package {
import flash.display.Sprite; import flash.display.Loader; import flash.net.URLRequest; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.ColorTransform; public class Main extends Sprite { private var _loader:Loader = new Loader(); private var _current:int; public function Main () { _loader.load(new URLRequest("http://www.wbex.ru/image.jpg")); addChild(_loader); _loader.addEventListener(MouseEvent.CLICK, clickHandler); _loader.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); } private function mouseMoveHandler(event:MouseEvent):void { var value:Number = _loader.mouseX / _loader.width; var colorTransform:ColorTransform = _loader.transform.colorTransform; if(_current == 0) { colorTransform.redMultiplier = value; } else if(_current == 1) { colorTransform.greenMultiplier = value; } else if(_current == 2) { colorTransform.blueMultiplier = value; } else if(_current == 3) { colorTransform.alphaMultiplier = value; } _loader.transform.colorTransform = colorTransform; } private function clickHandler(event:MouseEvent):void { _current++; if(_current == 4) { _current = 0; } } }
}
</source>
Use perlinNoise
<source lang="java">
package {
import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.Event; import flash.geom.Point; public class Main extends Sprite { private var _bitmap:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0xffffffff); private var _xoffset:int = 0; public function Main( ) { addChild(new Bitmap(_bitmap)); addEventListener(Event.ENTER_FRAME, onEnterFrame); } public function onEnterFrame(event:Event):void { _xoffset++; var point:Point = new Point(_xoffset, 0); _bitmap.perlinNoise(200, 100, 2, 1000, false, true,1, true, [point, point]); } }
}
</source>