KH/JavaScript

HTML5 와 Canvas

오늘의 진 2022. 9. 28. 14:38

[ 웹 페이지 그래픽의 전통적인 방법 ]

  • 사진이나 그림<img> 태그 이용 
  • 그래픽은 자바 애플릿이나 플래시 등 플러그인 사용 

    >> 문제점이 많다. 

 

 

 

[ 캔버스 도입 ] 

  • 플러그인의 도움 없이 자바스크립트 코드로 웹 페이지에서 자유롭게 그래픽을 수행 할 수 있는 캔버스 기능 도입
  • 캔버스 기능은 새로 도입된 <canvas> 태그로 브라우저 화면상에 할당된 공간에서 이루어 진다.
  • 캔버스의 그래픽 그리기는 자바스크립트 코드로만 가능하다. 

 

<Canvas> 태그 형식 

 

<canvas id="캔버스 객체 id" 
         style ="CSS3 스타일시트"
         width = "캔버스 영역의 너비"
         height = "캔버스 영역의 높이"> 
     이태그를 지원하지 않는 브라우저가 출력할 HTML 텍스트 
     </canvas>

width , height : 캔버스가 만들어지는 영역의 크기(픽셀단위)로 생략가능,  각각 디폴트 300, 150픽셀

 

 브라우저는 <canvas> 태그가 만들어진 영역에 사각혀으이 빈 캔버스 공간을 할당하며,

하나의 웹 페이지에 여러개의 캔버스를 만들 수 있다. 

 

 

    캔버스 그리기의 2가지 유형    

1. beginPath()를 호출하여 빈 경로를 만들고, 경로(Path)에 먼저 선, 원, 사각형 등의 도형을 모아 놓고

    한번에 캔버스에 그림을 그리는 방법

 

2.경로에 담지 않고 바로 캔버스에 그리는 방법 

 

컨텍스트 객체의 메소드 

beginPath ( ) 이전 경로를 모두 지우고 새로 시작한다. (경로와 관련)
closePath ( ) 경로의 끝과 시작점을 연결하는 선을 추가하고 경로를 닫는다. (경로와 관련)
moveTo ( ) 경로에 새 점을 만든다. (경로와 관련)
lineTo ( ) 경로의 끝 점과 연결하는 선을 추가한다. (경로와 관련)
rect ( ) 경로에 사각형을 추가한다. (경로와 관련)
arc ( ) 경로에 원호를 추가한다. (경로와 관련)
fill ( ) 경로에 만들어진 모든 도형(사각형과 원호)을 외곽선 없이 내부만 색으로 채워 캔버스를 그린다.
(경로에 있는 도형 캔버스 그리기)
stroke ( ) 경로에 담겨 있는 모든 도형을 외곽선만 캔버스에 그린다. (경로에 있는 도형 캔버스 그리기)
clearRect ( ) 캔버스에 사각형 영역을 채운다. (캔버스에 바로 그리기)
fillRect ( ) 캔버스에 외곽선 없이 사각형 영역을 색으로 바로 칠한다. (캔버스에 바로 그리기)
strokeRect ( ) 사각형을 경로에 추가하지 않고 캔버스에 바로 그린다. (캔버스에 바로 그리기)
strokeText ( ) 텍스트(문자열)를 캔버스에 바로 그린다. (캔버스에 바로그리기 )
drawImage ( ) 이미지를 캔버스에 바로 그린다. (캔버스에 바로 그리기 )

 

arc(원의 중심x,y,시작각도,끝나는 각도,옵션값);

옵션값 : 시계방향, 반시계 방향 결정한다. 기본값인  false는 시계방향이다.

 

 

 

 

 

 

[여러가지 단위들]

pixel(px) 고정된 크기의 단위(주로 컴퓨터 화면에서 사용됨)
크기가 조정이 안되는 단점이 있음
point(pt) 고정된 크기 단위(주로 인쇄 메체에서 사용됨) 
크기 조정 안됨
em 웹 문서에서 사용되는 단위로 컴퓨터와 모바일등 다른 장치에서도 사용  / 크기조정 가능
1em = 12pt = 16px 와 같음(em은 대문자 M의 크기를 뜻함)
percent(%) em과 비슷하게 다른장치에 상대적으로 크기조절이 가능하다. 

 

 

 

 


