【发布时间】:2014-04-07 07:26:33
【问题描述】:
这里的大局是我正在尝试让一个照片库为大量照片工作。目前我正在使用图像的原始 URL 作为画廊缩略图,这非常慢并且很快就会使旧设备崩溃。
我想为使用我的应用程序的相机拍摄的每张照片创建一个缩略图,并将其存储在本地或后端数据库中。但是,我还没有找到好的解决方案。
我在这里尝试了缩略图插件,但安装后构建失败。我认为这只支持高达 2.9 的 Cordova,而我正在使用 3.3:
https://github.com/maxbasmanov/PhoneGap_Thumbnailer
无论如何,我的下一个计划是使用 HTML5 画布在捕获点调整图像大小并将其与全分辨率图像一起保存。很难把这个拉下来。我正在使用媒体捕获插件成功捕获图像,该插件可以保存到任何感觉的文件夹中。我似乎无法使用 fileReader 实际读取该文件。
mediaFile URL 如下所示:file:/storage/emulated/0/DCIM/Camera/235243652435123.jpg 和文件系统: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);
【问题讨论】:
-
如果在 file:// url 上使用 resolveLocalFileSystemURL() 来获取文件条目会发生什么?
-
在 resolveLocalFileSystemURL() 代码中添加了一些错误处理程序并再次尝试。 “未定义”是错误消息。
-
你在 resolveLocalFileSystemURL 调用中得到了这个?
-
正确。 rLFSURL 中的第一个错误处理程序使用“解决错误:未定义”调用。另一个问题:我从媒体捕获插件获得的文件 URL 和 URI 有什么区别?我很难理解它们是否是同一件事......感谢您坚持这一点!
-
呃,你让我来了。您使用什么平台进行测试?
标签: cordova thumbnails filereader image-capture