αチャンネル付きPNGファイル読み込みDLL
ReadMe
このDLLでできること
半透過情報を持つPNGファイルを読み込み、その情報を保持したまま、指定したビットマップに書き込みます。
特徴
- libpng+zlibを使用しています。
- このDLLの4つの関数を順に呼び出すだけで、PNGファイルを読み込むことができます。
- Delphi用のpasファイルが付属しています。
- 一応マルチスレッドにも対応できるように設計してあります。(未検証)
仕様
24bitRGBカラーのPNGファイルまたは32bitRGBAカラーのPNGファイルのみ読み込むことができます。少しソースに手を加えると、他形式にも対応できますが、個人的にはこれで十分であると判断したため、このような仕様になっています。要望があれば今後のバージョンで対応します。
使用方法
PNGファイルを利用するまでの全体的な流れは以下の通りです。
CreatePNGLoader関数
↓
GetPNGLoaderInfo関数
↓
ビットマップを調整
↓
GetImageDataToBitmap関数
↓
DeletePNGLoader関数
↓
描画など
関数リファレンス - C言語編
#define INTEXP extern "C" __declspec(dllexport) signed long __stdcall
INTEXP CreatePNGLoader(TPNGLoaderID* PPNGLoaderID, char* FileName);
PNGLoaderを初期化します。
第1引数
TPNGLoaderID型の変数を作成して、そのポインタを渡してください。ここで初期化したPNGLoaderで他の関数を使用する場合は、ここで渡したTPNGLoaderIDを渡して下さい。
第2引数
読み込むPNGファイルのファイル名
INTEXP GetPNGLoaderInfo(TPNGLoaderID PNGLoaderID, PNGLINFO* infop);
PNGファイルの画像情報(大きさ、色数等)を取得します。
第1引数
CreatePNGLoaderで取得したPNGLoaderIDです。
第2引数
画像情報を取得する構造体変数を作成して、そのポインタを渡して下さい。
typedef struct
{
signed long width; /*幅*/
signed long height; /*高さ*/
signed long bit_depth; /*色の1成分を表現するのに必要なビット数*/
unsigned long color_type; /*カラーフォーマット*/
} PNGLINFO;
カラーフォーマットは以下の通りです。
#define CT_UNKNOWN 0x00
#define CT_RGBA32 0x81 /*32ビットRGBAカラー(アルファチャンネルあり)*/
#define CT_RGB24 0x01 /*24ビットRGBカラー*/
INTEXP GetImageDataToBitmap(TPNGLoaderID PNGLoaderID, HBITMAP hbmp);
指定したビットマップに画像データを書き込みます。
第1引数
CreatePNGLoaderで取得したPNGLoaderIDです。
第2引数
有効なビットマップハンドルを渡して下さい。ビットマップの大きさや画像フォーマットが読み込むPNGファイルと異なるとエラーを返します。(bmBitsPixel等を正しく設定して下さい。)ビットマップのフォーマットについては
MSDN等を参照して下さい。
INTEXP DeletePNGLoader(TPNGLoaderID* PPNGLoaderID);
ファイルをクローズし、メモリーを解放します。
第1引数
CreatePNGLoaderで取得したPNGLoaderIDへのポインタです。
関数リファレンス - Delphi編
function CreatePNGLoader(PPNGLoaderID: PTPNGLoaderID; FileName: PChar): Integer; stdcall;
PNGLoaderを初期化します。
第1引数
TPNGLoaderID型の変数を作成して、そのポインタを渡してください。ここで初期化したPNGLoaderで他の関数を使用する場合は、ここで渡したTPNGLoaderIDを渡して下さい。
第2引数
読み込むPNGファイルのファイル名
function GetPNGLoaderInfo(PNGLoaderID: TPNGLoaderID; infop: PPNGLINFO): Integer; stdcall;
PNGファイルの画像情報(大きさ、色数等)を取得します。
第1引数
CreatePNGLoaderで取得したPNGLoaderIDです。
第2引数
画像情報を取得する構造体変数を作成して、そのポインタを渡して下さい。
type PNGLINFO = record;
width: Integer; //幅
height: Integer; //高さ
bit_depth: Integer; //色の1成分を表現するのに必要なビット数
color_type: Cardinal; //カラーフォーマット
end;
カラーフォーマットは以下の通りです。
const CT_UNKNOWN: Cardinal = $00;
const CT_RGBA32: Cardinal = $81; //32ビットRGBAカラー(アルファチャンネルあり)
const CT_RGB24: Cardinal = $01; //24ビットRGBカラー
function GetImageDataToBitmap(PNGLoaderID: TPNGLoaderID; hbmp: HBITMAP): Integer; stdcall;
指定したビットマップに画像データを書き込みます。
第1引数
CreatePNGLoaderで取得したPNGLoaderIDです。
第2引数
有効なビットマップハンドルを渡して下さい。ビットマップの大きさや画像フォーマットが読み込むPNGファイルと異なるとエラーを返します。(bmBitsPixel等を正しく設定して下さい。)ビットマップのフォーマットについては
MSDN等を参照して下さい。
例
//TBitmapのインスタンスを作成
img := TBitmap.Create;
//カラーフォーマットの設定
img.PixelFormat = pf24bit; //24bitに設定
//img.PixelFormat = pf32bit; //32bitに設定
//サイズを調整する
img.Width = pnglinfo.width;
img.Height = pnglinfo.Height;
//画像取得
GetImageDataToBitmap(pnglid, img.Handle);
function DeletePNGLoader(PNGLoaderID: PTPNGLoaderID): Integer; stdcall;
ファイルをクローズし、メモリーを解放します。
第1引数
CreatePNGLoaderで取得したPNGLoaderIDへのポインタです。
推奨環境
このDLLは、PNGファイルから取り出した画像データをビットマップに書き出しますが、Delphi上でbuin2gou氏のbuinGLに含まれるTABitmapの使用を想定して作られています。TABitmapを利用すると、簡単に他の画像等との半透過合成が行えるので非常に便利です。当然、PNGファイルに含まれていた半透過情報を維持したまま利用できます。
また透過PNGファイルの作成には、フリーソフトのPixia + まっさ氏の「透過対応PNG保存プラグイン」を推奨します。
開発環境
Borland C++ Compiler 5.5.1 + BCC Developer
動作テストは、上記の推奨環境で行っています。
ライセンス
商用、非商用に関わらず自由に使用して下さい。ただし、このライブラリが原因で、いかなる問題が発生したとしても、作者は責任を負えませんので、自己責任での使用をお願いします。
使用連絡は必要ありませんが、どのようなソフトウェアに使われているのかを知りたいので、連絡して頂けると嬉しいです。(フリーウェアであれば、ダウンロードしに行きます。シェア、商用であれば…提供して頂けると嬉しいですね)また、ドキュメント等にこのライブラリを使用していることを一言書いて頂けると幸いです。
必ずしも要望に応えられるわけではありませんが、要望、バグなどの連絡もお待ちしております。
サポート・開発
更新履歴