[JavaScript] 자바스크립트에서 캔버스의 이미지 가공하기

2022. 7. 27. 22:51Program/JavaScript

208_자바스크립트에서 캔버스의 이미지 가공하기

[적용]

  • 로딩한 이미지에 효과를 넣고 싶을 때

[문법]

메소드 의미 반환
context.putImageData(이미지) 이미지 데이터 입력  없음

[내용]

putImageData()는 이미지를 콘텍스트에 대입하는 메소드로,

이미지를 가져오는 getImageData()와 반대의 기능을 가진다.

다음 샘플은 첫 번째 캔버스 요소에 이미지를 배치하고 getImageData()로 화소 배열을 가져온다.

모노크롬 값을 계산하여 새로 작성한 ImageData 객체에 값을 할당하고

두 번째 캔버스 요소에 putImageData()를 사용해 값을 대입한 모노크롬 사진을 표시한다.

 

HTML                                                                                                                                                              index.html

<body>
    <canvas id="canvas-original" width="100" height="120"></canvas>
    <br />
    <canvas id="canvas-effected" width="100" height="120"></canvas>
</body>

JavaScript                                                                                                                                                          main.js

// 캔버스 요소 참조
const canvas1 = document.querySelector('#canvas-original');
// 콘텍스트 가져오기
const context1 = canvas1.getContext('2d');

// Image 인스턴스 생성
const img = new Image();
// 이미지 로딩 후 처리
img.onload = () => {
    // 콘텍스트로 캔버스에 그리기
    context1.drawImage(img, 0, 0);
    
    // 화소 정보 가져오기
    const imageData = context1.getImageData(0, 0, 150, 150);
    const data = imageData.data;
    
    const monoImageData = new ImageData(150, 150);
    
    const monoArr = monoImageData.data;
    for (let i = 0; i < data.length / 4; i += 1) {
        // 화소 정보 가져오기
        const r = data[i * 4 + 0];
        const g = data[i * 4 + 1];
        const b = data[i * 4 + 2];
        const a = data[i * 4 + 3];
        
        // 평균값 구하기(연산 간략화를 위함)
        const color = (r + g + b) / 3;
        
        // 새로운 색 지정
        monoArr[i * 4 + 0] = color;
        monoArr[i * 4 + 1] = color;
        monoArr[i * 4 + 2] = color;
        monoArr[i * 4 + 3] = a;
    }
    
    // 캔버스 요소 참조
    const canvas2 = document.querySelector("#canvas-effected");
    // 콘텍스트 가져오기
    const context2 = canvas2.getContext('2d');
    // 콘텍스트에 새로운 화소 정보 할당
    context2.putImageData(monoImageData, 0, 0);
};

// 이미지 로딩 시작
img.src = 'sample.jpg';

 

실행결과

 

 


 

 

 

 

 

참조 :
실무에 바로 적용하는 자바스크립트 코드레시피 278
아케다 야스노부, 카노 타케시 지음 / 이춘혁 옮김