2016-04-28 12 views
5

cordova-plugin-cameraを使用して画像を撮ろうとしています。私は結果をFileまたはBlobオブジェクトにしたいと思います。CordovaカメラはBlobオブジェクトとして画像を取ります

ただし、destinationTypeDATA_URLまたはFILE_URIのいずれかである必要があります。

ドキュメントの状態:

DATAURLは非常にメモリ集約的およびまたはメモリエラーのうち、アプリのクラッシュを引き起こす可能性があります。 <img/

  • ドロー画像にURIをレンダリング

    1. :使用FILEURIまたはNATIVE_URIが可能

  • はしかし、私の知る限り、BLOBにこのようなファイルのURIを変換する手順を取る場合base64で

  • としてキャンバス
  • 読むキャンバス上Blob
  • にBASE64変換

    これはDATAURLを使用するより効率的だとは思えません。だから私は同様にこのためにDATAURLを使用し、ステップ1〜3をスキップすることができます。

    より効率的な方法でBlobオブジェクトとして撮影された画像を取得する方法はありますか?

    答えて

    0

    残念ながら、BLOBをCordovaカメラプラグインから抽出することはできません。

    BLOBを取得する方法は、base64でエンコードされた文字列をBLOBに変換して使用することです。

    BLOBに変換し、sliceSizeに変換する方法(ES6準拠)は、よりメモリ効率が良くなります。

    /** 
    * Turn base 64 image into a blob, so we can send it using multipart/form-data posts 
    * @param b64Data 
    * @param contentType 
    * @param sliceSize 
    * @return {Blob} 
    */ 
    private getBlob(b64Data:string, contentType:string, sliceSize:number= 512) { 
        contentType = contentType || ''; 
        sliceSize = sliceSize || 512; 
    
        let byteCharacters = atob(b64Data); 
        let byteArrays = []; 
    
        for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { 
         let slice = byteCharacters.slice(offset, offset + sliceSize); 
    
         let byteNumbers = new Array(slice.length); 
         for (let i = 0; i < slice.length; i++) { 
          byteNumbers[i] = slice.charCodeAt(i); 
         } 
    
         let byteArray = new Uint8Array(byteNumbers); 
    
         byteArrays.push(byteArray); 
        } 
    
        let blob = new Blob(byteArrays, {type: contentType}); 
        return blob; 
    } 
    
    関連する問題