uploadImage(filePath: string, camera: boolean = false) {
try {
let options: CameraOptions;
if (camera) {
options = {
quality: 40,
destinationType: this._camera.DestinationType.DATA_URL,
encodingType: this._camera.EncodingType.JPEG,
mediaType: this._camera.MediaType.PICTURE,
correctOrientation: true
}
} else {
options = {
destinationType: this._camera.DestinationType.DATA_URL,
sourceType: this._camera.PictureSourceType.PHOTOLIBRARY,
encodingType: this._camera.EncodingType.JPEG,
mediaType: this._camera.MediaType.PICTURE
}
}
this._camera.getPicture(options).then((imageData) => {
const photo = `data:image/jpeg;base64,${imageData}`;
const fileRef = this._afs.ref(filePath);
const task = fileRef.putString(photo, 'data_url');
task.snapshotChanges().pipe(
finalize(() => {
// execute other actions
fileRef.getDownloadURL().subscribe(url => {
if (url) {
this.fileUploadUrl.next(url);
}
})
let toast = this.toastCtrl.create({
message: 'Image upload successfully',
position: 'bottom',
duration: 3000
});
toast.present();
})
).subscribe();
})
} catch (e) {
console.error(e);
let toast = this.toastCtrl.create({
message: 'Image upload cancelled',
position: 'bottom',
duration: 3000
});
toast.present();
}
}
(从实际的iOS设备上)拍照后,有时会崩溃,有时会正常工作。如果使用前置摄像头,它将始终正常工作。
但是,如果我使用后置摄像头,则在选定图片后,它会闪烁白屏,然后重新启动应用程序。我怀疑这与图像尺寸或分辨率有关。有时,如果我使用后置摄像头拍摄非常低的分辨率照片(例如在弱光环境中),则上传的效果很好。我在网上进行了一些研究,有人建议使用带有--prod
标志的生产模式运行该应用程序,但并不能解决问题。
我还尝试将质量值降低到一个较低的数字,但这对于后置摄像头仍然无效。
我非常确定插件已正确添加,并且隐私设置也正确,否则它将不允许我拍照。
答案 0 :(得分:0)
是的,您是对的。使用带DataURL(即Base64)的相机拍照时。由于图片的大小和质量,我们可能会遇到内存问题。您的质量为'40'很好。对于宽度和高度,您可以设置300px左右。
图像尺寸越大,图像尺寸越大,这将影响内存。
答案 1 :(得分:0)
这不是您查询的合适解决方案,但是在浪费了很多时间之后,我尝试缩小图像并将其保持在2mb以下,并且效果很好。您可以通过指定targetWidth来减小图像尺寸和targetHeight。我将它们都保持在500以下。
const options: CameraOptions = {
quality: 30, // picture quality
destinationType: this.camera.DestinationType.DATA_URL,
sourceType: this.camera.PictureSourceType.CAMERA,
encodingType: this.camera.EncodingType.PNG,
mediaType: this.camera.MediaType.PICTURE,
cameraDirection: this.camera.Direction.FRONT,
allowEdit: true,
correctOrientation :false,
targetWidth: 400,
targetHeight: 400,
}