<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>캔버스 만들기</title>
</head>

<body>
    <h3>3개의 캔버스 만들기 </h3>
    <hr>
    <canvas id="canvas1" style="background-color: lightblue;"></canvas>
    <canvas id="canvas2" style="background-color: violet;" width="150" height="100"></canvas><br>
    <canvas id="canvas3" style="background-color: yellow;" width="300" height="150"></canvas>

</body>
</html>

 

 

 

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>캔버스 그리기</title>
</head>

<body>
    <h3>캔버스 그리기</h3>
    <hr>
    <canvas id="myCanvas" style="background-color: aliceblue;" width="250" height="150"></canvas>
    <script>
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");

        // getContext("2d")가 리턴한 객체는 2차원 그래픽에 사용되는 
        // 프로퍼티와 메소드를 가진 CanvasRenderingContext2D 타입 객체이다.
        // 이것을 context 객체라고 부르기로 한다.
        // 캔버스 객체는 2차원과 3차원을 모두 지원한다.
        // 2차원은 canvas.getContext("2d")를 3차원은 canvas.getContext("webgl")를 호출하면 된다.
        // webgl => Web Graphics Library는 플러그인 도움 없이 브라우저를 막론하고 2D/3D 차원의 그래픽을 지원하는 자바스크립트 API이다.
        // getContext() => 컨버스에 그림을 그리는 컨택스트 객체 리턴 

        //파란선으로 사각형 그리기 
        context.beginPath(); // 빈경로 만들기 
        context.strokeStyle = "blue"; // 선 색 결정 
        context.rect(30, 30, 50, 50); // (30,30)에서 50*50 크기의 사각형을 경로에 삽입
        context.stroke(); // 경로에 있는 모든 도형의 외곽선 그리기 

        //violet 색으로 채운 사각형 그리기 
        context.beginPath(); // 빈경로 만들기 
        context.fillStyle = "violet"; // 채우기 색
        context.rect(60, 60, 50, 50); // (60,60)에 50*50 크기의 사각형을 경로에 삽입
        context.fill();

        //green 색으로 택스트 만들기 
        context.font = "20px Gothic";
        context.fillStyle = "green";
        context.fillText("Text in Canvas", 100, 50); // 택스트를 경로에 넣지 않고 바로 그리기  

    </script>

</body>
</html>

 

 

line으로 삼각형 그리기 

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>선으로 삼각형 그리기</title>
</head>

<body>
    <h3>선으로 삼각형 그리기</h3>
    <hr>
    <canvas id="myCanvas" style="background-color: aliceblue;" width="200" height="150"></canvas>
    <script>
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");

        context.beginPath(); // 빈경로 만들기 
        context.moveTo(120, 20); //(120,20)을 시작점으로 설정 
        context.lineTo(20, 50); // 경로에 (120,20)에서 (20,50)까지 직선 추가 
        context.lineTo(150, 150); //(20,50)에서 (150,150)까지 직선 추가 
        context.lineTo(120, 20);
        context.strokeStyle = "magenta"; // 선의 색 
        context.stroke(); // 경로를 캔버스에 그린다. 


        //오각형 만들기 
        context.beginPath();
        context.moveTo(100,20);
        context.lineTo(130,50);
        context.lineTo(115,80);
        context.lineTo(85,80);
        context.lineTo(70,50);
        context.lineTo(100,20);
        context.strokeStyle="blue";
        context.stroke();







    </script>
</body>

</html>

 

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사각형 그리기 예 </title>
</head>
<body>
    <h3>사각형 그리기</h3>
<hr>
<canvas id="myCanvas" style="background-color: aliceblue;" width="200" height="150"></canvas>
<script>
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d");

    context.beginPath();// 빈 경로 구성 
    for(var i=0 ; i<5; i++){
        context.rect(10+i*30, 10+i*15, 50,50);
    }
    context.strokeStyle="magenta"; // 선의 색 
    context.stroke(); // 사각형을 캔버스에 그린다.
