2016-04-28 18 views
5

cordova-plugin-camera kullanarak fotoğraf çekmeye çalışıyorum. Sonuç, File veya Blob nesnesi olmasını isterim. Bununla birlikte, destinationType, veya FILE_URI numaralı telefonlardan biri olmalıdır.Cordova kamera resmi Blob nesnesi olarak çek

dokümanlar durumu:

DATAURL yoğun çok anı ve uygulama çökmelerine neden veya bellek hataları dışında olabilir. Bir <img/

  • Çizim resmin üzerine uri Rendering

    1. : Kullanım FILEURI veya NATIVE_URI mümkün

  • Ancak, bildiğim kadarıyla söyleyebilirim, Kabarcık için böyle bir dosya URI dönüştürme adımları alırsa bir tuval üzerinde base64 olarak

  • Oku tuval
  • dönüştürme base64 Blob
  • için

    Bunun, DATAURL'u kullanmadan daha verimli olduğuna inanmak zor. Bu yüzden DATAURL'u bu şekilde kullanabilir ve 1-3 arası adımları atlayabilirim.

    Blob nesnesi daha verimli bir şekilde alınmış bir resim almanın bir yolu var mı?

    cevap

    0

    Ne yazık ki Cordova kamera eklentisinden BLOB çıkarılamıyorsunuz.

    BLOB'u almanın yolu, base64 kodlanmış dizginizi BLOB'a dönüştürmektir ve bunu kullanın.

    Daha fazla bellek verimli olması için BLOB ve sadece sliceSize'a dönüştürmenize izin veren bir yöntem (ES6 uyumlu).

    /** 
    * 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; 
    }