2014-04-22 15 views
1
<script> 
    var canvas = document.getElementById('myCanvas'); 
    var context = canvas.getContext('2d'); 
    var img = new Image(); 
    img.onload = function(){ 
    canvas.width=img.width; 
    canvas.height=img.height; 
    context.drawImage(img,0,0); 
    } 
    img.src="2.jpg"; 
    function compress(){ 
    var dataURL = canvas.toDataURL("image/jpg",0.5); 
    document.getElementById("img").src=dataURL; 
    }   
    setTimeout(compress,1000); 
</script> 

예 : drawImage() 대신 fillRect()으로 사용하려고했습니다. 정상적으로 작동합니다 ... 이유는 다음과 같습니다. drawImage()drawImage() 이후 Canvas (JS) toDataUrl()이 작동하지 않는 이유는 무엇입니까?

+1

테스트중인 코드에서 이미지의 * 실제 * URL은 무엇입니까? 특히 코드가있는 페이지와 동일한 도메인에 있습니까? – Pointy

+0

또한 이미지 "onload"콜백에 "compress"를 호출해야합니다. 당신은 이미지 HTTP 요청에 의존하여 1 초 이내에 끝내기도하지만, 실제로는 그렇지 않을 수도 있습니다. – Pointy

답변

2

이미지 URL (데이터 URL이 아닌 원본 URL)이 코드가 실행되는 페이지와 다른 도메인에있는 경우 캔버스는 이미지를 그릴 때 오염 된이되며 픽셀을 다시 가져올 수 없습니다. 그것은 보안 조치입니다. 따라서 jsfiddle에서 테스트 중이며 테스트 할 URL이 http://placekitten.com/100/100 인 경우 작동하지 않습니다.

대부분의 최신 브라우저는 두 개의 file:// URL이 도메인을 공유하는 것으로 간주하지 않으므로 로컬 파일에서 테스트를 실행하는 경우에는 작동하지 않습니다.

+0

실제로 이미지와 페이지는 동일한 도메인에 있으며 URL에는 "file : //"이 없습니다. 그게 당신의 해결책이 작동하지 않는 이유입니다. ( – user3560634

+0

@ user3560634 그럼 더 많은 정보를 제공해야하거나, 문제를 일으킬 수있는'setTimeout()'해킹을 시도하십시오. – Pointy

+0

@ user3560634 [여기 있습니다 (http://gutfullofbeer.net/imgtst/) 내가 변경 한 것은 시간 초과를 없애고 호출을 "이미지로 압축"하는 것입니다. "load "핸들러, 이미지가 캔버스에 그려진 후 – Pointy