본문 바로가기
  • Welcome J-Kyu Tstory
국비교육과정/javascript

[컬러영상처리]08-02 Color Image Processing Ver 0.1.html

by regularity 2022. 5. 16.
728x90

08-02 Color Image Processing Ver 0.1.html

▶HTML 페이지 웹 영상처리 구현 ver0.01

영상처리_밝기
영상처리_그레이스케일
영상처리_좌우반전

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
    // ---------------------------전역 변수부--------------------------------
    var inCanvas, outCanvas, inCtx, outCtx, inPaper, outPaper;  // 화면 관련 변수
    var inFile; // 칼라 파일(PNG, JPG, BMP)
    var inImage, outImage; // 입출력용 이미지 (3차원 배열)  --> 제일 중요
    var inH, inW, outH, outW; // 영상의 높이와 폭
</script>
<script>
    // -------------------------------공통 함수부--------------------------
    function init() {
        inCanvas = document.getElementById('inCanvas'); // 도화지에 접근
        outCanvas = document.getElementById('outCanvas'); // 도화지에 접근
        inCtx = inCanvas.getContext('2d'); // 물감,붓이 들은 통
        outCtx = outCanvas.getContext('2d'); // 물감,붓이 들은 통
    }
    function openImage() {
        // inFile = document.getElementById("inFile").files[0]; // 선택한 파일 "c:/html/picture01.png"
        var fileNum = document.getElementById('fileNum').value;
        if ( parseInt(fileNum) < 9)
            fileNum = "0" + fileNum;
        else
            fileNum = fileNum;
        var inFname = "Nature99(Small)/picture" + fileNum + ".jpg";
        // 그림 파일 --> 이미지 객체
        var inPicture = new Image();  // 빈 이미지 객체
        inPicture.src = inFname;
        inPicture.onload = function() {
            // 중요! 입력 영상의 크기를 알아내기
            inH = inPicture.height;
            inW = inPicture.width;
            // 캔버스 크기 조절
            inCanvas.height = inH;
            inCanvas.width = inW;
            inCtx.drawImage(inPicture,0,0,inW,inH);
            // 메모리 할당 (3차원 배열)
            inImage = new Array(3); // 3면
            for(var m=0; m<3; m++) {
                inImage[m] = new Array(inH);
                for(var i=0; i<inH; i++)
                    inImage[m][i] = new Array(inW);
            }
            // *중요* 캔버스의 이미지(화면) --> 배열로 칼라 추출
            var colorBlob = inCtx.getImageData(0,0,inW,inH); 
            var R, G, B, Alpha;
            for(var i=0; i<inH; i++) {
                for (var k=0; k<inW; k++) {
                    var pos = (i*inW + k) * 4; // 1픽셀 = 4byte
                    R = colorBlob.data[pos+0]; // Red
                    G = colorBlob.data[pos+1]; // Green
                    B = colorBlob.data[pos+2]; // Blue
                    // Alpha = colorBlob.data[pos+3]; // Alpha
                    inImage[0][i][k] = R;
                    inImage[1][i][k] = G;
                    inImage[2][i][k] = B;                    
                }
            }


        }
    }
    
    function display() {
        // 출력 메모리를 페이퍼에 출력하고, 페이퍼를 캔버스에 붙이기
        outPaper = outCtx.createImageData(outW, outH); // 그림크기의 빈 종이를 준비
        // 캔버스 크기
            outCanvas.height = outH;
            outCanvas.width = outW;
            // 종이에 콕콕콕 찍기
            for(var i=0; i<outH; i++) {
                for (var k=0; k<outW; k++) {
                    var R = outImage[0][i][k]; // 0~255 사이의 값
                    var G = outImage[1][i][k]; // 0~255 사이의 값
                    var B = outImage[2][i][k]; // 0~255 사이의 값
                    outPaper.data[ (i*outW + k)*4 + 0] = R; // Red
                    outPaper.data[ (i*outW + k)*4 + 1] = G; // Green
                    outPaper.data[ (i*outW + k)*4 + 2] = B; // Blue
                    outPaper.data[ (i*outW + k)*4 + 3] = 255; // Alpha
                }
            }
            outCtx.putImageData(outPaper, 0, 0); // 종이를 캔버스에 붙이기.
        }

        function setSize(){
            // 중요! 출력 영상 크기 결정 ---> 알고리즘에 의존
            outH = inH;
            outW = inW;
            // 메모리 할당 (3차원 배열)
            outImage = new Array(3); // 3면
            for(var m=0; m<3; m++) {
                outImage[m] = new Array(outH);
                for(var i=0; i<outH; i++)
                    outImage[m][i] = new Array(outW);
            }
        }
    // -------------------------------공통 함수부 끝--------------------------
</script>

