GIF 画像を表示する

SUSIE のプラグイン(DLL) を使って GIF 画像を表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

GIF Object Class の説明

  1. JPEG も GIF も SUSIE のプラグイン(DLL) を使うと基本的には同じようにプログラムできます。
    そっくりでは面白くないので GIF Object Class を作成して GIF 画像を表示します。
    JPEG 画像の表示は Jpeg 画像を表示する を参照して下さい。
  2. GIF 画像を表示する SUSIE のプラグイン(Ifgif.spi) をダウンロードして下さい。
    ifgif.spi の拡張子は spi になっていますが、実態は DLL です。
    Dyamic にリンクするので、プログラムの作成に必要な DLL 関係のファイルは不要です。
    詳細は DLL を Dyamic にリンクする を参照して下さい。
  3. プログラムを実行するには次のファイルをカレントディレクトリまたは、C:\Windows\system32 のフォルダーに格納して下さい。
    Ifgif.spi GIF 画像をメモリに展開する DLL です
  4. GIF Object Class のヘッダファイル gif.h です。
        /*★ GIF Object Header File    前田 稔 ★*/
        #define  SAFE_DELDC(p)   { if (p) { DeleteDC (p);   (p)=NULL; } }
        #define  SAFE_DELOBJ(p)  { if (p) { DeleteObject(p); (p)=NULL; } }
    
        // SPI ENTRY
        typedef int (PASCAL *GetPluginInfo)(int,LPSTR,int);
        typedef int (PASCAL *IsSupported)(LPSTR,DWORD);
        typedef int (PASCAL *GetPictureInfo)(LPSTR,long,UINT,struct PictureInfo*);
        typedef int (PASCAL *GetPicture)(LPSTR,long,UINT,HANDLE*,HANDLE*,FARPROC,long);
        typedef int (PASCAL *GetPreview)(LPSTR,long,UINT,HANDLE*,HANDLE*,FARPROC,long);
    
        class GIF
        { protected:
            HWND        hWnd;
            HINSTANCE   hSpi;
            HBITMAP     hBmp;               //画像の HBITMAP
            HDC         hBmpDC;             //画像の HDC
            BITMAPINFO  *pBInfo;            //hBInfo の LocalLock POINTER
    
          public:
            BYTE        *pBm;               //hBm の LocalLock POINTER
            long        Width;              //画像の幅
            long        Height;             //画像の高さ
    
            GIF(HWND hWnd);                 //Constructor
            virtual ~GIF();                 //Destructor
            void        CreateBuf();
            void        GetSpi();
            HRESULT     Load(LPSTR ImageName);
            HRESULT     Show(long x, long y);
            HPALETTE    DIBtoPAL(HANDLE hBInfo);
        };
        
  5. CreateBuf() は画像用の Buffer を生成する関数です。
    GetSpi() は ifgif.spi(DLL) とリンクして、ENTRY ADDRESS を設定する関数です。
    Load() は GIF 画像をロードして、画像用の Buffer に格納する関数です。
    Show() は GIF 画像を表示する関数です。
    DIBtoPAL() は BITMAPINFO からパレットを作る関数です。
  6. GIF 画像の表示は JPEG 画像を表示するプログラムと基本的には同じです。
    プログラムの詳細は Jpeg 画像を表示する を参照して下さい。

MAIN プログラムの説明

  1. Gif は GIF Object Class の定義です。
    ImgName[] に GIF ファイルの名前が格納されます。
        #include    "gif.h"
        #define     SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
    
        HINSTANCE   g_hInst;
        HWND        g_hWnd;
        GIF         *Gif= NULL;         //GIF Object Class
        char        ImgName[24]= "kishi.gif"; 
        
  2. WinMain() は何時もと同じです。
  3. WM_CREATE: で GIF Object Class を生成して、GIF 画像をロードします。
            case WM_CREATE:
                Gif= new GIF(hWnd);
                Gif->Load(ImgName);
                break;
        
  4. WM_PAINT: では Show() で画像を表示します。
            case WM_PAINT:
                Gif->Show(50,50);
                break;
        
  5. WM_DESTROY: では終了前に Object Class を開放して下さい。
            case WM_DESTROY:
                SAFE_DELETE(Gif);
                PostQuitMessage(0);
                break;
        

【演習】

  1. プログラムを完成させて下さい。
  2. GIF も JPEG と同じように表示することが出来ます。
  3. JPEG は透明色の設定には向いていませんが、GIF は透明色を設定することができます。

【メモ】

JPEG の圧縮方式は不可逆圧縮なので、圧縮前の画像に戻るとは限りません。
このことは「透明色を設定する」ときに重要で、黒(0.0.0)を透明色に設定することにして BMP から JPEG に変換して もう一度 BMP に戻すと、見た目には解かりませんが「0,0,0」の黒が少し薄くなることがあります。
透明色の黒は完全に 0,0,0 でなければならず、薄くなった部分は透明にはなりません。
それに比べて GIF は256色ですが、完全に復元されるので透明色を設定することもできます。

超初心者のプログラム入門(Win32API C++)