【问题标题】:Using canvas to download an image increases the file's size使用画布下载图像会增加文件的大小
【发布时间】:2018-08-02 01:36:08
【问题描述】:

当我尝试使用画布操作图像时,不做任何修改,我的图像文件大小会明显大于原始文件。

请您解释一下为什么会发生这种情况以及如何避免这种情况?

https://jsfiddle.net/95rnh4yj/

function one(selector) {
  return document.querySelector(selector);
}

function on(element, event, listener) {
  element.addEventListener(event, listener);
}

function blobToUrl(blob) {
  return Promise.resolve(URL.createObjectURL(blob));
}

function urlToImg(url) {
  return new Promise(function (resolve) {
    let
    img = new Image();

    img.src = url;

    on(img, 'load', function (event) {
       resolve(event.target);
    });
  });
}

function imgToBlob(img) {
  return new Promise(function (resolve) {
    let
    canvas = document.createElement('canvas'),
    context = canvas.getContext('2d');

    canvas.height = img.naturalHeight;
    canvas.width = img.naturalWidth;
    context.fillStyle = 'transparent';
    context.fillRect(0, 0, canvas.width, canvas.height);
    context.save();
    context.drawImage(img, 0, 0);
    canvas.toBlob(resolve, 'image/jpeg', 1);
  });
}

function writeSrc(src) {
  one('a').href = src;
}

on(one('input'), 'change', function(event) {
  blobToUrl(event.target.files[0])
  .then(urlToImg)
  .then(imgToBlob)
  .then(blobToUrl)
  .then(writeSrc);
})

【问题讨论】:

  • 你的意思是文件更大吗?数据通常不重要。我开玩笑的,当然。试用您的代码后,我看到图像的大小增加了 5 倍。浏览器内的 Javascript 可能不太擅长图像处理。

标签: javascript image html5-canvas


【解决方案1】:

如果您的问题是文件大小,请更改您的质量设置。
目前您将其设置为 100。将其更改为例如0.95

function imgToBlob(img) {
  return new Promise(function (resolve) {
    let
    canvas = document.createElement('canvas'),
    context = canvas.getContext('2d');

    canvas.height = img.naturalHeight;
    canvas.width = img.naturalWidth;
    context.fillStyle = 'transparent';
    context.fillRect(0, 0, canvas.width, canvas.height);
    context.save();
    context.drawImage(img, 0, 0);
    canvas.toBlob(resolve, 'image/jpeg', 0.95); // <-----
  });
}

尝试省略质量设置,看看是否可行:

function imgToBlob(img) {
  return new Promise(function (resolve) {
    let
    canvas = document.createElement('canvas'),
    context = canvas.getContext('2d');

    canvas.height = img.naturalHeight;
    canvas.width = img.naturalWidth;
    context.fillStyle = 'transparent';
    context.fillRect(0, 0, canvas.width, canvas.height);
    context.save();
    context.drawImage(img, 0, 0);
    canvas.toBlob(resolve, 'image/jpeg');
  });
}

省略质量设置对我来说会产生最佳效果 (Jsfiddle)。

148kb -> 154kb (jpeg to jpeg)
102kb -> 119Kb

【讨论】:

  • 谢谢,但是,总是更大......我不明白为什么我不能保持原始质量。
  • 我不认为有办法猜测原始压缩:/
  • 谢谢。根据我的测试,我需要大约 0.85 来保持相同或更少的大小。
  • @Lcf.vs 这将取决于使用的图像。我不知道此功能的用例是什么,但请记住,除非您首先找出压缩率,否则您将获得改变的质量。
猜你喜欢
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
相关资源
最近更新 更多