使用文件输入和FileReader将图像加载到结构画布。我们使用scaleToWidth和scaleToHeight来使大型照片适合画布。
当我使用选择一个大的3.2MB jpeg时,图像很好地调整为1MB,这是我们想要的。然后,我们准备数据以存储在本地索引数据库中;
canvas.toJSON(); // 4.2MB
canvas.toDataURL(); // 1MB
似乎toJSON方法存储了原始jpeg。我们可以在序列化之前减少jpeg吗?
我更喜欢序列化为JSON,以便将来可以使用其他出色的Fabric功能。
答案 0 :(得分:2)
我们有这个想法;
现在,fabric.js画布数据很好地减少了存储在本地indexeddb;
// camera image // 3.2 MB
canvas.toJSON(); // 1 MB
canvas.toDataURL(); // 1 MB
的javascript
var reader = new FileReader();
reader.onload = function (event) {
var img = new Image();
var opts = {};
img.onload = function () {
var imgInstance = new fabric.Image(img, opts);
if (imgInstance.getWidth() > canvas.getWidth()) {
imgInstance.scaleToWidth(canvas.getWidth());
}
if (imgInstance.getHeight() > canvas.getHeight()) {
imgInstance.scaleToHeight(canvas.getHeight());
}
canvas.add(imgInstance);
canvas.renderAll();
img = null;
/* now that the image is loaded reduce it's size
so the original large image is not stored */
/* assumes photo is object 0, need to code a function to
find the index otherwise */
var photoObjectIx = 0;
var originalPhotoObject = canvas.getObjects()[photoObjectIx];
var nimg = new Image();
nimg.onload = function () {
var imgInstance = new fabric.Image(nimg, { selectable: false });
canvas.remove(originalPhotoObject);
canvas.add(imgInstance);
canvas.renderAll();
nimg = null;
};
nimg.src = originalPhotoObject.toDataURL();
}
img.src = event.target.result;
}
reader.readAsDataURL(e.target.files[0]);
答案 1 :(得分:1)
我个人压缩大json数据,然后在服务器上解压缩...
Deflate in JS - gzdeflate
(压缩)JSON
的好脚本。
然后......在PHP中:
<?php
$json = gzinflate($HTTP_RAW_POST_DATA);
?>