TGLDPNG ver 3.4 マニュアル

1998,2000 Copyright tarquin all rights reserved.
2004/5/9


目次

  1. はじめに
  2. 使用環境構築
  3. 使い方
    1. 基本的な使い方
    2. リンク機能
    3. IDE環境で使う
    4. グレイスケールでの保存
    5. アルファチャンネル
    6. 画像の暗号化
    7. 背景色・透明色
    8. コンパイラ定義
    9. 旧バージョンからの移行
  4. 使用許諾
  5. サポート
  6. 更新履歴
  7. 参考
    1. クラスリファレンス
    2. FAQ


1.はじめに

このクラス(以下 TGLDPNG )は、TJPEGImage を扱うのと同じ感覚で PNG フォーマットの画像ファイルを読み書きすることが出来ます。また、 PNG フォーマット特有の設定を行うことも可能です。

主な特徴

ちなみに、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) 読み込みの場合

内部のアルファチャンネル用のビットマップに読み込みます。AlphaBitmapAssignTo メソッドで取り出す必要があります。

内部のアルファチャンネル用のビットマップを介さずに直接指定のビットマップに読み込みます。 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 にします。

内部のアルファチャンネル用のビットマップを指定します。内部のアルファチャンネルビットマップに設定する場合は AlphaBitmapAssign メソッドを使います。

内部のアルファチャンネル用のビットマップを使用せずに直接指定のビットマップをアルファチャンネルとして使います。 Image プロパティと同じビットマップを指定することは出来ません。

また、アルファチャンネルを指定する場合に以下の条件を満たしている必要があります。

(例)
※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

2002/3/17 ver 3.4.1 → ver 3.4.3

2001/10/23

2001/07/08 ver 3.4 → ver 3.4.1

2001/07/04 ver 3.3.3 → ver 3.4

2000/12/27 ver 3.3.1 → ver 3.3.3

2000/11/06 ver 3.3 → ver 3.3.1

2000/10/30 ver 3.2.6 → ver 3.3

2000/07/21 ver 3.2.5 → ver 3.2.6

2000/03/26 ver 3.2.2 → ver 3.2.5?

2000/02/18 ver 3.2.2 → ver 3.2.3

2000/02/10 ver 3.2.1 → ver 3.2.2

2000/02/03 ver 3.2 → ver 3.2.1

2000/02/02 ver 3.1 → ver 3.2

2000/01/28 初版