将相机捕获的图像转换为 base64 - Ionic
convert camera capture image to base64 - Ionic
我已经按照这个 fiddler example Image to Base64 进行了操作。当我使用直接图像路径 link 时它工作正常,但当我传递相机图像时它失败了。
Camera.getPicture().then(function(imageURI) {
var imageUrl = "http://upload.wikimedia.org/wikipedia/commons/4/4a/Logo_2013_Google.png";
convertImgToDataURLviaCanvas(imageUrl, function(base64Img) {
alert(base64Img);
});
var result = convertImgToDataURLviaCanvas(imageURI);
}, function(err) {
alert(err);
}, {
quality: 75,
targetWidth: 320,
targetHeight: 320,
pictureSource: navigator.camera.PictureSourceType.PHOTOLIBRARY,
destinationType: navigator.camera.DestinationType.FILE_URI,
saveToPhotoAlbum: true
});
function convertImgToDataURLviaCanvas(url, callback, outputFormat) {
var img = new Image();
img.crossOrigin = 'Anonymous';
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.height;
canvas.width = this.width;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL(outputFormat);
alert(dataURL + "GANESH" + outputFormat);
callback(dataURL);
alert('5');
canvas = null;
};
img.src = url;
}
在这里,如果我给出图像的直接路径它可以工作但是当我使用相机图像时它不起作用。帮帮我..提前致谢。
无需自己编写base64转换器。设置 属性 Camera.DestinationType.DATA_URL
后,该插件将为您完成
destinationType : Camera.DestinationType.DATA_URL
设置 属性 后,Camera.getPicture()
现在将 return 一个 base64
版本的照片。
Camera.getPicture().then(function(imageURI) {
console.log(imageURI) //base64 photo
});
虽然我同意使用 DATA_URL 是最简单的答案,但它确实有一个主要缺点。来自离子相机所基于的cordova-plugin-camera docs:
DATA_URL can be very memory intensive and cause app crashes or out of memory errors. Use FILE_URI or NATIVE_URI if possible
本质上,在内存较低(或后台内存使用率较高)的手机上,您的应用程序有可能在垃圾回收期间被终止并重新启动,因为从技术上讲,当本机相机打开时它处于后台(暂停)。
但是,避免 DATA_URL 更像是一种创可贴,因为其他数据源仍然容易受到同样问题的影响,尽管由于内存使用率较低而较少受到影响。关于 Android 生命周期的 cordova 文档提供了有关该问题的更多详细信息:
https://cordova.apache.org/docs/en/latest/guide/platforms/android/#lifecycle-guide
问题(可能)是行:
img.crossOrigin = 'Anonymous';
This doc 说明方法 toDataUrl()
不适用于 'tainted canvas'。当您将 crossOrigin
设置为 'Anonymous' 时,canvas 被污染。
我还没有测试过这个理论。刚读 the doc。
我已经按照这个 fiddler example Image to Base64 进行了操作。当我使用直接图像路径 link 时它工作正常,但当我传递相机图像时它失败了。
Camera.getPicture().then(function(imageURI) {
var imageUrl = "http://upload.wikimedia.org/wikipedia/commons/4/4a/Logo_2013_Google.png";
convertImgToDataURLviaCanvas(imageUrl, function(base64Img) {
alert(base64Img);
});
var result = convertImgToDataURLviaCanvas(imageURI);
}, function(err) {
alert(err);
}, {
quality: 75,
targetWidth: 320,
targetHeight: 320,
pictureSource: navigator.camera.PictureSourceType.PHOTOLIBRARY,
destinationType: navigator.camera.DestinationType.FILE_URI,
saveToPhotoAlbum: true
});
function convertImgToDataURLviaCanvas(url, callback, outputFormat) {
var img = new Image();
img.crossOrigin = 'Anonymous';
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.height;
canvas.width = this.width;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL(outputFormat);
alert(dataURL + "GANESH" + outputFormat);
callback(dataURL);
alert('5');
canvas = null;
};
img.src = url;
}
在这里,如果我给出图像的直接路径它可以工作但是当我使用相机图像时它不起作用。帮帮我..提前致谢。
无需自己编写base64转换器。设置 属性 Camera.DestinationType.DATA_URL
destinationType : Camera.DestinationType.DATA_URL
设置 属性 后,Camera.getPicture()
现在将 return 一个 base64
版本的照片。
Camera.getPicture().then(function(imageURI) {
console.log(imageURI) //base64 photo
});
虽然我同意使用 DATA_URL 是最简单的答案,但它确实有一个主要缺点。来自离子相机所基于的cordova-plugin-camera docs:
DATA_URL can be very memory intensive and cause app crashes or out of memory errors. Use FILE_URI or NATIVE_URI if possible
本质上,在内存较低(或后台内存使用率较高)的手机上,您的应用程序有可能在垃圾回收期间被终止并重新启动,因为从技术上讲,当本机相机打开时它处于后台(暂停)。
但是,避免 DATA_URL 更像是一种创可贴,因为其他数据源仍然容易受到同样问题的影响,尽管由于内存使用率较低而较少受到影响。关于 Android 生命周期的 cordova 文档提供了有关该问题的更多详细信息:
https://cordova.apache.org/docs/en/latest/guide/platforms/android/#lifecycle-guide
问题(可能)是行:
img.crossOrigin = 'Anonymous';
This doc 说明方法 toDataUrl()
不适用于 'tainted canvas'。当您将 crossOrigin
设置为 'Anonymous' 时,canvas 被污染。
我还没有测试过这个理论。刚读 the doc。