본문 바로가기

Developement/C/C++

FLTK 1.3.x 를 위한 smooth image scaler: fl_smimg

 FLTK 1.3.x 버젼을 쓰면서 부족한 부분이 있다면 바로 Fl_Image 의 copy() 함수를 통한 scale 기능이라 하겠습니다. 실제 내부에서 이 scale 엔진은 GraphicDriver의 resize 를 호출 하는데 이 부분은 실제 nearest resize 가 수행 되므로 뭔가 부드럽게 연산이 처리된 형태의 이미지를 얻을수가 없게 됩니다.


 이를 해결하기 위해 만든 것이 fl_smimg 이며, 이 소슨는 FreeImage Library 3 의 resize 부분을 추출 해서 FLTK 에 맞게 변경 하였으며, 그 적용은 아래 처럼 됩니다. 이미지는 인터넷에 도는 것을 임의로 사용하였는 상태 입니다. (우주선 이미지는 Mass Effect 의 Normandy 호 입니다 )


클릭하여 큰 이미지로 볼수 있습니다.


 먼저 Fl_Window 에 Fl_Box 하나를 만들어 배경으로 지정하고, 그 위에 다시 Fl_Box 두개를 각각 만들어 fl_smimg 를 통해서 scale 된 이미지와, 일반 copy() 를 통해 scale 된 이미지를 2가지 동일하게 그렸을 때 차이를 비교 했습니다.



 fl_smimg 로 Lanczos3 알고리즘을 사용한 32bit( RGBA ) 이미지는 꽤 부드럽게 scale 되었습니다. 이미 꿀뷰3 와 같은 곳에서도 많이 쓰이는 알고리즘으로서 그 품질은 입증된 상태라 하겠습니다.

 반면 기본 scale 은 아래 이미지 처럼 Alias 라 불리는 계단 형태의 깨지는 모습을 그대로 보여줍니다.



 fl_smimg 에서 제공되는 filter 는 FreeImage Library 3 (이하 FIL3 로 표기) 에서 제공하는 것과 같으며, 이중 Blackman filter 는 제외 하였습니다. (뭔지 모르겠다는 이유가 큽니다) 기본 형태는 FIL3 의 CGenericFilter class 를 이름을 변경 하여 다음과 같이 제공 합니다.


CGenericFilter -> GenericFilter

CBoxFilter -> BoxFilter

CBilinearFilter -> BilinearFilter

CBicubicFilter -> BicubicFilter

CCatmullRomFilter -> CatmullRomFilter

CLanczos3Filter -> Lanczos3Filter

CBSplineFilter -> BSplineFilter


 또한 CResizeEngine 은 ResizeEngine 으로, MFC 에서 관례적으로 쓰는 Class 이름 앞에 C 를 붙이는 형태를 모두 제거한 상태 입니다.


 실제 사용은 fl_smimg.h 와 cpp 파일 두개만 보면 이해 할 수 있는 수준 입니다만, 약간의 예제를 보면 다음과 같이 사용 되었습니다.


            GenericFilter* afilter = new Lanczos3Filter();
            ResizeEngine resizer( afilter );

            Fl_Image* imgscaled = resizer.scale( (Fl_RGB_Image*)imgsrc, 450, 400 );

            delete afilter;

            box_im1 = new Fl_Box( 10, 10, 450, 400, "Resize Engine used.\n* Lanczos3 * " );
            if ( box_im1 != NULL )
            {
                box_im1->labelcolor( FL_WHITE );
                box_im1->box( FL_NO_BOX );
                box_im1->image( imgscaled );
            }


다운로드는 아래 파을 다운로드 받으시면 되며, 이는 GPL v3 에 따른 공개 입니다.

원본 소스는 Code::Blocks 에서 열어서 MinGW 를 통해 바로 compile 가능 하나, 먼저 시스템에 FLTK 1.3.x 버젼이 compile 되고, 이를 Code::Blocks 에서 FL 환경 인자로 설정이 되어 있어야 합니다. ( OS 는 아무것이나 상관 없이 FLTK 가 설치되는 상태면 동일하게 동작 합니다. Windows, Linux, Embedded Linux, MacOS 정도 )


 물론 GPL v3 에 따라 소스는 공개되고 저유로히 사용이 가능 합니다만, 이에 따르는 일절 책임은 절대 지지 않음을 먼저 이해해 주시기 바랍니다. 또한 해당 코드 내에 버그에 대해서도 대응하지 않음은 물론, 이에 따른 버그 수정 또한 다운로드 받아 쓰는 사용자의 책임임을 먼저 인지 하시기 바랍니다.


fltk_smoothresize.7z


FreeImage 3

 Design and implementation by
 - Floris van den Berg (flvdberg@wxs.nl)
 - Herv?Drolon (drolon@infonie.fr)

This file is part of FreeImage 3, and modified from it's original.

COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
THIS DISCLAIMER.

Use at your own risk!


"fl_smimg" is based in part on the work of the FLTK project (http://www.fltk.org).