더북(TheBook)

4.3.3 영상 생성과 소멸

IppDib 클래스와 마찬가지로 IppImage 클래스는 다수의 생성자와 소멸자를 갖는다.

• IppImage();                          // (1)
• IppImage(int w, int h);              // (2)
• IppImage(const IppImage<T>& img);    // (3)
• ~IppImage();                         // (4)

(1)번의 기본 생성자에서는 모든 멤버 변수를 0 또는 NULL로 초기화한다. (1)번 생성자로 생성된 IppImage 객체는 영상 정보는 포함하고 있지 않은 상태이다. 만약 특정 크기의 영상을 생성하면서 초기화하려면 (2)번 형태의 생성자를 사용하면 된다. (2)번 생성자는 가로 w, 세로 h 크기만큼의 영상을 만들고, 픽셀 값은 모두 0으로 초기화한다. (3)번은 복사 생성자이고, (4)번은 소멸자이다. 소멸자에서는 pixels 멤버 변수 값을 조사하여 NULL이 아니면 동적 할당된 메모리를 해제한다. 생성자 및 소멸자의 실제 구현 코드는 소스 4-10에 나타내었다.

소스 4-10 IppImage 클래스 - 생성자와 소멸자 (IppImage.h)
#include <memory.h>template<typename T>
IppImage<T>::IppImage()
    :width(0), height(0), pixels(NULL)
{
}

template<typename T>
IppImage<T>::IppImage(int w, int h)
    : width(w), height(h), pixels(NULL)
{
    pixels = new T*[sizeof(T*) * height];
    pixels[0] = new T[sizeof(T) * width * height];

    for (int i = 1; i < height; i++)
        pixels[i] = pixels[i - 1] + width;

    memset(pixels[0], 0, sizeof(T) * width * height); // 픽셀 값 초기화
}

template<class T>
IppImage<T>::IppImage(const IppImage<T>& img)
    : width(img.width), height(img.height), pixels(NULL)
{
    if (img.IsValid()) {
        pixels = new T*[sizeof(T*) * height];
        pixels[0] = new T[sizeof(T) * width * height];

        for (int i = 1; i < height; i++)
            pixels[i] = pixels[i - 1] + width;

        memcpy(pixels[0], img.pixels[0], sizeof(T) * width * height); // 픽셀 값 복사
    }
}

template<typename T>
IppImage<T>::~IppImage()
{
    if (pixels != NULL) {
        delete[] pixels[0];
        delete[] pixels;
    }
}

소스 4-10의 생성자에서 영상 데이터를 생성하는 코드와 소멸자에서 메모리를 해제하는 코드에 대해서는 이 책의 1.2절의 ‘변형된 2차원 배열 동적 할당’에서 설명한 바 있다. 소스 4-10과 같은 방식으로 픽셀 데이터 메모리 공간을 할당하면 영상의 픽셀 정보에 1차원 배열 방식뿐만 아니라 2차원 배열 방식으로도 접근할 수 있어서 유용하다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.