2018년 4월 20일 금요일

[프로세싱] 이미지의 픽셀과 기본적인 필터

loadPixels() - 이 함수는 픽셀 배열에 접근하기 이전에 불러오는 함수인데 "픽셀을 불러와. 난 픽셀들하고 이야기 할 거야" 라고 말하는 것과 같다.
updateixels() - 이 함수는 여러분이 픽셀 배열 사용을 끝마치고 불러오는 함수인데 "계속 진행하고 업데이트 해, 난 끝냈어!" 라고 말하는 것과 같다.




픽셀과 관련된 프로그래밍을 할 때 우리는 모든 픽셀의 위치를 이차원적인 세상에서 생각해야 한다. 그러나 원래 픽셀은 일차원으로만 접근 가능하다는 것을 기억하자. 우리는 이것을 다음과 같은 공식으로 해결 할 수 있다.
1. 화면이나 이미지가 너비와 높이를 가지고 있다고 가정해 보자.
2. 그렇게 하면 전체 픽셀 배열의 길이는 이미지, 화면의 너비*높이와 같다.
3. 어떤 화면 안에 주어진 X,Y 좌표를 일차원적인 픽셀 배열로 바꾸면 다음과 같다.
위치= X + Y * 너비

아래 코드를 잘 살펴보자. 아래의 코드는 이미지의 RGB 픽셀 값을 수정해서 밝게 만드는 코드이다.



//원본과의 비교를 위한 클래스 선언
PImage img;
PImage newimg;

void setup() {
  size(518,194);
  img = loadImage("sunflower.jpg");
  newimg = createImage(img.width,img.height,RGB);

  for(int y=0; y<img.height; y++) {
    for(int x=0; x<img.width; x++) {
//2차원의 픽셀을 1차원으로 표현한 것.
      int loc = y*img.width+x;
   
//원본 이미지의 픽셀을 하나씩 복사
      float r=red(img.pixels[loc]);
      float g=green(img.pixels[loc]);
      float b=blue(img.pixels[loc]);
   
//r,g,b 값에 1.6을 곱해서 전체적으로 밝은 느낌을 표현.
      r*=1.6;
      g*=1.6;
      b*=1.6;
   
//r,g,b 값을 0에서 255로 제한.
      r=constrain(r,0,255);
      g=constrain(g,0,255);
      b=constrain(b,0,255);
   
      color c = color(r,g,b);
   
      newimg.pixels[loc] = c;
    }
  }
}

void draw() {
  image(img,0,0);
  image(newimg,width/2,0);
}

댓글 없음:

댓글 쓰기