要控制裝置的相機進行拍照和儲存、讀取照片,可以透過 apache/cordova-plugin-camera 套件進行處理,那如果只是想將圖片做另存的動作呢?那可以選用 devgeeks/Canvas2ImagePlugin 來達成這樣的目標。
首先你可以透過 npm 或是 cordova 來安裝此套件
1 2 3 4
| $ npm install cordova-plugin-canvas2image
$ cordova plugin add https://github.com/devgeeks/Canvas2ImagePlugin.git
|
然後參考 getImageDataURL() by Raul Sanchez 的程式,來達成儲存特定圖片的動作。
其動作如下:
- 透過 Javascript 建立一個 Image DOM 物件
- 在圖片完全載入時(當設定此物件的
src 及完成下載時)會觸發 onLoad 方法
- onLoad 事件中會建立一個內容和
Image 物件一樣的 canvas 物件
- 最後在
try catch 中透過 cordova.exec 來執行 Canvas2ImagePlugin 套件的儲存動作
Image DOM 物件的屬性及事件,可參考 JAVASCRIPT IMAGE ELEMENT。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
function saveImageToPhone(url, success, error) { var canvas, context, imageDataUrl, imageData; var img = new Image(); img.onload = function () { canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; context = canvas.getContext('2d'); context.drawImage(img, 0, 0); try { imageDataUrl = canvas.toDataURL('image/jpeg', 1.0); imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, ''); cordova.exec( success, error, 'Canvas2ImagePlugin', 'saveImageDataToLibrary', [imageData] ); } catch (e) { error(e.message); } }; try { img.src = url; } catch (e) { error(e.message); } }
|
接著在 Cordova 專案中,圖片的儲存位置通常會放在 www 資料夾底下,然而 iOS 和 Android 的 App 路徑有些不一樣,因此建議使用 cordova.file.applicationDirectory 來取得準確的路徑,比較不會有問題,執行範例如下:
1 2 3 4 5 6
| var imagepath = cordova.file.applicationDirectory + 'www/' + filepath; saveImageToPhone( imagepath, function (msg) { console.info('success', msg); }, function (err) { console.error('error', err);} );
|
參考資料: