Общая картина здесь в том, что я пытаюсь заставить фотогалерею работать с большим количеством фотографий. В настоящее время я использую необработанный URL-адрес изображений в качестве эскизов галереи, что невероятно медленно и быстро приводит к сбою старых устройств.
Я хотел бы создать миниатюру каждой фотографии, снятой камерой моего приложения, и сохранить их либо локально, либо в серверной базе данных. Однако я не нашел хорошего решения.
Я попробовал здесь плагин для миниатюр, но после установки моя сборка не удалась. Я думаю, что это поддерживает только Cordova до 2.9, а я использую 3.3:
https://github.com/maxbasmanov/PhoneGap_Thumbnailer
В любом случае, мой следующий план - использовать холст HTML5, чтобы изменить размер изображения в точке захвата и сохранить его вместе с изображением в полном разрешении. С трудом справляясь с этим. Я успешно снимаю изображения с помощью плагина для захвата мультимедиа, который сохраняет в любую папку, которая мне нравится. Кажется, я не могу прочитать этот файл с помощью fileReader.
URL-адреса mediaFile выглядят так: file: /storage/emulated/0/DCIM/Camera/235243652435123.jpg и FileSystem: cdvfile: // localhost / persistent
Метод filesystem.root.getFile не работает с 5: undefined. Может, я ошибаюсь?
Вот мой код:
function captureSuccess(mediaFiles) {
function gotFS(fileSystem) {
for (var a in mediaFiles) {
alert('file fullpath: ' + mediaFiles[a].fullPath);
alert('filesystem URL: ' + fileSystem.root.toURL());
window.resolveLocalFileSystemURL(mediaFiles[a].fullPath, function(fileEntry) {
fileEntry.file(function(fileObj) {
alert(JSON.stringify(fileObj));
newimageURI = fileObj.localURL;
alert(newimageURI);
},
function(error) {
alert('get fileEntry error: ' + error.message);
});
},
function(error) {
alert('resolve error: ' + error.message);
});
fileSystem.root.getFile(mediaFiles[a].fullPath, {create: false}, gotFileEntry, fail);
};
}
function gotFileEntry(fileEntry) {
alert('got fileentry');
fileEntry.file(gotFile, fail);
}
function gotFile(file){
alert('got file');
resizeFile(file);
}
function readDataUrl(file) {
var reader = new FileReader();
reader.onloadend = function(evt) {
console.log("Read as data URL");
console.log(evt.target.result);
};
reader.readAsDataURL(file);
}
function fail(error) {
alert(error.code + ': ' + error.message);
}
function resizeFile(file) {
alert('resize initiated');
var reader = new FileReader();
reader.onloadend = function(evt) {
alert('read data: ' + evt.target.result);
var tempImg = new Image();
tempImg.src = file;
tempImg.onload = function() {
var MAX_WIDTH = 250;
var MAX_HEIGHT = 250;
var tempW = tempImg.width;
var tempH = tempImg.height;
if (tempW > tempH) {
if (tempW > MAX_WIDTH) {
tempH *= MAX_WIDTH / tempW;
tempW = MAX_WIDTH;
}
} else {
if (tempH > MAX_HEIGHT) {
tempW *= MAX_HEIGHT / tempH;
tempH = MAX_HEIGHT;
}
}
var canvas = document.createElement('canvas');
canvas.width = tempW;
canvas.height = tempH;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0, tempW, tempH);
var dataURL = canvas.toDataURL("image/jpeg");
alert('image: ' + JSON.stringify(dataURL));
}
}
reader.readAsDataURL(file);
}
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);