</script>
</body>
</html>

 

 

원그리기 

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>drawCircle() 만들기</title>
    <script>
        function drawCircle(ctx, x, y, radius) {
            ctx.beginPath();
            ctx.arc(x, y, radius, 0, 2 * Math.PI); 
            //(시작점x,y,반지름크기, 시작각도, 끝 각도) 시계 반대방향으로 돈다. 
            ctx.stroke();
        }
    </script>
</head>

<body>
    <h3>drawCircle() 만들기</h3>
    <hr>
    <canvas id="myCanvas" width="220" height="220" style="background-color : aliceblue"></canvas>
    <script>
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");
        drawCircle(context, 100, 100, 80);
        drawCircle(context, 150, 150, 30);
    </script>
</body>
</html>

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>선의 색과 굵기</title>
</head>
<body>
    <h3>선의 색과 굵기</h3>
    <hr>
    <canvas id="myCanvas" style="background-color: aliceblue;" width="180" height="300"></canvas>

    <script>
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");

        //1픽셀의 blue 직선 그리기 
        context.beginPath();
        context.moveTo(20,20);
        context.lineTo(150,50);
        context.strokeStyle="blue";
        context.stroke();

        //10픽셀의 yellowgreen 사각형 그리기 
        context.beginPath();
        context.rect(20,80,150,50);
        context.lineWidth =10;
        context.strokeStyle="yellowgreen";
        context.stroke();

        //20픽셀의 violet색 원호 그리기 
        context.beginPath();
        context.arc(80,220,50,0.5*Math.PI,0,false); // 0.5PI >> 90도 , 0 >>3시방향
        context.lineWidth = 20; // 선 굵기 = 20px
        context.strokeStyle ="violet";
        context.stroke();
    </script>
</body>
</html>

 

 

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>채운 사각형과 원호 그리기</title>
</head>
<body>
    <h3>채운 사각형과 원호 그리기</h3>
<hr>
<canvas id="myCanvas" style="background-color: aliceblue;" width="180" height="420"></canvas>
<script>
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d");

    //fillRect()로 외곽선 없이 색으로 채운 사각형 그리기 
    context.fillStyle = "violet";
    context.fillRect(20,20,100,100); // 채운 사각형 그리기 

    //fill()로 사각형 내부 칠하기 
    context.beginPath();
    context.rect(20,150,100,100); // 경로에 사각형 삽입 
    context.fillStyle ="#cccc66";
    context.fill(); // 사각형 내부 칠하기 

    //사각형 외곽선 그리기 
    context.strokeStyle = "rgb(90,90,200)";
    context.lineWidth =10;
    context.stroke();

    //fill()로 원호 내부 칠하기 
    context.beginPath();
    context.moveTo(80,340); // 원호의 중심을 시작점으로 설정
    context.arc(80,340,50,0,1.5*Math.PI); // 경로에 원호 삽입
    context.closePath(); // 원호의 끝점과 경로의 시작점(원호중심)을 연결하는 직선 자동 추가 
    context.fillStyle = "yellowgreen";
    context.fill();

    //원호 외곽선 그리기 
    context.strokeStyle="gray";
    context.lineWidth=20;
    context.stroke();
</script>
</body>
</html>

 

 

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>오륜기</title>
    <script>
        function drawCircle(ctx, x, y, radius, color) {
            ctx.beginPath();
            ctx.arc(x, y, radius, 0, 2 * Math.PI);
            ctx.lineWidth = 3;
            ctx.strokeStyle = color;
            ctx.stroke();
        }
        function drawOlympicRings(ctx, xArray, yArray) {
            var startX = 60;
            var startY = 60;
            var radius = 30;

            var colors = ["deepskyblue", "black", "red", "yellow", "green"];
            var x = startX;
            var y = startY;
            var gap = 6;
            for (i = 0; i < 3; i++) {
                drawCircle(ctx, x, y, radius, colors[i]);
                x += radius * 2 + gap;
            }
            x = startX + radius + gap / 2;  // 아래로 한줄 내리는 코드 
            y = startY + radius;
            for (j = i; j < 5; j++) {
                drawCircle(ctx, x, y, radius, colors[j]);
                x += radius * 2 + gap;
            }

        }
    </script>
