2013/12/29日時点の記事です。
libpngをVisual C++ 2012で使ってみました。
途中でCygwinを使って作業した関係で/と\の表記がぐちゃぐちゃになっていますが許してください。
libpng使い方 For Visual Studio 2012(VC++)
必要なもの
Visual Studio 2012(他バージョンでも可)
zlib
libpng
1.ダウンロード&展開
zlibをダウンロードする
http://www.zlib.net/
バージョン1.2.8
The current release is publicly available here:
zlib source code, version 1.2.8, zipfile format
を使う。
libpngをダウンロードする。
http://www.libpng.org/pub/png/libpng.html
バージョン1.6.7
Source code:
prodownloads.sourceforge.netのzip版を選ぶ。
ダウンロードしたら、解凍する
右クリックから解凍でも、そのほかいろいろお任せします。
展開したらこんな感じの構成になっている。
- zlib
zlib-1.2.8/ ├── adler32.c ├── amiga ├── as400 ├── ChangeLog ├── CMakeLists.txt ├── compress.c ├── configure ├── contrib ├── crc32.c ├── crc32.h ├── deflate.c ├── deflate.h ├── doc ├── examples ├── FAQ ├── gzclose.c ├── gzguts.h ├── gzlib.c ├── gzread.c ├── gzwrite.c ├── INDEX ├── infback.c ├── inffast.c ├── inffast.h ├── inffixed.h ├── inflate.c ├── inflate.h ├── inftrees.c ├── inftrees.h ├── make_vms.com ├── Makefile ├── Makefile.in ├── msdos ├── nintendods ├── old ├── qnx ├── README ├── test ├── treebuild.xml ├── trees.c ├── trees.h ├── uncompr.c ├── watcom ├── win32 ├── zconf.h ├── zconf.h.cmakein ├── zconf.h.in ├── zlib.3 ├── zlib.3.pdf ├── zlib.h ├── zlib.map ├── zlib.pc.cmakein ├── zlib.pc.in ├── zlib2ansi ├── zutil.c └── zutil.h
- libpng
lpng167/ ├── ANNOUNCE ├── CHANGES ├── CMakeLists.txt ├── configure ├── contrib ├── example.c ├── INSTALL ├── libpng.3 ├── libpng.pc.in ├── libpng-config.in ├── libpng-manual.txt ├── libpngpf.3 ├── LICENSE ├── png.5 ├── png.c ├── png.h ├── pngbar.jpg ├── pngbar.png ├── pngconf.h ├── pngdebug.h ├── pngerror.c ├── pngget.c ├── pnginfo.h ├── pngmem.c ├── pngnow.png ├── pngpread.c ├── pngpriv.h ├── pngread.c ├── pngrio.c ├── pngrtran.c ├── pngrutil.c ├── pngset.c ├── pngstruct.h ├── pngtest.c ├── pngtest.png ├── pngtrans.c ├── pngwio.c ├── pngwrite.c ├── pngwtran.c ├── pngwutil.c ├── projects ├── README ├── scripts └── TODO
2.ビルドしてスタティックライブラリを作成。
テキトーにディレクトリを作ります。
マイドキュメントでもどこでもいいのでテキトーにディレクトリを作ります。
私はVisualStudioの標準プロジェクト置き場の
C:\Users\[ユーザ名]\Documents\Visual Studio 2012\Projects\
でCygwin上でやります。
エクスプローラーの場合は日本語で書いてあることを実施すればOKです。
こいつを作業用ディレクトリlibpingとします。
作業用フォルダの整理等
## 作業用ディレクトリを作る。 $ mkdir libping ## それぞれlibpng zlibにコピーしてリネームします。 $ cp -pr lpng167 libpng $ cp -pr zlib-1.2.8 zlib ## libpngとzlibをlibpingフォルダに移動します。 $ mv libpng zlib libping $ ls libping ## libpng zlib ## libping/libpng/projects/vstudioにzlib.propsというファイルがあるのでこいつを書き換えます。 $ cd libping/libpng/projects/vstudio $ ls libpng pngstest pngunknown readme.txt WARNING zlib.props pnglibconf pngtest pngvalid vstudio.sln zlib
zlib.propsを書き換える
zlib.propsをサクラエディタかなんかで開いてあげてください。
<ZLibSrcDir>..\..\..\..\zlib1.2.5</ZLibSrcDir>
とかかれている行があるので、
これを書き換えます。
いまの構成だと3個上がったところと同じ階層にzlibがあるのでこうします。
<ZLibSrcDir>..\..\..\..\zlib</ZLibSrcDir>
libping/libpng/projects/vstudio
にvstudio.slnがあるのでダブルクリックしてVSを立ち上げます。
VC++プロジェクトを更新します。とかなんとか出てくるので更新します。
ソリューション構成はDebug Libraryを選んでビルドします。
上のほうにあるコンボボックスにあるあれです。
ソリューションのビルドをします。
========== ビルド: 7 正常終了、0 失敗、0 更新不要、0 スキップ ==========
となればOKです。
次にRelease Libraryを選択します。
またビルドします。
3.自作プログラムに組み込むために配置する
ライブラリ置き場を作ってやる
[ヘッダー] libping\libpng\png.h libping\libpng\pngconf.h libping\libpng\pngdebug.h libping\libpng\pnginfo.h libping\libpng\pnglibconf.h libping\libpng\pngpriv.h libping\libpng\pngstruct.h zlib\libpng\zconf.h zlib\libpng\zlib.h [ライブラリ] libping\libpng\projects\vstudio\Debug Library\libpng.lib libping\libpng\projects\vstudio\Release Library\zlib.lib
にあるものを、
Cドライブの直下にlibpingなどとディレクトリを作ってやり
以下のような構成でおいておく(コピーしてやる)。
C:\libping ├── png.h ├── pngconf.h ├── pngdebug.h ├── pnginfo.h ├── pnglibconf.h ├── pngpriv.h ├── pngstruct.h ├── zconf.h ├── zlib.h ├── Debug │ ├── libpng16.lib │ └── zlib.lib └── Release ├── libpng16.lib └── zlib.lib
構成プロパティを変更する。
<<構成プロパティの設定>> 基本的にlibpngのプロジェクト設定に合わせる必要があります。 [Debug] 全般 マルチバイト文字セットを使用する C/C++ > 全般 追加のインクルードディレクトリ C:\libping C/C++ > コード生成 ランタイムライブラリ マルチスレッドデバッグ /MTd リンカー > 全般 追加のライブラリ ディレクトリ C:\libping\Debug インクリメンタルリンクを有効にする いいえ リンカー > 入力 追加の依存ファイル zlib.lib;libpng16.lib [Release] 全般 マルチバイト文字セットを使用する C/C++ > 全般 追加のインクルードディレクトリ C:\libping C/C++ > コード生成 ランタイムライブラリ マルチスレッド /MT リンカー > 全般 追加のライブラリ ディレクトリ C:\libping\Release インクリメンタルリンクを有効にする いいえ リンカー > 入力 追加の依存ファイル zlib.lib;libpng16.lib リンカー > 最適化 リンク時のコード生成 リンク時のコード生成を使用
プロジェクトのカレントワーキングディレクトリ(作業ディレクトリ)となるところになにか画像を置く。
今回の場合だと、
Projects\(プロジェクト名)\(プロジェクト名)
のところにテキトーなpngファイルを置く(ファイル名はv01.pngとしました)。
4.ソースを書いてビルドする
pngtestプロジェクトを作成する
ソースはここ
もしかしたらソースはバグってるかもしれません。
以上使い方終わり。
とここまで頑張ったのですが、もっとかんたんなWrapperが既にあるようだったり、
WindowsだとGDI+でPNGを読めるとか……。WICもあるってさ。WICのほうがなういっす。
参考
pngライブラリ(libpng, zlib)の使い方 | レオン ≡ほのぼのブログ≡
PNGを読み込む(VC++でlibpngを使用する)
マルチメディアファイルフォーマット : PNGファイルの読み込み
http://dixq.net/forum/viewtopic.php?f=3&t=9406
使わせていただいたPNG画像
フレームワークとして使っているソース
http://msdn.microsoft.com/ja-jp/library/ff381400%28v=vs.85%29.aspx
2014/02/13 追記
GDI+と書きましたが、それよりも今はWIC(Windows Imaging Component)を使ったほうがよさそうです。だけどCOMでほとんど英語の情報しかないのでなかなかつらいところ…。
Windows環境依存になるけれどもWICを使ったサンプルはこちらです。