2010年11月16日

giflibのインストール



GIFライブラリの入手先ですが、グーグルで「libgif」で検索してみたところ以下の四つのサイトがありました。

  1. sourceforge.netは、配布ファイル名は「giflib-4.1.6.tar.bz2」で、作成されるフォルダー名は「giflib-4.1.6」です。
  2. debian.orgは、配布ファイル名は「giflib_4.1.6.orig.tar.gz」で、作成されるフォルダー名は「giflib-4.1.6」です。
  3. Pyramid Workshopは、配布ファイル名「libGIF.tar.bz2」で、作成されるフォルダー名は「C libGIF」です。
  4. ubuntu.comは、配布ファイル名は「giflib_4.1.6.orig.tar.gz」で、作成されるフォルダー名は「giflib-4.1.6」です。

3のPyramid Workshopだけ内容のファイルに違いがあり、双方に付属のサンプルを比較検討したところ、「giflib-4.1.6」の方が使えそうなので、今回は多数派の「giflib-4.1.6」について解説することにしました。




今回はdebian.orgという名のサイトからダウンロードしました。



サイトの右端にある「Debianの資源」の欄の中にある「giflib_4.1.6.orig.tar.gz」をクリックすると、「giflib_4.1.6.orig.tar.gz」というファイルが自動的にダウロードされます。



次にダウンロードした「giflib_4.1.6.orig.tar.gz」ファイルを所定のフォルダー内にWinRAR等を使って解凍すると、「giflib-4.1.6」と言う名のフォルダーが展開されます。



「giflib-4.1.6¥windows」フォルダーにある「gifshow.dsw」は動かないので、独自にプロジェクトを作成していきます。
まずはVisualC++net2003を起動し、メニューから「ファイル」/「新規」/「プロジェクト」を選択して、「新規プロジェクト」ダイヤログを表示させます。テンプレートは「Win32 Project」、プロジェクト名は「gifshow」、「ブラウズ」ボタンを押してプロジェクトフォルダーを作成するフォルダーを先ほど作成した「giflib-4.1.6」の中の「windows」フォルダーに設定し、「OK」ボタンを押します。



「アプリケーションウィザード」が表示されますが、何も変更せずにそのまま「完了」ボタンを押します。



gifshow」ソリューションが作成され、内容がソリューションエクスプローラに表示されます。



ウィンドウズのエクスプローラで「giflib-4.1.6\windows」フォルダーにある以下のファイルを選択して、新たに作成した「gifshow」フォルダーに「Ctrl」キー+ドラッグ&ドロップでコピーして下さい。

gifshow.cpp gifshow.h gifshow.rc
GifWin.cpp GifWin.h resource.h StdAfx.h





VisualC++net2003に戻ると「リロード確認」ダイヤログが表示されているので、「Yes to All」ボタンを押して下さい。



ソリューションエクスプローラで、「gifshow」プロジェクトを右クリックしてポップアップメニューから「追加」/「既存アイテムの追加」を選択すると、「既存アイテムの追加」ダイヤログが表示されます。



先程コピーしたファイルで「gifshow」プロジェクトにない以下の二つのファイルを、「gifshow」フォルダーから「gifshow」プロジェクトに追加して下さい。

GifWin.cpp GifWin.h





ソリューションエクスプローラの一番上にある「ソリューション 'gifshow' (1 プロジェクト)」の行を右クリックしてポップアップメニューを表示させ、「追加」/「新規プロジェクト」を選択すると「新規プロジェクトの追加」ダイヤログが表示されるので、「テンプレート」は「Win32 Project」、プロジェクト名は「libgif」、「ブラウズ」ボタンを押して「giflib-4.1.6」フォルダーがあるフォルダーに設定し、「OK」ボタンを押します。



「アプリケーションウィザード」が表示されるので、アプリケーションの設定タブで、アプリケーションタイプはスタティックライブラリを選択し、プレコンパイルドヘッダーのチェックを外してから、「完了」ボタンを押します。



giflib-4.1.6」フォルダーのとなりに「libgif」フォルダーが作成されました。



ソリューションエクスプローラで、「libgif」プロジェクトを右クリックしてポップアップメニューから「追加」/「既存アイテムの追加」を選択すると、「既存アイテムの追加」ダイヤログが表示されます。

「giflib-4.1.6\lib」フォルダーの中にあるすべてのファイルをCtrl+Aで選択して、「libgif」プロジェクトに追加してください。




修正事項

複数画像の場合、ローカルカラーテーブルメモリーが削除されない為、メモリーリークが発生する不具合の修正。

「dgif_lib.c」のDGifGetImageDesc関数内の、357行目にあるif分の後に続く一つ目の条件文のすぐ後ろに、赤字部分を追加して、後方の分岐条件をコメントアウトして下さい。





/*** FIXME: Why do we check both of these in order to do this?
* Why do we have both Image and SavedImages? */

if (GifFile->Image.ColorMap)// && GifFile->SavedImages == NULL) ←コメントアウト
FreeMapObject(GifFile->Image.ColorMap);






「egif_lib.c」のEGifPutImageDesc関数内の、367行目のif文のすぐ上に、赤字部分の2行を追加して下さい。





GifFile->Image.Left = Left;
GifFile->Image.Top = Top;
GifFile->Image.Width = Width;
GifFile->Image.Height = Height;
GifFile->Image.Interlace = Interlace;

if (GifFile->Image.ColorMap) //←追加する行。
FreeMapObject(GifFile->Image.ColorMap); //←追加する行。


if (ColorMap) {
GifFile->Image.ColorMap = MakeMapObject(ColorMap->ColorCount,
ColorMap->Colors);
if (GifFile->Image.ColorMap == NULL) {
_GifError = E_GIF_ERR_NOT_ENOUGH_MEM;
return GIF_ERROR;
}






「gif_hash.c」の51行目の「#include "gif_lib.h"」のすぐ上に、malloc.hをインクルードする行を追加して下さい。





#include <stdio.h>
#include <string.h>
#include <malloc.h> //←追加する行。
#include "gif_lib.h"
#include "gif_hash.h"
#include "gif_lib_private.h"







ソリューションエクスプローラで「libgif」プロジェクトを右クリックしてポップアップメニューを表示させ、「プロパティ」を選択すると「libgifプロパティページ」ダイヤログが表示されます。



ダイヤログの左にあるツリービューで「コンフィギュレーションプロパティ」/「C/C++」/「コマンドライン」を選択し、「オプションの追加」エディットボックスに以下のコマンドラインをコピー&ペーストして、「OK」ボタンを押して下さい。

リリースビルドについても同様に、下記のコマンドオプションを追加して下さい。

/D "_OPEN_BINARY" /D "HAVE_IO_H" /D "HAVE_FCNTL_H" /D "HAVE_STDARG_H" /D "HAVE_BASETSD_H"


※上の状態のままのリリースビルドで、「コンフィギュレーションプロパティ」/「C/C++」/「全般」を選択し、「デバッグ情報フォーマット(Debug Information Format)」の欄がDisabledになっているか確認して下さい。



ソリューションエクスプローラで「gifshow」プロジェクトを右クリックしてポップアップメニューを表示させ、「プロジェクト依存関係」を選択すると「プロジェクト依存関係」ダイヤログが表示されるので、「依存関係」タブの「libgif」のチェックボックスにチェックを入れて「OK」ボタンを押します。



ソリューションエクスプローラで「gifshow」プロジェクトを右クリックしてポップアップメニューを表示させ、「プロパティ」を選択すると「gifshowプロパティページ」ダイヤログが表示されるので、ダイヤログの左にあるツリービューで「コンフィギュレーションプロパティ」/「C/C++」/「コード生成」を選択し、「ランタイムライブラリ」の欄のコンボボックスを「Single-threaded Debug (/MLd)」から「Multi-threaded Debug (/MTd)」に変更してから「OK」ボタンを押して下さい。

※「libgif」プロジェクトについても同様に、「ランタイムライブラリ」の欄のコンボボックスを「Single-threaded Debug (/MLd)」から「Multi-threaded Debug (/MTd)」に変更して下さい。



リリースビルドについても同様に、コンフィギュレーションコンボボックスを「Release」に切り替えてから、「ランタイムライブラリ」の欄のコンボボックスを「Single-threaded (/ML)」から「Multi-threaded (/MT)」に変更して下さい。

※「libgif」プロジェクトについても同様に、「ランタイムライブラリ」の欄のコンボボックスを「Single-threaded (/ML)」から「Multi-threaded (/MT)」に変更して下さい。

GifWin.cpp」にある「gif_lib.h」のインクルード定義にパスを追加します。

#include "stdafx.h"
#include <windowsx.h>
#include "GifWin.h"
extern "C"
{
#include "..\..\lib\gif_lib.h" ←赤字部分を追加して下さい。
}


メニューで「ビルド」/「構成マネージャ」を選択すると「構成マネージャ」ダイヤログが表示されるので、その中の「アクティブソリューション構成」のコンボボックスで「Release」を選択し、「閉じる」ボタンを押します。



最後にビルドしてエラーが出なければ成功です。



ウィンドウズのエクスプローラで「gifshow\libgif\Release」フォルダーに「libgif.lib」ファイルが作成されているか確認して下さい。



VisualC++net2003に戻ってから「F5」キーを押してプログラムを起動すると、「gifshow」のメインウィンドウが表示されるのでエクスプローラから適当なGIF画像をドラッグ&ドロップして、正しく画像が表示されるか確認して下さい。






posted by ひろし at 13:54| Comment(0) | GIFファイルフォーマット | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。