Flash CS4로 ActionScript 3.0에 의한 애니메이션 이미지 시퀀스 파일로 저장하기.
참고: Adobe ActionScript 3.0 Reference 중 FileReference class 항목
참고: Adobe ActionScript 3.0 Reference 중 PNGEncoder class 항목

플래시 액션스크립트에의한 영상을 jpg혹은 png sequence 파일로 만들어낼 수 있는 방법을 어제부터 고민 중 EnterFrame 함수에서 png 파일 익스포트를 정해둔 횟수만큼 매 프레임 실행하게 하면 될 것 같았다.
실제 해 보니 문제가 생겼는데 FileReference.save()의 경우 EnterFrame에 넣으면 'Error #2176: 팝업 창 표시와 같은 특정 동작은 마우스를 클릭하거나 버튼을 누르는 것과 같이 사용자가 조작하는 경우에만 발생합니다.'이란 에러가 뜨며 실행에러가 난다.
보안차원에서 막아둔 것인 듯.

해서 아이디어를 새로 생각해 냈다.
EnterFrame 이벤트 함수를 일반 함수로 변경하고 키보드 이벤트 함수에서 변경된 일반함수를 호출하는 방식.

* 한데 또 이벤트 함수의 경우 이벤트 매개변수를 보내지 않으면 에러가 뜨고 호출을 할 수 없는 문제가 생겼다.
예전에 발견했던 듯 하여 한참을 헤멘 결과 플래시에서 이벤트 함수를 이벤트 매개변수없이 호출하는 방법을 찾았다.
이벤트 함수의 매개변수로 null을 보내면 되는 것 이었다.
* png로 저장을 하려면 PNGEncoder.as를 import 해야한다. 이 PNGEncoder.as는 플래시 액션스크립트 3.0의 기본 라이브러리가 아닌 Flex 의 라이브러리인지라 따로 받아야 하고 위치도 지정해 줘야 했던 듯.

numPad의 0키를 눌러 루프의 내용 진행, numPad의 . 키로 png로 저장 팝업창 띄우기, 바로 옆 엔터키로 저장하기. 세 손가락을 차례로 누름에 따라 액션스크립트의 내용을 png로 수동적으로 저장하도록 만들었다. loop함수의 애니메이션은 빨간 원이 오른쪽으로 날아가는 간단한 것.
* 매크로 자동화 프로그램을 이용해 한 개의 키로 한번의 실행과 저장을 처리할 수 있을 듯도 하고 AIR를 이용하면 fileReference.save의 제한을 풀 수 있는 듯도.

14/12/28 일

Flash AS3 액션 내용의 png sequnece EXPORT 소스:
(화면에 미리 'circleM'이란 이름의 원 무비클립을 만들어두었고 numpad의 0키를 누르면 한 프레임 실행되고 numpad .키를 누르면 png 저장 팝업창이 뜬다.)

import flash.geom.Rectangle; //png 파일로 저장을 위한 import들++
import flash.geom.Matrix;
import flash.utils.ByteArray;
import flash.display.BitmapData;
import flash.net.FileReference;
import mx.graphics.codec.PNGEncoder;

var c1 = circleM;
var pngNum=0;
var saveName:String = "test"; //png저장시 앞에 붙을 이름

function init(){
	trace("Start!");
	//stage.addEventListener(Event.ENTER_FRAME,loop);
	stage.addEventListener(KeyboardEvent.KEY_UP,keybdUp);
}

function loop(e:Event){
	if(c1.x < 450){
		c1.x += 5;
	}
}
function keybdUp(e:KeyboardEvent){ //키보드 업시 처리 함수
	switch(e.keyCode){
		case(110):{ pngFileSave(); break; } //numpad . click
		case(96):{ loop(null); break; } //numpad 0 click
		default: break;
	}
}

function pngFileSave(){//png파일로 저장 처리 함수+++
	pngNum++;
	var _pngSaveName:String;
	if(pngNum <100 && pngNum >=10){//저장시 파일넘버 앞에 00 붙이기.
		_pngSaveName =saveName+"0"+pngNum+".png";
	}else if(pngNum <10){
		_pngSaveName =saveName+"00"+pngNum+".png";
	}else{
		_pngSaveName =saveName+pngNum+".png";
	}
				
	var _bmpData:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x000000);
	var _byteArr:ByteArray = new ByteArray();
	var _fileRef = new FileReference();
	_bmpData.draw(stage, null,null,null,null,true);
				
	var _pngSave = new PNGEncoder();
	_byteArr = _pngSave.encode(_bmpData);
	_fileRef.save(_byteArr, _pngSaveName);
}

init();