2013-09-02 2 views
2

사용자가 이미지와 캔버스 요소 모두에 사진을 선택할 수있게하는 것이 목표입니다.캔버스 컨텍스트 drawImage가 iPhone에서 실패하는 이유

이 코드가 Firefox, Chrome, IE, iPad에서는 작동하지만 iPhone에서는 작동하지 않는 이유는 무엇입니까? iPhone 3GS 또는 iPhone 5에서는 캔버스 (빨간색 테두리)가 정확한 크기로 표시됩니다.

iPhone 화면 캡처에는 작동하지만 사진에는 작동하지 않는 것 같습니다. Web Inspector는 우리에게 아무것도주지 않습니다.

<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> 

답변

2

우리는 지금 여기에 두 가지 문제로 배운, 하나는 https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html#//apple_ref/doc/uid/TP40006482-SW15에 설명 모바일 사파리의 메모리 제한 사항입니다. 이것은 캔버스에 이미지의 일부를 추가하는 것보다는 한 번에 모두를 추가함으로써 극복 할 수 있습니다. 다음 제한은 모바일 사파리가 결과 캔버스 이미지를 잘못 스케일링하는 문제입니다.

우수한 메가 픽셀 이미지 렌더링 라이브러리 @https://github.com/stomita/ios-imagefile-megapixel을 사용하면이 두 가지 문제를 피할 수 있습니다.

-2

위의 내 지식에 따르면 스크립트는 IPad에서도 작동하지 않습니다.

관련 문제