在调整图像大小后,减少fabric.js序列化的JSON大小

时间:2015-01-28 18:27:10

标签: javascript html5-canvas fabricjs

使用文件输入和FileReader将图像加载到结构画布。我们使用scaleToWidth和scaleToHeight来使大型照片适合画布。

当我使用选择一个大的3.2MB jpeg时,图像很好地调整为1MB,这是我们想要的。然后,我们准备数据以存储在本地索引数据库中;

    canvas.toJSON(); // 4.2MB
    canvas.toDataURL(); // 1MB

似乎toJSON方法存储了原始jpeg。我们可以在序列化之前减少jpeg吗?

我更喜欢序列化为JSON,以便将来可以使用其他出色的Fabric功能。

2 个答案:

答案 0 :(得分:2)

我们有这个想法;

  1. 将照片加载到Fabric.js画布
  2. 然后导出它(将图像缩小为画布尺寸)和
  3. 在画布上重新加载缩小的图像数据
  4. 删除原始全尺寸照片。
  5. 现在,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);
?>