Processing 구현중 - Mosaic Learning 3
< ImageAnalyzer.pde >
// 이 파일은 class ColorAndBrightness에 대한 정보 (약간)과
// 색깔이나 밝기 등 이미지 정보를 분석하는 데에 필요한 함수들이
// (가득) 들어 있는 공간이다.
class ColorAndBrightness
{
public float brightness;
public color col;
// Constructor
public ColorAndBrightness(color col, float brightness)
{
this.brightness = brightness;
this.col = col;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Return average color and brightness of specific area from the image
// 원이미지 각 부분의 (평균)색깔과 (평균)밝기 데이터를
// 위 클래스변수형으로 묶어서 리턴하는 함수
// 원이미지의 각 부분 정보
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ColorAndBrightness averageColorOfTile(PImage picture, int x, int y, int w, int h)
// picture = 원이미지 파일
// x = 원이미지에서의 x 좌표값 / y = 원이미지에서의 y 좌표값
// w = 원이미지 조각의 가로 길이 / h = 원이미지 조각의 세로 길이
{
float r = 0;
float g = 0;
float b = 0;
float brightness = 0;
int repeat = 0;
for (int i = y * picture.width + x ; repeat != h ; I += picture.width)
// 원이미지 포문 (1) 세로방향
// i = 현재 지점까지의 픽셀 개수
// i 값은 왼쪽 위부터 오른쪽(아래)으로 순차 이동
// 원이미지 조각의 세로 길이만큼 반복되지 않으면 (즉 repeat != h이면)
// 계속 돌려라.
{
repeat++;
// 물론 repeat 값은 가로줄 하나가 끝날(시작할) 때마다 1씩 증가시킨다.
for (int j = i ; j < i + w ; j++) // 명재코드 수정
// 원이미지 포문 (2) 가로방향
{
r += red(picture.pixels[j]);
g += green(picture.pixels[j]);
b += blue(picture.pixels[j]);
brightness += brightness(picture.pixels[j]);
// 원이미지 조각 정보 계산 (1) 원이미지 조각의 전체 픽셀 값 합산
}
}
r = r / (w * h);
g = g / (w * h);
b = b / (w * h);
brightness = brightness / (w * h);
// 원이미지 조각 정보 계산 (2) 평균
color aColor = color(r, g, b);
return new ColorAndBrightness(aColor, brightness);
// 새 변수 만들면서 동시에 리턴
}
// Return average brightness of the entire image
public float averageBrightness(PImage picture) // 타일
{
float b=0;
for (int i = 0; i < picture.pixels.length; i++)
{
b += brightness(picture.pixels[i]);
}
b = b/picture.pixels.length;
return b;
}
// Return average color of the entire image
// 내가 끙끙대며 픽셀정보 합한 코드를 순식간에 ㅜㅜ
public color averageColor(PImage picture) // 타일
{
float r = 0;
float g = 0;
float b = 0;
for (int i = 0; i < picture.pixels.length; i++)
{
r += red(picture.pixels[i]);
g += green(picture.pixels[i]);
b += blue(picture.pixels[i]);
}
r = r / picture.pixels.length;
g = g / picture.pixels.length;
b = b / picture.pixels.length;
color aColor = color(r, g, b);
return aColor;
}
int indexImage(color avC, float avB)
// 심지어 public도 적혀 있지 않음.
// public 함수와의 차이점은 무엇일까.
{
float r = red(avC);
float g = green(avC);
float b = blue(avC);
int value = 0;
if (r > g && r > b) {
if (avB >=0 && avB <= 42) {
value = 1;
}
else if (avB > 42 && avB<= 85) {
value = 2;
}
else if (avB > 85 && avB <= 127) {
value = 3;
}
else if (avB > 127 && avB <= 170) {
value = 4;
}
else if (avB > 170 && avB <= 210) {
value = 5;
}
else if (avB > 210) {
value = 6;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Case (1) 해당 타일의 색깔값(RGB) 중 Red가 가장 클 경우
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 0 <= 밝기 <= 42 --à value = 1
// 42 < 밝기 <= 85 --à value = 2
// 85 < 밝기 <= 127 --à value = 3
// 127 < 밝기 <= 170 --à value = 4
// 170 < 밝기 <= 210 --à value = 5
// 210 < 밝기 <= 255 (프로세싱 밝기의 최대값) --à value = 6
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
else if (g > r && g > b) {
if (avB >=0 && avB <= 42) {
value = 7;
}
else if (avB > 42 && avB<= 85) {
value = 8;
}
else if (avB > 85 && avB <= 127) {
value = 9;
}
else if (avB > 127 && avB <= 170) {
value = 10;
}
else if (avB > 170 && avB <= 210) {
value = 11;
}
else if (avB > 210) {
value = 12;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Case (2) 해당 타일의 색깔값(RGB) 중 Green이 가장 클 경우
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 0 <= 밝기 <= 42 --à value = 7
// 42 < 밝기 <= 85 --à value = 8
// 85 < 밝기 <= 127 --à value = 9
// 127 < 밝기 <= 170 --à value = 10
// 170 < 밝기 <= 210 --à value = 11
// 210 < 밝기 <= 255 (프로세싱 밝기의 최대값) --à value = 12
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
else if (b >r && b > g) {
if (avB >=0 && avB <= 42) {
value = 13;
}
else if (avB > 42 && avB<= 85) {
value = 14;
}
else if (avB > 85 && avB <= 127) {
value = 15;
}
else if (avB > 127 && avB <= 170) {
value = 16;
}
else if (avB > 170 && avB <= 210) {
value = 17;
}
else if (avB > 210) {
value = 18;
}
}
return value;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Case (3) 해당 타일의 색깔값(RGB) 중 Blue가 가장 클 경우
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 0 <= 밝기 <= 42 --à value = 13
// 42 < 밝기 <= 85 --à value = 14
// 85 < 밝기 <= 127 --à value = 15
// 127 < 밝기 <= 170 --à value = 16
// 170 < 밝기 <= 210 --à value = 17
// 210 < 밝기 <= 255 (프로세싱 밝기의 최대값) --à value = 18
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////