【问题标题】:Image resize with HTML5 Canvas - Distortion使用 HTML5 Canvas 调整图像大小 - 失真
【发布时间】:2013-07-18 21:48:54
【问题描述】:

我正在开发一个 Webworks 应用程序,我需要调整图像大小以上传到服务器。我正在使用 JQuery Mobile,该应用程序需要在 OS6 及更高版本上运行。用户可以使用相机或从设备中选择图像。相关代码如下:

function handleOpenedFile(fullPath, blobData) {
            var image = new Image();
            image.src = fullPath; //path to image
            image.onload = function () {
                var resized = resizeMe(image); // send it to canvas
                //Do stuff with the DataURL returned from resizeMe()
            };
    }

function resizeMe(img) {

        var canvas = document.createElement('canvas');
        var width = Math.round(img.width / 2);
        var height = Math.round(img.height / 2);
        canvas.width = width;
        canvas.height = height;
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0, width, height);
        return canvas.toDataURL("image/jpeg", 0.8);
    }

然后我使用 DataURL 中的 Base64 来上传到服务器。图像被缩放,但它们出现乱码。部分图像四处移动,颜色变得奇怪。如果您在画布上绘制而不进行任何缩放,图像就会出现乱码,并不是缩放本身会弄乱图像。

我已经广泛搜索了 SO 和 BB Dev 论坛,但没有成功。

有没有人知道如何解决这个问题或有其他建议来调整图片大小以供上传?

【问题讨论】:

  • 伙计,哦伙计。这个问题对我来说是一个讨厌的问题。 iOS 6 于去年秋天问世,增加了从相机/相机胶卷捕捉的能力。我还需要使用 Canvas 调整大小。执行调整大小/旋转时,画布调整大小会导致严重问题。看看这篇文章:stackoverflow.com/questions/11929099/…。最后,我写了一个修复问题的小库,类似于此(但在此之前):github.com/stomita/ios-imagefile-megapixel.
  • 抱歉,笔记本电脑在我提交更相关的评论之前就死机了。在 iOS 上,这个问题只是由于对大图像进行二次采样而发生的。谷歌快速搜索显示,在黑莓上,至少有一个人对大图像supportforums.blackberry.com/t5/Web-and-WebWorks-Development/… 有一些问题。您可以将小图像(例如 100 x 100 像素)下载到您的设备上,选择该图像,然后查看是否存在相同的问题。
  • 感谢您的建议,我查看了 BB​​ 论坛主题,并尝试了该百万像素库,但没有成功。我已经用我找到的解决方案回答了我自己的问题。
  • 太棒了,很高兴您找到了解决方案。这些问题在 iOS 上似乎也有奇怪的解决方案。在 Android 上,我们看到 toDataURL 的问题并非始终如一地包括数据 URL 中的 MIME 类型。如果他们都像他们应该的那样工作,那就太好了:)

标签: html jquery-mobile html5-canvas blackberry-webworks


【解决方案1】:

我已经设法解决了这个问题,尽管我不知道它为什么起作用。简单替换

return canvas.toDataURL("image/jpeg", 0.8);

return canvas.toDataURL();

这将返回一个 base64 编码的字符串,其中包含正确调整大小的图像,没有任何奇怪的视觉伪影。

【讨论】:

    【解决方案2】:

    无法帮助 JQuery 移动、在 OS6 上运行的应用程序或在 DataURL 中使用 Base64 上传到服务器,但您的函数 resizeMe 的代码不会将画布放在 HTML 文档中的任何位置。

    下面添加了必填行。

    函数 resizeMe(img) {

        var canvas = document.createElement('canvas');
        var width = Math.round(img.width / 2);
        var height = Math.round(img.height / 2);
        canvas.width = width;
        canvas.height = height;
        var ctx = canvas.getContext("2d");
        document.body.appendChild(canvas);   //append canvas child to body <<<<-----------
        ctx.drawImage(img, 0, 0, width, height);
        return canvas.toDataURL("image/jpeg", 0.8);
    }
    

    如果在下面的 jsfiddle 中遗漏了这条额外的行,您将根本看不到任何图像,使用它您会得到正确形成的缩放图像。小提琴适用于我的安卓智能手机。

    http://jsfiddle.net/FeALQ/

    【讨论】:

    • 我从来没有真正想要显示图像,我只是使用画布使图像更小,以最大限度地减少上传时的数据成本。不过会试一试,让你知道会发生什么。
    • 感谢您的建议 jing,它帮助我意识到 toDataURL 方法是这种情况的罪魁祸首。如果可以的话,我会投票:)
    猜你喜欢
    • 2012-12-05
    • 2013-01-04
    • 2023-03-22
    • 2014-04-10
    • 2014-12-27
    • 2013-04-14
    • 2017-11-22
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多