actionscript 3 - Annotating an Image in AS3 with a Rectangle and Save Result -


i looking @ face detection example found in zip file here:

marilena_mod10.zip

the example loads image , highlights face black rectangle. save resulting image, in other words, annotate image square , nothing else (just image , square, not entire stage).

so far can save image processing bitmap data , resaving it, cannot save 'square'. i've tried copying line draws square , drawing bitmap object, tried drawing on sprite, , i've tried using matrix figuring being drawn out of bounds. no luck.

below original code followed futile attempts (i realize saves blank white image, trying see if draw square):

package {     import flash.display.stagescalemode;     import flash.display.stagealign;     import flash.display.sprite;     import flash.display.loader;     import flash.display.bitmap;     import flash.display.bitmapdata;     import flash.display.graphics;     import flash.events.event;     import flash.geom.rectangle;     import flash.net.urlrequest;     import flash.text.textfield;     import jp.maaash.objectdetection.objectdetector;     import jp.maaash.objectdetection.objectdetectoroptions;     import jp.maaash.objectdetection.objectdetectorevent;      import flash.utils.gettimer;      public class facedetector extends sprite{         private var debug :boolean = true;          private var detector    :objectdetector;         private var options     :objectdetectoroptions;         private var faceimage   :loader;         private var bmptarget   :bitmap;          private var view :sprite;         private var facerectcontainer :sprite;         private var tf :textfield;          private var lasttimer:int = 0;          public function facedetector() {             initui();             initdetector();             faceimage.load( new urlrequest("013.jpg") );         }          private function initui():void{             stage.scalemode = stagescalemode.no_scale;             stage.align = stagealign.top_left;              view = new sprite;             addchild(view);              faceimage = new loader;             faceimage.contentloaderinfo.addeventlistener( event.complete, function(e :event) :void {                 startdetection();             });             view.addchild( faceimage );              facerectcontainer = new sprite;             view.addchild( facerectcontainer );              tf = new textfield;             tf.x = 256;             tf.width  = 600;             tf.height = 300;             tf.textcolor = 0x000000;             tf.multiline = true;             view.addchild( tf );         }          private function initdetector():void{             detector = new objectdetector;             detector.options = getdetectoroptions();             detector.addeventlistener(objectdetectorevent.detection_complete,function( e :objectdetectorevent ):void{                 logger("[objectdetectorevent.complete]");                 tf.appendtext( "\ntime: "+(new date)+" "+e.type );                 detector.removeeventlistener( objectdetectorevent.detection_complete, arguments.callee );                  if( e.rects ){                     var g :graphics = facerectcontainer.graphics;                     g.clear();                     g.linestyle( 2 );   // black 2pix                     e.rects.foreach( function( r :rectangle, idx :int, arr :array ) :void {                         g.drawrect( r.x, r.y, r.width, r.height );                     });                 }             });              detector.addeventlistener( objectdetectorevent.detection_start, function(e :objectdetectorevent) :void {                 tf.appendtext( "\ntime: "+(new date)+" "+e.type );             });          }          private function startdetection():void{             logger("[startdetection]");              bmptarget = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) )             bmptarget.bitmapdata.draw( faceimage );             detector.detect( bmptarget.bitmapdata );         }          private function getdetectoroptions() :objectdetectoroptions {             options = new objectdetectoroptions();             options.min_size  = 50;             return options;         }          private function logger(... args):void{             if(!debug){ return; }             trace( args, gettimer(),  gettimer() - lasttimer);             lasttimer = gettimer();         }     } } 

my code:

package {     import flash.display.stagescalemode;     import flash.display.stagealign;     import flash.display.sprite;     import flash.display.loader;     import flash.display.bitmap;     import flash.display.bitmapdata;     import flash.display.graphics;     import flash.events.event;     import flash.geom.*;//rectangle;     import flash.net.urlrequest;     import flash.text.textfield;     import jp.maaash.objectdetection.objectdetector;     import jp.maaash.objectdetection.objectdetectoroptions;     import jp.maaash.objectdetection.objectdetectorevent;     import com.adobe.images.*;      import flash.utils.gettimer;      ////     import flash.filesystem.*;     import flash.utils.bytearray;     ////      public class facedetector extends sprite{         private var debug :boolean = true;          private var detector    :objectdetector;         private var options     :objectdetectoroptions;         private var faceimage   :loader;         private var bmptarget   :bitmap;          private var view :sprite;         private var facerectcontainer :sprite;         private var tf :textfield;          private var lasttimer:int = 0;          public function facedetector() {             initui();             initdetector();             faceimage.load( new urlrequest("013.jpg") );         }          private function initui():void{             stage.scalemode = stagescalemode.no_scale;             stage.align = stagealign.top_left;              view = new sprite;             addchild(view);              faceimage = new loader;             faceimage.contentloaderinfo.addeventlistener( event.complete, function(e :event) :void {                 startdetection();             });             view.addchild( faceimage );              facerectcontainer = new sprite;             view.addchild( facerectcontainer );              tf = new textfield;             tf.x = 256;             tf.width  = 600;             tf.height = 300;             tf.textcolor = 0x000000;             tf.multiline = true;             view.addchild( tf );         }          private function initdetector():void{             detector = new objectdetector;             detector.options = getdetectoroptions();             detector.addeventlistener(objectdetectorevent.detection_complete,function( e :objectdetectorevent ):void{                 logger("[objectdetectorevent.complete]");                 tf.appendtext( "\ntime: "+(new date)+" "+e.type );                 detector.removeeventlistener( objectdetectorevent.detection_complete, arguments.callee );                  var rt:sprite    = new sprite();                 var bmprt:bitmap = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) );                 var matrix:matrix = new matrix();                 var rect:rectangle = new rectangle();                  if( e.rects ){                     var g :graphics = facerectcontainer.graphics;                     g.clear();                     g.linestyle( 2 );   // black 2pix                     e.rects.foreach( function( r :rectangle, idx :int, arr :array ) :void {                         g.drawrect( r.x, r.y, r.width, r.height );                          matrix.translate(-r.x, -r.y);                         rect = r;                         rt.graphics.drawrect(r.x, r.y, r.width, r.height );                     });                 }                  var file:file                   = file.applicationstoragedirectory.resolvepath("testoutput.jpg");                 var fs:filestream               = new filestream();                 var bytearray:bytearray;                 var jpgencoder:jpgencoder = new jpgencoder( 90 );                   //rt.graphics.draw(g);                  bmptarget.bitmapdata.draw(rt);                 bmprt.bitmapdata.draw(rt, matrix);                  bytearray     = jpgencoder.encode( bmprt.bitmapdata );                 fs.open(file, filemode.write);                 fs.writebytes(bytearray);                 fs.close();              });              detector.addeventlistener( objectdetectorevent.detection_start, function(e :objectdetectorevent) :void {                 tf.appendtext( "\ntime: "+(new date)+" "+e.type );             });          }          private function startdetection():void{             logger("[startdetection]");             bmptarget = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) )             bmptarget.bitmapdata.draw( faceimage );             detector.detect( bmptarget.bitmapdata );         }          private function getdetectoroptions() :objectdetectoroptions {             options = new objectdetectoroptions();             options.min_size  = 50;             return options;         }          private function logger(... args):void{             if(!debug){ return; }             trace( args, gettimer(),  gettimer() - lasttimer);             lasttimer = gettimer();         }     } } 

tl;dr:

how load image, draw square on it, , save result, assuming know how load , save images?

any appreciated, in advance.

edit

here final code interested:

package {     import flash.display.stagescalemode;     import flash.display.stagealign;     import flash.display.sprite;     import flash.display.loader;     import flash.display.bitmap;     import flash.display.bitmapdata;     import flash.display.graphics;     import flash.events.event;     import flash.geom.*;//rectangle;     import flash.net.urlrequest;     import flash.text.textfield;     import jp.maaash.objectdetection.objectdetector;     import jp.maaash.objectdetection.objectdetectoroptions;     import jp.maaash.objectdetection.objectdetectorevent;     import com.adobe.images.*;      import flash.utils.gettimer;      ////     import flash.filesystem.*;     import flash.utils.bytearray;     ////      public class facedetector extends sprite{         private var debug :boolean = true;          private var detector    :objectdetector;         private var options     :objectdetectoroptions;         private var faceimage   :loader;         private var bmptarget   :bitmap;          private var view :sprite;         private var facerectcontainer :sprite;         private var tf :textfield;          private var lasttimer:int = 0;          public function facedetector() {             initui();             initdetector();             faceimage.load( new urlrequest("013.jpg") );         }          private function initui():void{             stage.scalemode = stagescalemode.no_scale;             stage.align = stagealign.top_left;              view = new sprite;             addchild(view);              faceimage = new loader;             faceimage.contentloaderinfo.addeventlistener( event.complete, function(e :event) :void {                 startdetection();             });             view.addchild( faceimage );              facerectcontainer = new sprite;             view.addchild( facerectcontainer );              tf = new textfield;             tf.x = 256;             tf.width  = 600;             tf.height = 300;             tf.textcolor = 0x000000;             tf.multiline = true;             view.addchild( tf );         }          private function initdetector():void{             detector = new objectdetector;             detector.options = getdetectoroptions();             detector.addeventlistener(objectdetectorevent.detection_complete,function( e :objectdetectorevent ):void{                 logger("[objectdetectorevent.complete]");                 tf.appendtext( "\ntime: "+(new date)+" "+e.type );                 detector.removeeventlistener( objectdetectorevent.detection_complete, arguments.callee );                  var bmprt:bitmap = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) );                  if( e.rects ){                     var g :graphics = facerectcontainer.graphics;                     g.clear();                     g.linestyle(3, 0xff0000, 1);    // black 2pix--- parameters(thicknes in pixels, color in hex, alpha (0-1))                     e.rects.foreach( function( r :rectangle, idx :int, arr :array ) :void {                         g.drawrect( r.x, r.y, r.width, r.height );                     });                 }                  var file:file                   = file.applicationstoragedirectory.resolvepath("testoutput.jpg");                 var fs:filestream               = new filestream();                 var bytearray:bytearray;                 var jpgencoder:jpgencoder = new jpgencoder( 90 );                  bmprt.bitmapdata.draw(faceimage);                 bmprt.bitmapdata.draw(facerectcontainer);                  bytearray     = jpgencoder.encode( bmprt.bitmapdata );                 fs.open(file, filemode.write);                 fs.writebytes(bytearray);                 fs.close();              });              detector.addeventlistener( objectdetectorevent.detection_start, function(e :objectdetectorevent) :void {                 tf.appendtext( "\ntime: "+(new date)+" "+e.type );             });          }          private function startdetection():void{             logger("[startdetection]");             bmptarget = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) )             bmptarget.bitmapdata.draw( faceimage );             detector.detect( bmptarget.bitmapdata );         }          private function getdetectoroptions() :objectdetectoroptions {             options = new objectdetectoroptions();             options.min_size  = 50;             return options;         }          private function logger(... args):void{             if(!debug){ return; }             trace( args, gettimer(),  gettimer() - lasttimer);             lasttimer = gettimer();         }     } } 

thanks vesper help.

well, load image bitmap, determine draw rectangle, create shape , draw rectangle on graphics, call bitmap.bitmapdata.draw(shape) draw rectangle on loaded bitmap, save bitmap. in code, after you've prepared rectangles, this:

bmprt.bitmapdata.copypixels(faceimage.bitmapdata,faceimage.bitmapdata.rect,new point()); bmprt.bitmapdata.draw(facerectcontainer); 

then save bmprt do.


Comments