2016-04-28 16 views
5

Tôi đang cố gắng chụp ảnh bằng cách sử dụng cordova-plugin-camera. Tôi muốn kết quả là đối tượng File hoặc Blob.Máy ảnh Cordova chụp ảnh làm đối tượng Blob

Tuy nhiên, destinationType phải là một trong số DATA_URL hoặc FILE_URI.

Các tài liệu nhà nước:

DATAURL có thể rất nhớ thâm canh và gây ra tai nạn ứng dụng hoặc ra lỗi bộ nhớ. Sử dụng FILEURI hoặc NATIVE_URI nếu có thể

Tuy nhiên, như xa như tôi có thể nói, chuyển đổi như một uri tập tin vào một Blob có các bước sau:

  1. Rendering uri trên một hình ảnh <img/
  2. Draw trên vải
  3. đọc vải dưới dạng base64
  4. Chuyển đổi base64 để Blob

Tôi thấy khó tin rằng điều này hiệu quả hơn sử dụng DATAURL. Vì vậy, tôi cũng có thể sử dụng DATAURL cho điều này và bỏ qua các bước 1-3.

Có cách nào để chỉ chụp ảnh dưới dạng đối tượng Blob theo cách hiệu quả hơn không?

Trả lời

0

Thật không may, bạn không thể trích xuất một BLOB từ plugin máy ảnh Cordova.

Cách để có được BLOB là chuyển đổi chuỗi được mã hóa base64 thành BLOB và sử dụng.

Đây là một phương pháp (tuân thủ ES6) cho phép bạn chuyển đổi thành BLOB và chỉ sliceSize để tiết kiệm bộ nhớ hơn.

/** 
* 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; 
} 
Các vấn đề liên quan