中井技術工房
VC/MFC による PNG画像変換
VC++6 による libpng のコンパイル
March.06,2011
トップ >
PNG画像変換トップ >
ここ
■
Dev.Studio からの libpng のコンパイル方法
ここでは zlib,libpng のソースを VC++6 の統合環境( Developer Studio )を使ってコンパイルするテクニックを紹介します。
zlib, libpng の公開ソースは簡単に入手できますが、Windows 用には DOS プロンプトでのコンパイル方法ばかり紹介されており
こんなんやっとれん
と思い、いろいろトライして Dev.Studio でコンパイルできるようになりました。
なお、libpng のコンパイルには zlib が必要ですので、zlib のコンパイルを先にやってください。
●
Step1 --- zlib のコンパイル
[ zlib のソース入手 ]
PNG Source Code and Libraries
から zlib123.zip を入手して展開してください。下図のようになるはずです。
「Visualc6」の下部ディレクトリはいろいろ作業してできたディレクトリで、初期状態ではありません。
本図のようにサブディレクトリを開いていくと、visualc6 というディレクトリがあります。
そこで VC6 を立ち上げて、「ワークスペースを開く」で、この中の zlib.dsw を選択してください。
[ コンパイル設定1 ]
「ビルド→アクティブな構成の設定」メニューで、次のウインドウが出ますので、
Win32 LIB Release
を選択してください。これはスタティックライブラリを使用することを意味します。
DLL は使いません。
DLL を使用する設定をすると、さまざまなトラブルに巻き込まれますので注意ください。
[ コンパイル設定2 ]
「プロジェクト→設定」メニューで、次のウインドウが出ます。
このとき「一般」タブの「Microsoft Foundation Class」を「
MFC スタティックライブラリを使用する
」を選択してください。
「MFC を使用しない」選択をすると、呼び出しプログラムのリンク時に C 関数の複数定義エラーに悩まされます。
[ コンパイル ]
「ビルド→リビルド」メニューで、ビルドしてください。
「Visualc6\Win32_LIB_Release 」のところに zlib.lib ができています。
●
Step2 --- libpng のコンパイル
[ libpng のソース入手 ]
PNG Source Code and Libraries
から lpng1234.zip を入手して展開してください。下図のようになるはずです。
このとき 「〜\lpng1234\lpng1234」のディレクトリに zlib.h,zconf.h がなければ、上記の zlib ディレクトリからコピーしてください。
さらに上で作った zlib.lib も同じ「〜\lpng1234\lpng1234」のディレクトリにコピーしてください。
本図のように開いていくと、visualc6 というディレクトリがあります。
VC6 を立ち上げて、「ワークスペースを開く」で、この中の libpng.dsw を選択してください。
[ コンパイル設定1 ]
「ビルド→アクティブな構成の設定」メニューで、次のウインドウが出ますので、
Win32 LIB Release
を選択してください。
[ コンパイル設定2 ]
「プロジェクト→設定」メニューで、次のウインドウが出ます。
このとき「一般」タブの「Microsoft Foundation Class」を「
MFC スタティックライブラリを使用する
」を選択してください。
[ コンパイル ]
「ビルド→リビルド」メニューで、ビルドしてください。
「Visualc6\Win32_LIB_Release 」のところに libpng.lib ができています。
●
Step3 --- 動作確認
上で作った zlib, libpng dll が正常に動作するかをチェックします。
ここはパスして、いきなり
VC6による BMP/PNG DF変換プログラム
の頁にとんでもかまいません。
実プログラムから入った方が早いかもしれませんので。
[ テストプログラムの構築 ]
VC6 でダイアログベースで、次のようにボタンをつけたプロジェクトを作ってください。
[ 格納状態 ]
「〜\PngTest\Chk」は実行ディレクトリとしてマニュアルで作ったディレクトリで、私のクセです。
[ zlib,libPng の格納 ]
「〜\PngTest」のところはこのプロジェクトのソースが格納されているところですが、ここに
zlib プロジェクトの zlib.lib, zlib.h, zconf.h
libpng プロジェクトのlibpng.lib, png.h, pngconf.h
を格納してください。
スタティックライブラリですので、DLLは不要です。
[ コンパイルの設定 ]
「プロジェクト→設定」メニュークリックで次のように設定します。
本プロジェクトは Release モードにしていますが、「デバッグ」タブのところで実行可能ファイルとして「〜\Chk\PngTest.exe」を作り、「〜\Chk」で実行するようにしています。
ここはお好みのようにしてください。
さらに「リンク」タブのところで、上と同じ実行ファイルを指定し、「ライブラリ」として zlib.lib, libpng.lib を指定します。
これはソースのところにこの2本があることが条件です。文句を言われたらフルパス指定してください。
[ ソースの準備 ]
まず本プロジェクトの主プログラム( PngTestDlg.cpp とか)の先頭部分に次の記述を加えてください。
// PNG DF 処理用
#include <stdio.h>
#include <stdlib.h>
#include "png.h"
さらに OnButton1() の関数で次のように書込みます。
このソースは
PNG利用術
で紹介されていた PNG ファイル読込み用のテストプログラムを改造したものです。
libpng は汎用に作られており、MFC 風な利用ができません。残念ですが、昔の C 風なコーディングをせざるを得ません。
-
- unsigned char **image;
- int i;
- //--------------------------------------------------------------------
- // PNG ファイルを準備(書き込み用データ)
- //--------------------------------------------------------------------
- static char *szFilter_png =
- "png (*.png)|*.png|All Files (*.*)|*.*||";
- CFileDialog dlg(
- FALSE, // FALSE = ファイル名指定して保存する
- "png", // デフォルト拡張子
- "*.png", // 初期表示なし
- OFN_CREATEPROMPT | OFN_HIDEREADONLY,
- szFilter_png,this);
- if(dlg.DoModal()!=IDOK) return;
- char fPathPNG[_MAX_PATH]; // ファイルパスの取得
- int n=sprintf(fPathPNG,dlg.GetPathName());
- //--------------------------------------------------------------
- // ファイルオープン、PNG ソースは C タイプで書かれている
- FILE *fp;
- png_structp png_ptr; // PNG 構造体ポインタ
- png_infop info_ptr; // PNG 情報ポインタ
- unsigned long width,height; // PNG 画像の幅、高さ
- int bit_depth,color_type,interlace_type;
- fp=fopen(fPathPNG,"rb"); // ファイルを開く
- // png_ptr構造体を確保、初期化する
- png_ptr=png_create_read_struct(
- PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
- // info_ptr構造体を確保、初期化する
- info_ptr=png_create_info_struct(png_ptr);
- png_init_io(png_ptr,fp); // libpngに fp を通知
- png_read_info(png_ptr,info_ptr); // PNG DF のヘッダを読込む
- // ヘッダ各情報は info_ptr->xxxx で取り出せるが
- // 次のようにしてもOK
- // IHDR情報を取得
- png_get_IHDR(png_ptr,info_ptr,
- &width,
- &height,
- &bit_depth,
- &color_type,
- &interlace_type,
- NULL,NULL);
- // 2次元配列を確保
- image=(png_bytepp)malloc(height*sizeof(png_bytep));
- for(i=0;i<(int)height;i++)
- image[i]=(png_bytep)malloc(png_get_rowbytes(png_ptr,info_ptr));
- // 画像データを読み込む>
- png_read_image(png_ptr,image);
- for(i=0;i<(int)height;i++) free(image[i]);
- free(image);
- png_destroy_read_struct(
- &png_ptr,&info_ptr,(png_infopp)NULL);
- char msg[256];
- sprintf(msg,"画像 B=%d H=%d",width,height);
- MessageBox(msg);
- MessageBox("ファイルは開けました","確認",0);
- fclose(fp);
[ ソースのダウンロード ]
キー入力するのもたんへんじゃろ、DLできるようにしておくかな。
PngTest.cpp(PngTest.lzh) のダウンロード
[ 実行 ]
ソースができたら、実行させてみてください。適当に PNG ファイルを選んだときに画像サイズを正常に答えてきたらOKです。
トップ >
PNG画像変換トップ >
頁トップ