中井技術工房  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画像変換トップ > 頁トップ