html2canvas 외부 이미지 로드와 CORS

html2canvas 외부 이미지 로드와 CORS

작성일 2023.04.24댓글 1건
    게시물 수정 , 삭제는 로그인 필요

html 페이지에서 버튼을 클릭하면 박스 영역이 캡쳐되어 저장되게 할려고 합니다.

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>무제 문서</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="js/html2canvas.js"></script>
</head>
<body>
<div id="capture_area">
      <p> 캡쳐할 영역 </p>
<img src="image/image.jpg">
      <p>&nbsp;</p>
</div>
<button type="button" class="btn_download">이미지 저장하기</button>

<script>
$(function(){
    $(".btn_download").click(function(e){
        html2canvas(document.getElementById("capture_area")).then(function(canvas) {
            var el = document.createElement("a")
            el.href = canvas.toDataURL("image/jpeg")
            el.download = '이미지.jpg' //다운로드 할 파일명 설정
            el.click()
        })
    })
})
</script>
</body>
</html>

위와 같이 만들었을 때 로컬에서 가지고 온 이미지인 <img src="image/image.jpg"> 가 들어가면 
캡쳐가 안되네요 인터넷에 찾아보니 CORS 정책인 보안 문제로 외부 이미지가 있으면 캡쳐가 안된다고 하는데 해결 방법 없을까요? 고수님들 위 코드 수정하여 캡쳐가 되도록 도와주실 분 없을까요?


#html2canvas 외부 이미지 캡쳐

profile_image 익명 작성일 -

해결방법이 없는건 아닙니다.

1. nginx와 같은 웹서버 설치

http://nginx.org/en/docs/windows.html

2. 이미지를 base64 문자열로 변환

3. 크롬 웹 브라우저의 web-security(웹 보안 관련 정책)을 비활성화

https://i5i5.tistory.com/935

3번은 보안이슈로 비추이고

1번은 웹서버 설치후 작성하신 html을

127.0.0.1/test.html 과 같이 불러오시면 됩니다.

CORS (교차 출처 요청) 정책 에 대해 알아보면

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

html2canvas.js 파일의 5795라인에 보시면 html2canvas는 XMLHttpRequest 를 사용합니다.

XMLHttpRequest 는 다음 스키마로 온 요청만 허용합니다.

- blob://

- data://

- HTTP(s)

참고: https://fetch.spec.whatwg.org/#main-fetch

로컬에서 이미지를 불러오면 file:///D:/images/이미지.jpg 와 같은 형식이 되어버립니다.

따라서 Chrome과 같은 브라우저는 file:// 형식 데이터를 불투명 출처로 간주하게되어 동일한 출처로 취급하지 않으며 XMLHttpRequest 에서 사용이 불가합니다.

다음과 같이 2번 방법을 사용하셔도 됩니다.

<!doctype html> <html> <head> <meta charset="utf-8"> <title>무제 문서</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="../js/html2canvas.js"></script> </head> <body> <input id="inp" type="file"> <p id="b64"></p> <div id="capture_area"> <p> 캡쳐할 영역 </p> <img id="img" src="images/719C2rNZXPL._UF1000,1000_QL80_.jpg"> <p>&nbsp;</p> </div> <button type="button" class="btn_download">이미지 저장하기</button> <script> $(function(){ $(".btn_download").click(function(e){ html2canvas(document.getElementById("capture_area")).then(function(canvas) { var el = document.createElement("a") el.href = canvas.toDataURL("image/jpeg") el.download = '이미지.jpg' //다운로드 할 파일명 설정 el.click() }) }) }) function readFile() { if (!this.files || !this.files[0]) return; const FR = new FileReader(); FR.addEventListener("load", function(evt) { document.querySelector("#img").src = evt.target.result; document.querySelector("#b64").textContent = evt.target.result; }); FR.readAsDataURL(this.files[0]); } document.querySelector("#inp").addEventListener("change", readFile); </script> </body> </html>

위의 코드를 실행하면 파일을 첨부할 수 있는 input이 생기고 이미지를 첨부하면

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBww...

첨부한 이미지를 이러한 base64 문자열로 변환한 데이터가 생성이 되는데

이렇게 base64 문자열로 변환한 데이터는 html2canvas 로 읽어올 수 있기 때문에 캡쳐하여 이미지 다운로드가 가능합니다.

Ref.

http://oriel.com/collage/category/programming-8

html2canvas 외부 이미지 로드와 CORS

... 찾아보니 CORS 정책인 보안 문제로 외부... 데이터는 html2canvas 로 읽어올 수 있기 때문에 캡쳐하여 이미지 다운로드가 가능합니다....

html 페이지 내 화면 캡쳐

... 이 문제를 해결하기 위해서는 이미지 로드가 완료된 후에 html2canvas 함수를 실행하도록 코드를 수정해야합니다. 이미지 로드가 완료된 후에...

html chrome으로 열때 auto code가 생성

... 추가 HTML이나 스크립트를 삽입할 수 있습니다. 모든 확장 프로그램을 비활성화한 다음 페이지를 다시 로드하... "쿠키 및 기타 사이트 데이터"와 "캐시된 이미지 및...

html5 이미지 회전

html5를 사용해서 이미지를 회전시켜 플래시처럼 나타내고 싶습니다. var canvas; var... 페이지가 로드될 때 on_Load() 함수가...

외부 파일로드(loadMovie...

... swf",2)이렇게요. 근데 이 파일들이 전혀 안뜨는겁니다 !!! 외부 파일을 로드시키면 모두 먹히지 않습니다.... 이 경우 html파일의 경로에서부터 이미지를 찾게 되기...

웹사이트에서 큰 이미지 저장

... (미리보기용 작은 이미지) html 작성시 과 같이 작성해주시면 1024img.jpg 를 가로 1024... 외부 css파일을 로드하거나 을 이용하는 방법인데 해당 부분은 아직 현 단계에서...