TGLDPNG ver 3.4 マニュアル 1998,2000 Copyright tarquin all rights reserved.
2004/5/9
目次
1.はじめに
このクラス(以下 TGLDPNG )は、TJPEGImage を扱うのと同じ感覚で PNG フォーマットの画像ファイルを読み書きすることが出来ます。また、 PNG フォーマット特有の設定を行うことも可能です。
主な特徴
- 当然ながら PNG フォーマットの読み書き
- 標準でサポートしているフィルターでの保存
- 選択フィルターの最適化
- ZLIBと同じ圧縮段階の設定
- OnProgress イベントに対応
- 画像の暗号化のサポート機能
- アルファチャンネルの読み書き
- グレイスケール保存のサポート機能
- 15bit(32768色)や16bit(65536色)のビットマップの読み書き
ちなみに、TBitmap をある程度理解していないと最大限に使いこなすのは難しいです。
ご利用の際は必ず使用許諾をよくお読みの上、同意される方だけお使いください。
使用対象言語は Delphi3 以上となります。C++Builder3 以上でもコンパイルは可能ですが、動作は保証しません。
<旧バージョンの方へ>
旧バージョンから ver 3.4 に乗り換える場合は、旧バージョンからの移行を参考の上で修正を行ってからご使用してください。
2.使用環境構築
付属の全ファイルを Delphi のパスが通っているフォルダ[*1]にコピーします。旧バージョン(GLDPNG3.3などや TKPNGなど)をお使いの方はコピーする前に旧バージョンを IDE 環境からアンインストール(注意:コンポーネントとしてインストールしている場合)後に旧バージョンのファイルをすべて削除してからコピーしてください。
[*1]
[ツール(T)]→[環境オプション(O)]→[ライブラリ]→[ライブラリパス]にフォルダ追加しますとコンパイル時に自動的にそのパスからユニットファイルを探してきてくれます。
3.使い方
a.基本的な使い方
TGLDPNG の基本的な使い方として、TJPEGImage を扱う時と同じ様な書き方なります。TGLDPNG を使用する場合は、必ずそのユニットの Uses 節に GLDPNG を追加してください。以下は単純な読み書きの例です。
(例) // 指定した Tbitmap クラスに PNG 形式で保存された画像を読み込む procedure LoadPNGFile(const filename: string; bitmap: TBitmap); var png: TGLDPNG; begin png:=TGLDPNG.Create; try // PNG ファイルを読み込み png.LoadFromFile(filename); // 読み込んだ画像を bitmap にコピー bitmap.Assign(png); finally png.Free; end; end; // 指定した Tbitmap クラスを PNG 形式で保存 procedure SavePNGFile(const filename: string; bitmap: TBitmap); var png: TGLDPNG; begin png:=TGLDPNG.Create; try // PNG クラスに bitmap を代入 png.Assign(bitmap); // PNG 形式で保存 png.SaveToFile(filename); finally png.Free; end; end;簡単なファイルの読み書きを行う場合は、単に LoadFromFile メソッドや SaveToFile メソッドを呼び出すだけです。
TBitmap にAssignしているのはTGLDPNG はPNGファイルの読み書きだけ行うクラスなのでTBitmap みたいな機能はありません。そのため、図形描画やピクセル単位での読み込みや加工などは行えません。表示だけ行う場合ではTBitmapに Assign せずに直接 TImage にAssignしてもかまいません。
TGLDPNGではいろいろなプロパティやイベントがあります。このほどんどは読み書き時の設定です。詳しくはクラスリファレンスをご覧ください。プロパティやイベントは LoadFromFile や SaveToFile などを呼び出す前に設定します。以下はプロパティ設定を行う場合の一例です。
(例) // 指定した Tbitmap クラスに PNG 形式で保存された画像を読み込む procedure LoadPNGFile(const filename: string; bitmap: TBitmap); var png: TGLDPNG; begin png:=TGLDPNG.Create; try // マックバイナリがついているかどうかをチェック // これはあくまでサンプルなので設定していますが // 設定しなくても TRUE になっています。 png.MacBinary:=TRUE; // PNG ファイルを読み込み png.LoadFromFile(filename); // 読み込んだ画像を bitmap にコピー bitmap.Assign(png); finally png.Free; end; end; // 指定した Tbitmap クラスを PNG 形式で保存 procedure SavePNGFile(const filename: string; bitmap: TBitmap); var png: TGLDPNG; begin png:=TGLDPNG.Create; try // PNG クラスに bitmap を代入 png.Assign(bitmap); // 圧縮タイプを「最高圧縮」にする png.CompressLevel:=gplBest; // フィルタータイプ設定を「なし」に png.FilterType:=gpfNone; // 「インタレース」で保存 png.InterlaceType:=gptAdam7; // PNG 形式で保存 png.SaveToFile(filename); finally png.Free; end; end;
b.リンク機能
TGLDPNGでは通常PNGファイルの読み書きを行う場合では、内部のビットマップに複製して処理するため、複数の画像を同じ設定で一度に保存したい場合などでは動作速度が遅くなります。
そのため、TGLDPNG ではリンク機能と呼ばれる機能を用意しております。リンク機能とは内部で保持しているビットマップを仲介せず直接リンクさせたビットマップに読み書きをを行う機能です。以下はリンク機能の使用例です。
(例) ※png には TGLDPNG が、Bitmap には TBitmap の クラス作成されたものが入っているものとする。 // PNGファイルをBitmapに読み込む png.Image:=Bitmap; png.LoadFromFile('ファイル名'); // BitmapをPNGフォーマットで書き込む png.Image:=Bitmap; png.SaveToFile('ファイル名');
c.IDE環境で使う
GLDPNG.pas をコンポーネントとしてIDE環境にインストールすることにより、設計時でも TImage などで PNG ファイルを読み込むことが可能になります。
設計時に PNG ファイルを読み込んだ場合に、プロジェクト内のどこかのユニットの Uses 節に GLDPNG を追加してください。実行時に表示されません。
d.グレイスケールでの保存
グレイスケールで保存する場合はGrayScale プロパティを TRUE にしてください。
e.アルファチャンネル
TGLDPNG ではアルファチャンネルを扱うことが出来ます。TGLDPNGではアルファチャンネルはイメージとは別のビットマップとして扱います。アルファチャンネルとして扱うビットマップは、8ビットのビットマップとなります。
(1) 読み込みの場合
- AlphaBitmap プロパティに指定がない場合(値が nil)
内部のアルファチャンネル用のビットマップに読み込みます。AlphaBitmapAssignTo メソッドで取り出す必要があります。
- AlphaBitmap プロパティに別のビットマップを指定
内部のアルファチャンネル用のビットマップを介さずに直接指定のビットマップに読み込みます。 Image プロパティと同じビットマップを指定することは出来ません。
アルファチャンネルの有無については AlphaChannel プロパティで判断できます。以下は使用例です。
(例) ※png には TGLDPNG、AlphaBmp には TBitmap の クラス作成されたものが入っているものとします。 // 内部に読み込み png.AlphaBitmap:=nil; png.LoadFromFile('PNGファイル名'); if png.AlphaChannel then // アルファチャンネルの有無チェック png.AlphaBitmapAssignTo(AlphaBmp); // ここで取り出す // リンク先に読み込み if png.AlphaChannel then // アルファチャンネルの有無チェック png.AlphaBitmap:=AlphaBmp; // リンク先指定 png.LoadFromFile('PNGファイル名');(2) 書き込みの場合
アルファチャンネルを使用する場合は、AlphaChannel プロパティを TRUE にします。
- 内部のアルファチャンネル用のビットマップを使用。( AlphaBitmap プロパティに nil 指定)
内部のアルファチャンネル用のビットマップを指定します。内部のアルファチャンネルビットマップに設定する場合は AlphaBitmapAssign メソッドを使います。
- AlphaBitmap プロパティに別のビットマップを指定
内部のアルファチャンネル用のビットマップを使用せずに直接指定のビットマップをアルファチャンネルとして使います。 Image プロパティと同じビットマップを指定することは出来ません。
また、アルファチャンネルを指定する場合に以下の条件を満たしている必要があります。
- 保存する画像の縦横と同じ大きさ
- 256色画像(PixelFormat プロパティが pf8bit)であること(注意:パレットは関係ないです)
(例) ※png には TGLDPNG、AlphaBmp には TBitmap の クラス作成されたものが入っているものとします。 // 内部のを使う png.AlphaChannel:=TRUE; png.AlphaBitmap:=nil; png.SaveToFile('PNGファイル名'); // リンク先のを使う png.AlphaChannel:=TRUE; png.AlphaBitmap:=AlphaBmp; // リンク先指定 png.SaveToFile('PNGファイル名');TGLDPNGでは読み込んだアルファチャンネル値は反転されて代入されます。つまり、0は不透明になり、255は透明となります。ただし、コンパイラ定義 GLD_NOREVERSE_ALPHA を定義することにより、反転をしなくなります。
読み込み時 2/4/16/256色画像ではアルファチャンネル値の透明指定が1つのみで他はすべて不透明指定の場合には、自動的に透明色として扱います。
PNG でサポートされているパレット形式のアルファチャンネルは GLDPNG ではサポートされておりません。読み込み時、この様な形式は透明色指定かビットマップ型のアルファチャンネルに変換します。
f.画像の暗号化
画像の暗号化は PNG では定義されておらず、TGLDPNG のみの独自仕様ですが、暗号化されたPNGファイルは他のビューアなどで問題無く読めます。
画像の暗号化自体の処理は TGLDPNG自体では行いません。TGLDPNGでは暗号化・復号化を行うタイミングで専用イベントを発生させているだけに過ぎません。
そのため、
- データの暗号化
- 暗号化されたデータの復号化
の処理しなくてはいけません。
暗号化処理を行う場合では、暗号化処理をOnEncode、復号化処理をOnDecode イベントで行います。
OnEncode イベント では、引数 pbuf が示すデータを buflen のデータバイト数分だけ暗号化を行います。linenoはpbufデータがあるY座標、passwordは指定されたパスワードデータになります。以下は暗号化処理の一例です。
// 暗号イベント(あくまで例でてきとーなものです) procedure TForm1.EncodeEvt(sender: TObject; pbuf: pbyte; buflen,lineno: integer; password: string); var i,st,mx,af: integer; pc: pchar; begin mx:=length(password); pc:=pchar(password); st:=((lineno+3) and 2); if st>=mx then st:=st-mx; Inc(pc,st); af:=0; for i:=0 to Pred(buflen) do begin af:=((pbuf^-pbyte(pc)^) and $FF) xor af; pbuf^:=af; Inc(st); Inc(pc); if st>=mx then begin st:=0; pc:=pchar(password); end; Inc(pbuf); end; end;OnDecode イベント では、引数 pbuf が示すデータを buflen のデータバイト数分だけ復号化を行います。linenoはpbufデータがあるY座標、passwordは指定されたパスワードデータになります。以下は復号化処理の一例です。
// 復号イベント(あくまで例でてきとーなものです) procedure TForm1.DecodeEvt(sender: TObject; pbuf: pbyte; buflen,lineno: integer; password: string); var i,st,mx,af,n: integer; pc: pchar; begin mx:=length(password); pc:=pchar(password); st:=((lineno+3) and 2); if st>=mx then st:=st-mx; Inc(pc,st); af:=0; for i:=0 to Pred(buflen) do begin n:=pbuf^; pbuf^:=((pbuf^ xor af)+pbyte(pc)^) and $FF; af:=n; Inc(st); Inc(pc); if st>=mx then begin st:=0; pc:=pchar(password); end; Inc(pbuf); end; end;
g.背景色、透明色
TGLDPNG では背景色と透明色をサポートしています。
読み込み時に、透明色や背景色が存在すれば TransColor プロパティや BGColor プロパティに値を設定します。存在しない場合は GLD_NONECOLOR が設定されます。
書き込み時に、TransColor プロパティや BGColor プロパティが GLD_NONECOLOR 以外を指定した場合に指定色を透明色や背景色として保存します。アルファチャンネルが有効な場合は透明色は無視されます。
1/16/256色画像では、TransColor プロパティ・ BGColor プロパティ にパレットの Index 指定が出来ます。 Index 指定の場合は、Index 値に $1000000 を OR した値を指定します。
(例) // 取り出し if ((png.TransColor and $1000000)<>0) and (png.TransColor<>GLD_NONECOLOR) then idx:=png.TransColor and $FF; // 設定 png.TransColor:=(idx or $1000000);読み込み時に1/16/256色画像の時、必ず Index 値になりますので旧バージョン対応を使用している場合では修正が必要になります。
また、1/16/256色画像以外で Index 指定は無視されて普通の色と同じ扱いになります。例えば、$1000001(Index=1) とした場合は、$000001(R=1,G=0,B=0) として扱います。
h.コンパイラ定義
TGLDPNG ではいくつかのコンパイル定義があり、用途に合わせたコンパイルを行うことが出来ます。
以下がコンパイラ定義です。
・GLD_READONLY
TGLDPNG を読み込みのみのクラスとしてコンパイルされます。書き込み機能が不要の場合は指定することで実行ファイルサイズを節約できます。・GLD_SUPPORT_BIT15
15Bit(R:G:B=5:5:5) 展開指定されている PNGフォーマットを指定どおり展開します。指定なしの場合は 16Bit(R:G:B=5:6:5) で展開します。・GLD_NOREVERSE_ALPHA
アルファチャンネルの値の反転を阻止します。これにより PNG と同じアルファチャンネルになります。なお、ver 3.4 から定義名が変更されていますので、旧バージョンの方は修正が必要になります。
i.旧バージョンからの移行
TKPNG や TKPNGLE からの移行の場合の変更点は以下のようになります。また、旧バージョンからの移行の際、必ず旧バージョンをアンインストール(全ファイルを削除)してから GLDPNG をインストールしてください。
(1) TGLDPNG ver 3.2 の場合
GetAlphaBitmap メソッドは AlphaBitmapAssignTo メソッドに改名されています。
(2) TGLDPNG ver 3.3 の場合
・1/16/256色画像の透明色や背景色の値が変更になっていますので修正が必要です。
・CompressLevel プロパティの型が変更になっていますので修正が必要な場合があります。
・コンパイル定義名が変更されていますので、もし使用している場合は修正が必要です。
4.使用許諾
TGLDPNG、および ZLIB 以外の関数・クラスの著作権は作者(Tarquin)にあります。TGLDPNG を使用する場合は以下の使用許諾をよくお読みの上でご利用ください。
※使用許諾( 2004/05/09 改定 )
ライセンスは「修正BSDライセンス」とします。
(BSDライセンスの簡単な概要)
ソフトウェアの使用(実行)は制限なく自由にOK。 再配布の際には、ソースコードであれバイナリであれ、 「著作権表示」「条件のリスト」「免責事項」を含める必要があります。また、本ソフトウェアのサポートなどは行いませんので、自己責任でご利用ください。
5.サポート
サポートは一切行いませんので、自己責任でご利用ください。
6.更新履歴
2004/5/9
- ライセンスをBSDライセンスに変更
2002/3/17 ver 3.4.1 → ver 3.4.3
- 256色以下時の透明色取得のバグを修正
- TGLDPNGのAssign処理のバグを修正
2001/10/23
- メールアドレスを変更
2001/07/08 ver 3.4 → ver 3.4.1
- 出力時のGLD_REVERSEALPHA条件を抜かしていたのを修正
2001/07/04 ver 3.3.3 → ver 3.4
- 透明色・背景色にIndex指定を出来るようにした。
- Windows環境の基準ガンマ値(0.45455)を標準で出力するようにした。
- 出力時、TBitmapの透明色を無視するようにした。(特殊な指定をされるため)
- アルファチャンネルの反転を阻止出来るようにした。
- 16bit関連の変換バグ修正。
- ZLIBを1.1.3にした。
- 使用許諾改正。
- マニュアル修正。
- FAQ追加。
2000/12/27 ver 3.3.1 → ver 3.3.3
- 読み込みのみのコンパイル不可を修正
2000/11/06 ver 3.3 → ver 3.3.1
- PixelformatプロパティがpfCustom時の不都合を修正(多分・・)
- グレイスケール保存時にパレットが付いていたのを修正
- 2段階・16段階グレイスケール保存時の背景色・透明色指定を修正
- コメントを厳密に読み込ませる様に修正
2000/10/30 ver 3.2.6 → ver 3.3
- 15bit/16bitビットマップの読み込み・保存を追加
- ほぼ完全なグレイスケール保存の追加
- 保存時間の追加
- 色情報の追加
- 細かいバグ修正
- 一部仕様変更
- MNG内部ストリーム用に修正
- マニュアル全修正
2000/07/21 ver 3.2.5 → ver 3.2.6
- C++builder4以上で起こる不都合修正
- 使用規約改正
2000/03/26 ver 3.2.2 → ver 3.2.5?
- アルファチャンネルがある場合の読み込みでプログレスイベントが正常に発生しないバグを修正
- メモリリークらしきものを修正
- ヘルプファイルがver 3.2.3と同じになった(いつもすまないねぇ>紅月さん)
2000/02/18 ver 3.2.2 → ver 3.2.3
- 4色読み込みのバグ修正
- ノーマルなヘルプファイルを付加(ありがとう紅月燐火さん!!)
- このリファレンスの説明一部修正
- 使用規約の改定
2000/02/10 ver 3.2.1 → ver 3.2.2
- 書き込み時のZLIB関係の関数バグを修正
- 範囲チェックやオーバーフローチェックをOFFにするコンパイラ命令を埋め込み
- TBitmapをGraphics.TBitmapにした(Windows.TBitmapとの区別のため)
2000/02/03 ver 3.2 → ver 3.2.1
- 4段階と256段階アルファチャンネル付きグレイスケール画像、4色カラー画像の読み込みバグを修正
2000/02/02 ver 3.1 → ver 3.2
- abstractが付いていた一部のメソッドのoverrideのし忘れを修正。(^^;;
- sBITチャンクサポートで3万色・6万色画像として保存も可能になった。
- 解像度入出力サポート。これでアスペクト比やdpi値の保存可能。
- アルファチャンネルがある場合でも透明色を出力していたバグを修正。
- リードのみだけのコンパイルモードを追加。
- TGLDPNG自体がグラフィッククラスらしくなかったのでそれなりに使えるように修正。
- 読み込んだデータ情報を少し返す様に修正。
- パレット型アルファチャンネルの変換のバグを修正。
- リファレンスマニュアルの大修正&加筆。(^^;
2000/01/28 初版