</head>

<body>
    <h3> 오륜기 그리기</h3>
    <hr>
    <canvas id="myCanvas" width="300" height="150" style="background-color: aliceblue;"></canvas>

    <script>
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");
        drawOlympicRings(context);
    </script>
</body>
</html>

 

 

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>텍스트 그리기</title>
</head>

<body>
    <h3>텍스트 그리기</h3>
    <hr>
    <canvas id="myCanvas" style="background-color: aliceblue;" width="500" height="400"></canvas>

    <script>
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");
        context.strokeStyle = "blue";


        //font 프로퍼티 활용
        for (var i = 0; i < 4; i++) {
            context.font = (10 + i * 10) + "px forte";
            context.strokeText("Javascript 재밌다.", 10, 30 + i * 50);
        }

        //텍스트 외곽선 그리기 
        context.font = "italic 50px forte";
        context.strokeStyle = "magenta";
        context.lineWidt = 3;
        context.textAlign = "left";
        context.strokeText("Javascript 재밌다.", 50, 250);

        //텍스트 채워 그리기 
        context.fillStyle = "green";
        context.textAlign = "right";
        context.fillText("Javascript 재밌다.", 490, 300);

        context.font ="50px forte";
        context.strokeStyle="orange";
        context.textAlign="left";
        context.strokeText("홍길동",10,350);



    </script>
</body>
</html>

한번 설정을 바꾸면 다시 바꿔주기 전까지 그대로 유지된다. 

 

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>폼으로 도형 그리기</title>
    <style>
        td{
            text-align: right;
            padding-left: 5px;
            padding-right: 5px;
        }
    </style>
    <script>
        function draw(){
            var canvas = document.getElementById("myCanvas");
            var context = canvas.getContext("2d");

            var x = document.getElementById("x").value;
            var y = document.getElementById("y").value;
            var width = document.getElementById("width").value;
            var height = document.getElementById("height").value;
            var lineWidth = document.getElementById("lineWidth").value;
            var strokeStyle = document.getElementById("strokeStyle").value;
            context.beginPath();
            context.rect(x, y, width, height);
            context.lineWidth = lineWidth;
            context.strokeStyle = strokeStyle;
            context.stroke();
        }

        function erase(){
            var canvas = document.getElementById("myCanvas");
            var context = canvas.getContext("2d");
            context.clearRect(0, 0, canvas.width, canvas.height);
        }
    </script>
</head>
<body>
    <h3>폼으로 사각형 그리기</h3>
    <hr>
    <form>
        <table>
            <tr>
                <td><label>x <input id="x" type="number" value="10"></label></td>
                <td><label>x <input id="y" type="number" value="10"></label></td>
            </tr>
            <tr>
                <td><label>width <input id="width" type="number" value="120"></label></td>
                <td><label>height <input id="height" type="number" value="120"></label></td>
            </tr>
            <tr>
                <td><label>선굵기 <input id="lineWidth" type="number" value="1"></label></td>
                <td><label>선색 <input id="strokeStyle" type="color" value="#000000"></label></td>
            </tr>
            <tr>
                <td><label><button type="button" onclick="draw()">그리기</button></label></td>
                <td><label><button type="button" onclick="erase()">지우기</button></label></td>
            </tr>
        </table>
    </form>

    <canvas id="myCanvas" width="500" height="300" style="background-color: aliceblue"></canvas>

</body>
</html>

 

폼으로 도형 그리기

폼으로 사각형 그리기


 

 

 

 

'KH > JavaScript' 카테고리의 다른 글

JS_Event , img  (1) 2022.09.29
CSS_ 선형 그래디언트  (0) 2022.09.28
JS_JSON / location  (0) 2022.09.28
JS_BOM(3)  (0) 2022.09.27
JS_BOM(2) screen 객체, history 객체  (0) 2022.09.26