본문 바로가기
Coding/JavaScript

[JavaScript & jQuery] html 특정 영역 드래그로 캡쳐하는 방법 !! (html2canvas 라이브러리)

by 포스트it 2023. 3. 3.
728x90
반응형

 

[JavaScript & jQuery] html 특정 영역 드래그로 캡쳐하는 방법 !!

(html2canvas 라이브러리)

라이브러리 공식 링크 -> https://html2canvas.hertzen.com

 

html2canvas - Screenshots with JavaScript

Try out html2canvas Test out html2canvas by rendering the viewport from the current page. Capture

html2canvas.hertzen.com

예제 코드
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	// 이미지 캡쳐 시 필요한 라이브러리
	<script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
	<link rel="stylesheet" type="text/css" href="screenshot.css" />
</head>
<body>
	<input type="button" value="캡쳐" id="edit"/>
	<div style="width: 80%;">
		<img src="다운로드.jfif ">
	</div>
	<a id="target" style="display: none"></a>
<script>
window.onload = function(){
	// 캡쳐 버튼 클릭 이벤트 등록
	document.getElementById("edit").addEventListener("click", function(e){
		// 마우스 커서 모양 변경 (eidt_cursor 클래스 추가)
		document.querySelector("body").classList.add("edit_cursor");
		screenshot(e);
	});
}
/* 
*
*/
function screenshot(e){
	var startX, startY;
	var height = window.innerHeight;
	var width = window.innerWidth;
	
	// 배경을 어둡게 깔아주기 위한 div 객체 생성
	var $screenBg = document.createElement("div");
	$screenBg.id = "screenshot_background";
	$screenBg.style.borderWidth = "0 0 " + height + "px 0";

	// 마우스 이동하면서 선택한 영역의 크기를 보여주기 위한 div 객체 생성
	var $screenshot = document.createElement("div");
	$screenshot.id = "screenshot";
	
	document.querySelector("body").appendChild($screenBg);
	document.querySelector("body").appendChild($screenshot);
	
	var selectArea = false;
	var body = document.querySelector('body');

	// 마우스 누르는 이벤트 함수
	var mousedown = function(e) {
		e.preventDefault();
		selectArea = true;
		startX = e.clientX;
		startY = e.clientY;
		// 이벤트를 실행하면서 이벤트 삭제 (한번만 동작하도록)
		body.removeEventListener("mousedown", mousedown);
	}
	// 마우스 누르는 이벤트 등록
	body.addEventListener("mousedown", mousedown);

	// 클릭한 마우스 떼는 이벤트 함수
	var mouseup = function(e) {
		selectArea = false;
		// (초기화) 마우스 떼면서 마우스무브 이벤트 삭제
		body.removeEventListener("mousemove", mousemove);
		// (초기화) 스크린샷을 위해 생성한 객체 삭제
		$screenshot.parentNode.removeChild($screenshot);
		$screenBg.parentNode.removeChild($screenBg);
		var x = e.clientX;
		var y = e.clientY;
		var top = Math.min(y, startY);
		var left = Math.min(x, startX);
		var width = Math.max(x, startX) - left;
		var height = Math.max(y, startY) - top;
		html2canvas(document.body).then(
			function(canvas) { //전체 화면 캡쳐
				 // 선택 영역만큼 crop
				var img = canvas.getContext('2d').getImageData(left, top, width, height);
				var c = document.createElement("canvas");
				c.width = width;
				c.height = height;
				c.getContext('2d').putImageData(img, 0, 0);
				save(c); // crop한 이미지 저장
			}
		);
		body.removeEventListener("mouseup", mouseup);
        // 마우스 커서 기본으로 변경
		document.querySelector("body").classList.remove("edit_cursor");
	}
	body.addEventListener("mouseup", mouseup);

	// 마우스무브 이벤트 함수
	function mousemove(e) {
		var x = e.clientX;
		var y = e.clientY;
		$screenshot.style.left = x;
		$screenshot.style.top = y;
		if (selectArea) { //캡쳐 영역 선택 그림
			var top = Math.min(y, startY);
			var right = width - Math.max(x, startX);
			var bottom = height - Math.max(y, startY);
			var left = Math.min(x, startX);
			$screenBg.style.borderWidth = top + 'px ' + right + 'px ' + bottom + 'px ' + left + 'px';
		}
	}
	body.addEventListener("mousemove", mousemove);
    
    // 캡쳐한 이미지 저장
	function save(canvas) { 
		if (navigator.msSaveBlob) {
			var blob = canvas.msToBlob();
			return navigator.msSaveBlob(blob, '파일명.jpg');
		} else {
			var el = document.getElementById("target");
			el.href = canvas.toDataURL("image/jpeg");
			el.download = '파일명.jpg';
			el.click();
		}
	}
}
</script>
</body>
</html>

 

728x90
반응형

댓글