<script>
    // ---------------------------------영상처리 알고리즘---------------------------------
    //======================== 기능 선택=======================
    function selectAlgorithm(selectNum) {
        switch(parseInt(selectNum.value)) {
            case 101 : // 동일영상
                equalImage();
                break;
            case 102 : // 밝게하기
                brightImage();
                break;
            case 103 : // 그레이스케일
                grayImage();
                break;
            case 104 : // 영상좌우반전
                reverseVImage();
                break;
            case 105 : // 영상상하
                reverseHImage();
                break;
            case 106 : // 영상축소
                zoomOutImage();
                break;
        }
    }
    
    //==================동일 영상=================
    function equalImage() { //case 101
        // 중요! 출력 영상 크기 결정 ---> 알고리즘에 의존
        outH = inH;
        outW = inW;
        // 메모리 할당 (3차원 배열)
        outImage = new Array(3); // 3면
        for(var m=0; m<3; m++) {
            outImage[m] = new Array(outH);
            for(var i=0; i<outH; i++)
                outImage[m][i] = new Array(outW);
        }
        // ** 진짜 영상처리 알고리즘 **
        for (var rgb=0; rgb < 3; rgb++) {
            for (var i=0; i<inH; i++) {
                for (var k=0; k<inW; k++) {
                    outImage[rgb][i][k] = inImage[rgb][i][k];
                }
            }
        }
        display();
    }

    //==================밝기 조절=================
    function brightImage() {    //case 102
        setSize();
        // ** 진짜 영상처리 알고리즘 **
        var value=parseInt(prompt("숫자:", "100"));
        for (var rgb=0; rgb < 3; rgb++) {
            for (var i=0; i<inH; i++) {
                for (var k=0; k<inW; k++) {
                    if (inImage[rgb][i][k] + 100 > 255)
                        outImage[rgb][i][k] = 255;
                    else
                        outImage[rgb][i][k] = inImage[rgb][i][k] + 100;
                }
            }
        }
        display();
    }

    //==================흑백 전환=================
    function grayImage() {  //case 103
        setSize();
        // ** 진짜 영상처리 알고리즘 **
        for (var i=0; i<inH; i++) {
            for (var k=0; k<inW; k++) {
                var hap = inImage[0][i][k] + inImage[1][i][k] + inImage[2][i][k];
                var avg = parseInt(hap / 3);

                outImage[0][i][k] = outImage[1][i][k] = outImage[2][i][k] = avg;
            }
        }

        display();
    }

    //==================영상 좌우 반전=================
    function reverseVImage() {   //case 104
        setSize();
        // ** 진짜 영상처리 알고리즘 **
        for (var rgb=0; rgb < 3; rgb++) {
            for (var i=0; i<inH; i++) {
                for (var k=0; k<inW; k++) {
                  outImage[rgb][i][k] = inImage[rgb][i][inW-k-1];
                }
            }
       
        display();
        }
    }
    //==================영상 상하 반전=================
    function reverseHImage() {   //case 105
        setSize();
        // ** 진짜 영상처리 알고리즘 **
        for (var rgb=0; rgb < 3; rgb++) {
            for (var i=0; i<inH; i++) {
                for (var k=0; k<inW; k++) {
                  outImage[rgb][i][k] = inImage[rgb][inH-i-1][k];
                }
            }
       
        display();
        }
    }
    //==================영상 축소=================
    function zoomOutImage() {   //case 106
        //배율 입력
        var scale = parseInt(prompt("배율", "2"));
        //출력 영상 크기
        outH = inH / scale;
        outW = inW / scale;
        //영상 크기 메모리 확보(3차원)
        outImage = new Array(3) ; 
        for(var m=0; m<3; m++){
            outImage[m] = new Array(outH);
            for(var i=0; i<outH; i++)
                outImage[m][i] = new Array(outW);
        }
        // ** 진짜 영상처리 알고리즘 **
        for (var rgb=0; rgb < 3; rgb++) {
            for (var i=0; i<inH; i++) {
                for (var k=0; k<inW; k++) {
                      //******핵심 알고리즘(영상 축소)
                      outImage[rgb][parseInt(i/scale)][parseInt(k/scale)]  = inImage[rgb][i][k];
                }
            }

        display();
        }
    }

</script>

<!-- ----------------------------------Body---------------------------------- -->
</head>
<body onload="init()">
    <h1> (MY)Color Image Processing Ver 0.01</h1>
    <form>
            <input type="number" id="fileNum"/>
            <input type="button" id="inFile" value="이미지 열기" onclick="openImage()" /><br>
            <select name='pixel' onchange="selectAlgorithm(this.form.pixel)">
                <option value=0> 선택하세요(화소점) </option>
                <optgroup label = "화소점 처리">
                    <option value=101> 동일 영상 </option>
                    <option value=102> 밝게 하기 </option>
                    <option value=103> 그레이스케일 </option>
                    <option value=104> 영상 좌우반전 </option>
                    <option value=105> 영상 상하반전 </option>
                    <option value=106> 영상 축소 </option>
                </optgroup>
            </select>
         </form>
        <br>
        <canvas id="inCanvas" style="background-color:aqua"></canvas>
        <canvas id="outCanvas" style="background-color:goldenrod"></canvas>
    </body>
</html>
728x90

댓글