2

JasonSturgesが提供するDevGirlXpenseItソリューションを使用して、これに関する他のいくつかのヘルプリクエストに応えて大成功を収めました:(http://stackoverflow.com/questions/11812807/take-photo-using- adobe-builder-flex-for-iosが最良の例です)

CameraUIとチュートリアルのutilクラスを使用して写真を撮った後、iOS6で[使用]ボタンを押すまでの間に、'fileReady'イベントが発生するまで、完全に47 1-カバ、2カバが必要です。

私の考えでは、Loaderクラスにそれほど長い時間がかかるとは思えません。

このパフォーマンスを改善するために私にできることはありますか?プログラムがハングしたとユーザーが思わないように、急いで待機するUI要素を追加する必要があります。これが私が現在使用している上記のCameraUtil.asのコードです。

// http://stackoverflow.com/questions/11812807/take-photo-using-adobe-builder-flex-for-ios
package classes
{
  import flash.display.BitmapData;
  import flash.display.Loader;
  import flash.display.LoaderInfo;
  import flash.events.Event;
  import flash.events.EventDispatcher;
  import flash.events.IEventDispatcher;
  import flash.events.MediaEvent;
  import flash.filesystem.File;
  import flash.filesystem.FileMode;
  import flash.filesystem.FileStream;
  import flash.media.CameraRoll;
  import flash.media.CameraUI;
  import flash.media.MediaPromise;
  import flash.media.MediaType;
  import flash.utils.ByteArray;

  import mx.graphics.codec.JPEGEncoder;

  import events.CameraEvent;

  [Event(name = "fileReady", type = "events.CameraEvent")]

  public class CameraUtil extends EventDispatcher
  {
    protected var camera:CameraUI;
    protected var loader:Loader;
    public var file:File;

    public function CameraUtil(target:IEventDispatcher=null)
    {
      super(target);

      if (CameraUI.isSupported)
      {
        camera = new CameraUI();
        camera.addEventListener(MediaEvent.COMPLETE, mediaEventComplete);
      }
    } // End CONSTRUCTOR CameraUtil

    public function takePicture():void
    {
      if (camera)
        camera.launch(MediaType.IMAGE);
    } // End FUNCTION takePicture

    protected function mediaEventComplete(event:MediaEvent):void
    {
      var mediaPromise:MediaPromise = event.data;

      if (mediaPromise.file == null)
      {
        // For iOS we need to load with a Loader first
        loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleted);
        loader.loadFilePromise(mediaPromise);
        return;
      }
      else
      {
        // Android we can just dispatch the event that it's complete
        file = new File(mediaPromise.file.url);
        dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file));
      }
    } // End FUNCTION mediaEventComplete

    protected function loaderCompleted(event:Event):void
    {
      var loaderInfo:LoaderInfo = event.target as LoaderInfo;
      if (CameraRoll.supportsAddBitmapData)
      {
        var bitmapData:BitmapData = new BitmapData(loaderInfo.width, loaderInfo.height);
        bitmapData.draw(loaderInfo.loader);
        file = File.applicationStorageDirectory.resolvePath("receipt" + new Date().time + ".jpg");
        var stream:FileStream = new FileStream()
        stream.open(file, FileMode.WRITE);

        var j:JPEGEncoder = new JPEGEncoder();
        var bytes:ByteArray = j.encode(bitmapData);
        stream.writeBytes(bytes, 0, bytes.bytesAvailable);
        stream.close();
        dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file));
      }
    } // End FUNCTION loaderComplete

  } // End CLASS CameraUtil
} // End PACKAGE classes
4

2 に答える 2

1

このプロセスも骨の折れるほど遅いことがわかりました...ただし、JPEGEncoderがこの遅延に大きく貢献しているようです。ここにある最適化されたエンコーダーを使用すると、プロセスを大幅に高速化できます。

http://www.bytearray.org/?p=775

お使いのデバイスにもよりますが、元のデバイスよりも約 2 ~ 4 倍高速です。

省略できるもう 1 つのステップは bitmapData.draw() です。これは、Loader.content を直接使用することにより、同様に低速です。この方法では、別のビットマップ インスタンスのインスタンス化をスキップするため、メモリ使用量が大幅に増加します。

このような:

protected function loaderCompleted(event:Event):void
{
  var loader:Loader = (event.target as LoaderInfo).loader;
  var bitmap:Bitmap = loader.content as Bitmap;
  (...)
}

それでも、誰かが数秒ではなく数ミリ秒で jpg をエンコードできる iOS .ane を作成するのを待っています。しかし、その間に... ;)

于 2013-01-28T09:38:17.380 に答える
1

プロセスからステップを削除することで、遅延の問題を解決できました。このステップは、私自身は (現時点では) 必要ありませんが、他の人は必要かもしれません。したがって、それを削除することは、「合理的と思われるこのプロセスに、なぜ不合理と思われる時間がかかるのか」という疑問に対する答えにはなりません。

外部ファイルではなく BitmapData が必要だったので、代わりに:

カメラ => [スナップ] => メディア プロミス => ローダー => ファイルの書き込み => イベント => ファイルの読み取り => BitmapData を使用

クラスを書き直して、File/AppStorage i/o を削除しました。

カメラ => [スナップ] => メディア プロミス => ローダー => BitmapData を使用

したがって、非常に合理的です(および予想されるコンプ時間)。

しかし、CameraUtil クラスで使用されるメソッドを使用してデータをファイルに書き込むのに非常に長い時間がかかることに、まだ驚いています。これらの画像をファイルに書き出す必要がありますが、ユーザーがサイズを 1024x768 のトリミング領域に縮小し、それらを非常に圧縮された jpg にエンコードするまでは必要ありません。コンプタイム。

誰でも知っています... Adob​​e AIRから(flex経由で)iOSのアプリケーションストレージに1つのファイルを書き込むのに非常に長い時間がかかりますか?

于 2012-12-07T15:10:47.350 に答える