더북(TheBook)

IppImage 클래스는 영상의 모든 픽셀을 2차원 배열 형태로 접근할 수 있는 방법도 제공한다. IppImage 클래스의 멤버 함수인 GetPixels2D 함수가 바로 그것인데, GetPixels2D 함수를 사용하여 영상의 모든 픽셀 값에 접근하려면 아래와 같이 코드를 작성하면 된다.

int w = img.GetWidth();
int h = img.GetHeight();
BYTE** p2 = img.GetPixels2D();

for (int j = 0; j < h; j++)
for (int i = 0; i < w; i++)
{
    // p2[j][i] : (i, j) 좌표의 픽셀 값.
}

GetPixels2D 함수에 의해 BYTE** p2가 설정되면 p2를 2차원 배열처럼 사용할 수 있다. 즉, (0, 0) 위치의 픽셀 데이터 값은 p2[0][0]으로 접근할 수 있고, (x, y) 좌표의 픽셀 값은 p2[y][x] 형태로 접근할 수 있다. C/C++에서 배열을 표현할 때, y 좌표의 인덱스가 x 좌표의 인덱스보다 먼저 나타남을 유의하기 바란다. 위 코드에서 이중 for 루프는 영상의 모든 픽셀을 차례대로 순회하는 방법을 알려주는 코드이다. 이중 for 루프에서 바깥쪽 for 루프는 y축에 대한 반복을 나타내고, 안쪽 for 루프가 x축에 대한 반복이다.

그림 6-1은 가로 크기가 4이고, 세로 크기가 3인 작은 영상에서 픽셀 값을 참조하는 방법을 보여준다. GetPixels 함수를 사용할 경우, BYTE* 타입으로 반환된 p1은 1차원 배열처럼 사용할 수 있으며 p1[0]부터 p1[11]까지 참조할 수 있다. GetPixels2D 함수에 의해 반환된 BYTE** 타입의 p2는 2차원 배열처럼 사용할 수 있으며 p2[0][0]부터 p2[2][3]까지 접근할 수 있다. 이때 영상의 크기를 벗어나는 위치의 픽셀 값을 참조하면 안 된다. 예를 들어 p1[12] 또는 p2[0][4]처럼 영상의 크기를 벗어나는 위치의 픽셀 값을 참조하려고 하면 에러가 발생하여 프로그램이 비정상 종료를 할 수 있다. 특히 이러한 에러는 컴파일하는 동안 발견되지 않으므로 코드를 작성할 때 각별히 주의해야 한다.

그림 6-1 GetPixels 및 GetPixels2D 함수를 이용한 픽셀 값 참조
BYTE* p1 = img.GetPixels( );
BYTE** p2 = img.GetPixels2D( );
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.