본문 바로가기

Developement/C/C++

FLTK 1.3.4-1 을 위한 fl_imgtk 개발 중.


 FLTK 를 쓰면서 항상 불편 한 점은 여러 있을 수 있겠습니다만, 기본적으로 이미지 처리를 하는 기능이 너무 빈약 하다 보니, 이런 점들을 하나 둘씩 만들어 쓰다가 결국 이번에 하나로 뭉치기로 하였습니다.

 아직까진 개발중인 부분이 많다 보니 어디에 올리진 않고 있습니다만, 곧 정리가 더 되는데로 GitHub 나 BitBucket 에 올리는 것을 목적으로 할 예정 입니다.


 기본적으로 현재 여러 기능들이 지원 되며, 그 항목은 다음과 같습니다.


  • Fl_RGB_Image 를 이용한 다양한 처리 ( Fl_JPEG_Image 나 Fl_PNG_Image 의 color depth 3 이상이면 사용 가능 )
  • 이미지 고속 회전 90도, 180도, 270도
  • 이미지 자유 회전 0~359 도 (alias 처리는 하지 않음)
  • 밝기, 콘트라스트, 감마 조절
  • 샤픈,블루어 필터 (kernal matrix filter 구현 사용)
  • 사용자가 만들어 쓰는 필터 기능
  • Fl_Widget 을 Fl_RGB_Image 로 그려서 받아 낼 수 있는 기능


추가된 기능은 다음과 같습니다.


  • Tone mapping (HDR) 지원: Drago 및 Reinhard 알고리즘 이용.
  • 이미지 여러장 겹치기 ( 다중 노출 )
  • 이미지 특정 위치 잘라 내기
  • 이미지에 다른 이미지 붙이기


위 기능중 구현이 끝난 것들에 대해서는 아래 첨부 파일로 demo 를 돌려 볼 수 있습니다.

Windows 64bit 이상에서만 구동 됩니다.

fl_imgtk_20170324_0_demo64.7z


또한 현재 구현된 헤더는 다음과 같으나, 곧 Open Source 로 올리면서 블로그 글에서는 헤더 내용을 지우도록 하겠습니다.


#ifndef __FL_IMGTOOLKIT_H__
#define __FL_IMGTOOLKIT_H__

⁄*******************************************************************************
* fl_imgtk.H , version 2017-03-24-0
* =============================================================================
* A tool kit for basic FLTK image processing.
* (C) 2016-2017 Raphael Kim, Raph.K. ( rageworx or rage.kim @gmail.com )
* All rights reserved for MIT license.
*******************************************************************************⁄

#include <FL⁄Fl.H>
#include <FL⁄Fl_Image.H>
#include <FL⁄Fl_RGB_Image.H>

namespace fl_imgtk
{
    typedef struct
    {
        uchar   w;      ⁄⁄⁄ Width
        uchar   h;      ⁄⁄⁄ Height
        float   f;      ⁄⁄⁄ Factor
        float   b;      ⁄⁄⁄ Bias
        uchar   msz;    ⁄⁄⁄ Matrix size
        float*  m;      ⁄⁄⁄ Matrix array (dynamical allocation)
    }kfconfig; ⁄⁄⁄ Kernel Filter Configuration.

    ⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄

    Fl_RGB_Image* flip_horizontal( Fl_RGB_Image* img );
    Fl_RGB_Image* flip_vertical( Fl_RGB_Image* img );

    Fl_RGB_Image* rotate90( Fl_RGB_Image* img );
    Fl_RGB_Image* rotate180( Fl_RGB_Image* img );
    Fl_RGB_Image* rotate270( Fl_RGB_Image* img );

    Fl_RGB_Image* rotatefree( Fl_RGB_Image* img, float deg );

    ⁄***
    * these following methods: Gamma, Brightness, Contrast
    * are motivated from FreeImageToolkit open source.
    * --  http:⁄⁄freeimage.sourceforge.net⁄
    *                      ,by Following FreeImage License.
    *
    * reprogrammed by Raph.K. (rageworx@gmail.com).
    ***⁄
    ⁄⁄ Gamma default = 1.0
    Fl_RGB_Image* gamma( Fl_RGB_Image* img, double gamma );
    ⁄⁄ perc => -100 ~ 100
    Fl_RGB_Image* brightness( Fl_RGB_Image* img, double perc );
    ⁄⁄ perc => -100 ~ 100
    Fl_RGB_Image* contrast( Fl_RGB_Image* img, double perc );

    Fl_RGB_Image* filtered( Fl_RGB_Image* img, kfconfig* kfc );

    ⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄

    Fl_RGB_Image* draw_widget_to_image( Fl_Widget* w );
    ⁄***
    * preset configs : blur, blurmore, sharpen, sharpenmore
    * null = empty one.
    ****⁄
    kfconfig* new_kfconfig( const char* preset );

    ⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄⁄

    void discard_user_rgb_image( Fl_RGB_Image* &img );
    void discard_kfconfig( kfconfig* &kfc ); ⁄⁄⁄ Not Kentucky Fried Chicken !
};

#endif ⁄⁄⁄ of __FL_IMGTOOLKIT_H__

FLTK 를 쓰시는 분들이 이쁜 GUI 를 만드는데 어느정도 기여가 되면 좋겠습니다.