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차원 배열 방식으로도 접근할 수 있어서 유용하다.

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