目的是让用户选择在图像和画布元素上显示的照片。

为什么此代码在Firefox,Chrome,IE,iPad上却不能在iPhone上运行?在iPhone 3GS或iPhone 5上,画布(红色边框)仅显示为空白,尽管尺寸正确。

它似乎确实适用于iPhone屏幕快照,但不适用于照片。 Web检查器没有给我们任何东西。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
    <title></title>
    <style type="text/css">
    html, body{font-size:120%;}
    #diag{ font-family:'Courier New';}
    img{border:2px solid blue;}
    canvas{border:2px solid red;}
    </style>
    <script type="text/javascript">
    var reader = new FileReader();
    var prev;
    function go() {
        prev = new Date();
        diag('');
        diag('start');
        var imgFile = document.getElementById('submitfile');
        if (imgFile.files && imgFile.files[0]) {
        reader.onloadend = function () {
            diag('reader.onloadend');
            diag('reader.result.length=' + (reader.result.length / 1024.0 / 1024.0).toFixed(4) + "mb");
            var img = new Image();
            img.onload = function () {
              diag('img.onload');
              var cvs = document.createElement("canvas");
              var ctx = cvs.getContext("2d");
              diag("img.width:" + this.width);
              diag("img.height:" + this.height);
              cvs.width = this.width;
              cvs.height = this.height;
              diag("cvs.width:" + cvs.width);
              diag("cvs.height:" + cvs.height);
              ctx.drawImage(this, 0, 0);
              ctx.font = '18pt Calibri';
              ctx.fillStyle = 'red';
              ctx.fillText('CANVAS COPY', 100, 100);
              document.body.appendChild(cvs); // new canvas
              document.body.appendChild(this); // img element
              diag('ctx.drawImage');
            };
            img.src = reader.result;
        }
        }
        reader.readAsDataURL(imgFile.files[0]);
        diag('reader.readAsDataURL');
    }
    function diag(msg) {
        var now = new Date();
        var ms = now.getTime() - prev.getTime();
        var current_diag_text = document.getElementById("diag").innerHTML;
        var new_diag_text = ms + "ms " + msg + "<br/>" + current_diag_text;
        if (msg === '') {
        document.getElementById("diag").innerHTML = '';
        } else {
        document.getElementById("diag").innerHTML = new_diag_text;
        }
        prev = now;
    }
    </script>
</head>
<body>
    <form name="Upload" action="#" enctype="multipart/form-data" method="post">
    <p id="diag"></p>
    <p>Choose Photo: <input type="file" name="submitfile" id = "submitfile" />
    <input type="button" value="Send" onclick="go();" /></p>
    </form>
</body>
</html>

最佳答案

现在,我们在这里了解到两个问题,一个是https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html#//apple_ref/doc/uid/TP40006482-SW15中描述的移动Safari的内存限制。可以通过将图像的一部分而不是一次性全部添加到画布中来解决此问题。下一个限制是移动浏览器无法正确缩放生成的画布图像的问题。

通过使用出色的兆像素图像呈现库@ https://github.com/stomita/ios-imagefile-megapixel可以避免这两个问题。

10-07 20:33