0. 소개
Java에서 이미지 처리에서 픽셀 기준으로 RGB값을 뽑아 올 경우 Alpha, Red, Blue, Green 값을 가져오기 위해
Blue = value &0xff Red = (value >>16) &0xff 등의 연산을 볼 수 있다. 이 의미를 알아본다.
1. 이미지의 이해
이미지는 기본적으로 RGB로 이루어져 있다. 이미지를 빨강, 초록, 파랑으로 표현하고, 알파로 투명도를 표현한다.
흔히 빨강, 초록, 파랑, 알파는 0~255의 값으로 표현한다고 들어봤을 것이다. 256은 bit로 8비트로 표현 가능하다.
따라서 이미지를 표현할 때 순서대로 알파, 빨강, 초록, 파랑은 다음 그림과 같다.
2. Shift 연산의 이해 (>>, << 연산)
이미지를 연산할 때 비트 연산이 왜 필요하지라고 생각할 수 있다.
하지만 Alpha는 25~31bit을, Red은 16~23bit을, Green은 8~15bit을, Blue은 0~7bits을 사용한다.
따라서 얻고 싶은 색상의 구역을 연산하기 위해 Shift연산과 비트 연산자 &를 사용한다.
>>24의 뜻은 비트를 오른쪽으로 24만큼, >>16은 비트를 오른쪽으로 16가라는 뜻이다. 그림은 다음과 같다.
3. 비트 & 연산
&연산은 간단하다. 두 개의 비트의 대해서 둘 다 1일 때만 1을 반환한다. 그림으로 간단히 설명하겠다.
만약에 32비트에서 처음 8비트만 사용하고 싶을 때는 어떻게 하면 좋겠는가? 32비트의 값을 첫 변수를 value라 하고
두 번째 32비트를 X라 해보자. 만약에 X를 00000000 00000000 00000000 11111111로 설정하고 &를 연산한다면
첫 8비트에서만 값을 뽑아오고 나머지 24비트는 0으로 처리할 수 있을 것이다. 여기서의 X값이 0xff로 표현 가능하다.
4. value & 0xff의 이해
필요한 기본개념은 다 설명했다. 따라서 value & 0xff를 이해해보자.
value는 우리가 얻고 싶은 색상 부분의 값이다. &는 비트 연산자, 0xff은 00000000 00000000 00000000 11111111이다.
우리는 ARGB, 알파, 빨강, 초록, 파랑이 8비트의 구역으로 이루어져 있는 걸 안다.
원하는 색상의 8비트를 비트 연산으로 이동하여 첫 8비트로 이동시키고, &연산으로 0xff와 하면 원하는 색상의 값을 얻을 수 있다는 것을 확인할 수 있다. 원하는 부분으로 이동시키는 부분은 value>>24은 알파로, value>>16은 빨강,
value>>8은 초록, 파랑은 첫 8비트므로 움직일 필요 없다.
5. 코드
아래 코드는 이미지의 모든 픽셀을 가져와서 각 픽셀마다 rgb를 가져와서 흑백 처리하는 코드의 일부분이다.
이런 식으로 활용한다는 느낌으로 보면 될 것 같다.
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int value = img.getRGB(x, y);
int alpha = (value >> 24) & 0xff;
int red = (value >> 16) & 0xff;
int green = (value >> 8) & 0xff;
int blue = value&0xff;
int avg = (red + green + blue)/3;
value = (alpha<<24) | (avg<<16) | (avg<<8) | avg;
blackImage.setRGB(x, y, value);
}
}//for
6. 코드 실행결과
'JAVA' 카테고리의 다른 글
[JAVA] 오셀로 게임 만들기 기능 구현(2) (0) | 2022.04.26 |
---|---|
[Java] 오셀로, 체스 게임 UI 만들기 (0) | 2022.04.25 |
[JAVA] CardLayout 패널 화면 쉽게 바꾸기 (0) | 2022.04.20 |
[Java] 자바로 그림판 만들기(펜, 도형, 파일 읽기 쓰기, 색깔, 굵기) (0) | 2022.04.18 |
[Java] 이클립스와 Mysql 8.0 연동하기 (JDBC 연결) (1) | 2022.04.16 |