본문 바로가기

JAVA

[Java] 색상에서 value & 0xff 의미 쉽게 이해하기

0. 소개

Java에서 이미지 처리에서 픽셀 기준으로 RGB값을 뽑아 올 경우 Alpha, Red, Blue, Green 값을 가져오기 위해

Blue = value &0xff  Red = (value >>16) &0xff 등의 연산을 볼 수 있다. 이 의미를 알아본다.

 

1. 이미지의 이해

이미지는 기본적으로 RGB로 이루어져 있다. 이미지를 빨강, 초록, 파랑으로 표현하고, 알파로 투명도를 표현한다.

흔히 빨강, 초록, 파랑, 알파는 0~255의 값으로 표현한다고 들어봤을 것이다. 256은 bit로 8비트로 표현 가능하다.

따라서 이미지를 표현할 때 순서대로 알파, 빨강, 초록, 파랑은 다음 그림과 같다.  

그림1. 이미지의 ARGB

 

2. Shift 연산의 이해 (>>, << 연산)

이미지를 연산할 때 비트 연산이 왜 필요하지라고 생각할 수 있다.

하지만 Alpha는 25~31bit을, Red은 16~23bit을, Green은 8~15bit을, Blue은 0~7bits을 사용한다.

따라서 얻고 싶은 색상의 구역을 연산하기 위해 Shift연산과 비트 연산자 &를 사용한다. 

>>24의 뜻은 비트를 오른쪽으로 24만큼,  >>16은 비트를 오른쪽으로 16가라는 뜻이다. 그림은 다음과 같다.

그림2. >>연산 (16만큼 비트이동)

 

3. 비트 & 연산

&연산은 간단하다. 두 개의 비트의 대해서 둘 다 1일 때만 1을 반환한다. 그림으로 간단히 설명하겠다.

만약에 32비트에서 처음 8비트만 사용하고 싶을 때는 어떻게 하면 좋겠는가? 32비트의 값을 첫 변수를 value라 하고

두 번째 32비트를 X라 해보자. 만약에 X를 00000000 00000000 00000000 11111111로 설정하고 &를 연산한다면

첫 8비트에서만 값을 뽑아오고 나머지 24비트는 0으로 처리할 수 있을 것이다. 여기서의 X값이 0xff로 표현 가능하다.

그림3. &연산

 

4. value & 0xff의 이해

필요한 기본개념은 다 설명했다. 따라서 value & 0xff를 이해해보자.

value는 우리가 얻고 싶은 색상 부분의 값이다. &는 비트 연산자, 0xff은  00000000 00000000 00000000 11111111이다.

우리는 ARGB, 알파, 빨강, 초록, 파랑이 8비트의 구역으로 이루어져 있는 걸 안다. 

 

원하는 색상의 8비트를 비트 연산으로 이동하여 첫 8비트로 이동시키고, &연산으로 0xff와 하면 원하는 색상의 값을 얻을 수 있다는 것을 확인할 수 있다. 원하는 부분으로 이동시키는 부분은 value>>24은 알파로, value>>16은 빨강,

value>>8은 초록, 파랑은 첫 8비트므로 움직일 필요 없다. 

 

그림4. Value &0xff 연산 과정

 

 

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. 코드 실행결과

그림5. 이미지 흑백 처리