AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。

AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。


イメージコンバータ第3回です。今回は画像ファイルから取得したバイナリデータを実際に結合してみます。


当然デスクトップ上にファイル出力することになるのでAIR専用のコードであることを断っておきます。


第2回 』の時にドロップのイベントリスナーにファイル出力関数として定義していましたね。引数はファイルリストからループしながら取得したファイルパスです。


以下にコードを示します。


function MakeSerialData(file_path:File) : void
{
    // Mime-type判定のためローダーを使用
    var loader:Loader = new Loader();
    
    // URLRequest作成
    var url:URLRequest = new URLRequest(file_path.nativePath);
    
    // イベントリスナーを登録
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, LoaderCompleteHandler);
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, LoaderIoErrorHandler);
    
    // ロード処理
    loader.load(url);
}


データを取得する対象ファイルが画像ファイルかどうかを調べるため、一度Loaderクラスを通します。イメージコンバーターはエンドユーザが使用するものではないので、エラーチェックが必要ないなら直接データを取得してもいいと思います。


イベントリスナーにもIOErrorEvent.IO_ERROR時の処理を作成しておくと安心です。


次に実際にファイルデータを取得します。


/**
 * 出力データ
 */
var out_info:Object = new Object();		// 出力情報
var out_data:ByteArray = new ByteArray();	// 出力データ

// 出力情報初期化
out_info.file_num = {ドロップされたファイル数};
out_info.cur_num = 0;				// 処理済みのファイル数

/**
 * MIME-TYPE配列
 */
const ALLOW_MIME_TYPE:Array = [
    "image/jpg",
    "image/jpeg",
    "image/gif",
    "image/png"
];

function LoaderCompleteHandler(evt:Event) :void
{
    // ローダー取得
    var loader:Loader = evt.target.loader;
    
    // 許可している形式のファイルの場合、ファイル出力
    if (ALLOW_MIME_TYPE.indexOf(loader.contentLoaderInfo.contentType) >= 0) {
	try {
	    var data:ByteArray = new ByteArray();
	    var in_file:File = new File(loader.contentLoaderInfo.url);
	    var if_stream:FileStream = new FileStream();
	    if_stream.open(in_file, FileMode.READ);
	    if_stream.readBytes(data, 0, if_stream.bytesAvailable);
	    if_stream.close();
	}
	catch (e:IOError) {
	    {ファイルIOのエラー処理}
	}

        /**
         * データを連結する
         */
        // 画像データのlengthを出力
         out_data.writeInt(data.length);
        // 画像データを出力
         out_data.writeBytes(data, 0, data.bytesAvailable);

        // 読込み完了判定
         if (++out_info.cur_num >= out_info.file_num) {
            {ファイル出力処理}
        }
    }
    else {
        {許可している形式のファイルの場合のエラー処理}
    }
}


許可するMime-typeのファイルのみ処理するようにします。拡張子で判断するよりも確実です。わざわざLoaderを使用したのはこのMime-typeを取得するためです。当然ファイルフォーマットを熟知している場合、自分でMime-typeを取得することもできますが、難易度が高いのでおすすめはしません。


Loaderクラスを使用して複数ファイルの処理を行うと、Completeイベントで単純に出力処理を行うわけにはいきません。全ファイルのデータを取得した後に出力処理を行うため、ドロップファイル数と処理済みファイル数を保持しておきます。

出力処理は入力処理と同じくflash.filesystem.*のAPIを使用して下さい。


また上記のコードでは画像データのみを出力していますが、実際は自分で決めたフォーマットを考えましょう。出力した画像連結ファイルをノベルプレーヤー側で取得しないといけませんので。


これでイメージコンバーターの解説を終わります。サウンドコンバーターとSWFコンバーターも基本は同じですが、少しだけ違いがありますので次回はその辺りの解説を行うつもりです。

AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。


イメージコンバーター第2回です。今回はドラッグ&ドロップインターフェースについて解説します。


以前の記事『VistaでのFlashDevelop+Air 』で書いた通り、Vistaではユーザーセキュリティを無効にしないと動作しないので、注意して下さい。


ドラッグ&ドロップは2段階のイベントで構成されます。


1つはドラッグ対象がドロップ対象のオブジェクトにマウスオーバーした時に、一度だけ発生するNativeDragEvent.NATIVE_DRAG_ENTER。


もう1つはドラッグ対象がドロップ対象のオブジェクトにドロップされた時に、一度だけ発生するNativeDragEvent.NATIVE_DRAG_DROPです。


まずはドロップ対象のオブジェクトの作成とイベントリスナーの実装を行います。


// ドロップ対象オブジェクト
var drop_stage:TextField = {テキストフィールド作成};

// イベントリスナーの設定
drop_stage.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, NativeDragEnterHandler);
drop_stage.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, NativeDropHandler);


ドロップ対象をTextFieldにしているのはエラーメッセージなどを出力するためで、別にSpriteでも構いませんが、stageはこのイベントの発生をコールしないので、画面全体にドラッグ&ドロップイベントを設定したい時は画面全体にインスタンスを配置するしかありません。


では次にNATIVE_DRAG_ENTERイベントリスナの実装を見てみましょう。


function NativeDragEnterHandler(evt:NativeDragEvent) : void
{
    // クリップボード
    var clip_board:Clipboard = evt.clipboard;
    
    // ファイルリストのみドロップを受け付ける
    switch (String(clip_board.formats)) {
    case ClipboardFormats.FILE_LIST_FORMAT:
        NativeDragManager.acceptDragDrop(drop_stage);
        break;
    default:
        {エラー処理}
        break;
    }
}


現在ドラッグしているファイルパスをクリップボードから取得します。ファイルリストではなく文字列などの場合はエラー処理を行います。


ファイルリストの場合、ドロップ対象のインスタンスへのドロップを許可します。


最後にNATIVE_DRAG_DROPイベントリスナの実装です。


function NativeDropHandler(evt:NativeDragEvent) : void
{
    // クリップボードからデータを取得
    var clip_board:Clipboard = evt.clipboard;
    var file_path_list:Array = clip_board.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
    
    // ドロップされたファイルパスからデータを取得
    for each (var file_path:File in file_path_list) {
    	{画像バイナリ作成関数}(file_path);
    }
}


複数ファイル対応するので、クリップボードからファイルリストの内容を配列で受け取ります。これでfile_path_listにはドロップされたファイルのパスが格納されますので、後は全てのパスから画像バイナリを作成すればOKです。


これでドラッグ&ドロップは実装できました。次回はバイナリ格納の方法を解説します。