[ 戻る ]

GLDPNG FAQ

copyright 2000-2001 tarquin all rights reserved.

ここでは今までGLDPNGに関しての寄せられた質問や疑問への回答、詳しい解説を載せておきます。


  1. C++Builderでインストール出来ません。
  2. クリップボード上でPNGデータを扱いたいんですが。
  3. 16ビットで保存されているPNGを16ビットのままで読み込みたいんですが。
  4. 48ビットはサポートしないんですか。
  5. コンパイルが失敗します。
  6. 16ビットでうまく保存できません。
  7. 256色での保存や読み込みで透明色や背景色のパレットインデックスが違うけど?
  8. アルファチャンネルの使い方を教えてください。
  9. 5000x5000の大きな画像が読み込めません。
  10. WWWブラウザ上でGLDPNGで作成したPNG画像を使いましたがMacなどのWindows以外の環境で見ると色が少し変になるんですが。
  11. カイリックスには対応しますか?または移植予定は?
  12. IE5上で GLDPNG で作成した PNG 画像を使いましたが透過されず表示されます。
  13. GLDPNG とは関係ないのですが、TBitmap で Index 指定でパレット色を取りたいのですが・・・


[Q1]

C++Builder でインストール出来ません。

[A1]

私自身 c++builder1しかないので ver 3 以上ではよくわかりません。ですが中村さん作「nkdib」に説明がありましたので同じような手順で行えばインストール可能です。

まず、「ファイル」|「開く」でパッケージソース (*.bpk) を開き、プロジェクトに GLDPNG.pas を追加してコンパイルしてください。

次に($BCB)\lib に生成された GLDPNG 関連の hpp ファイルを($BCB)\include にコピーしてください。

使用する際は、GLDPNG.hpp をインクルードし、

#pragma link "GLDPNG.obj"

で GLDPNG.obj をリンクするようにしてください。

なお、C++builder はサポート対象外ですのでご了承の上でご使用ください。

(2001/1/5 補足)

コンパイル中に

「[C++ エラー] GLDStream.hpp(26): E2015 'TBitmap' と 'Windows::TBitmap' の区別が曖昧」

というエラーが出ましたら、そのエラー行の typedef を以下のように書き換えてください。

typedef Graphics::TBitmap TGLDBmp;


[Q2]

クリップボード上で PNG データを扱いたいんですが。

[A2]

GLDPNG ではクリップボードの読み書きは Bitmap 形式のみです。これは各アプリケーションでの互換を考慮したためそうなっております。


[Q3]

16ビットで保存されているPNGを16ビットのままで読み込みたいんですが。

[A3]

ver 3.3 から Read16Bit というプロパティが追加されおり、このプロパティを TRUE にしていただけると 24ビット にせず 16ビット で読み込みます。


[Q4]

48 ビットはサポートしないんですか。

[A4]

将来はサポートするかもしれませんが現状ではサポートしません。Windows 側でもサポートされていませんし・・。


[Q5]

コンパイルが失敗します。

[A5]

古いバージョンの同名ファイルがそのまま残りますと正常にコンパイル出来ませんので古いバージョンのファイルはすべて削除してからインストールしてください。


[Q6]

16ビット画像がうまく保存できません。

[A6]

TBitmap の PixelFromat プロパティが pfDevice や HandleType プロパティが bmDDB になっていませんか?もしなっている場合は bmDIB に変えてから画面のビットカウントにあうように PixelFormat プロパティで変換してください。

また、16bit と 15bit の区別ですが Windows ではマスク指定が無い場合は 5:5:5(3万色) になり、TBitmap ではマスク指定していないため 5:5:5(3万色) が基準になります。ただし Bitmap を読み込んだ場合でマスク指定があれば 16bit になるようです。


[Q7]

256色での保存や読み込みで透明色や背景色のパレットインデックスが違うけど?

[A7]

原因は透明色や背景色と同じ色がパレット上に複数あるためです。ver 3.3 以下の GLDPNG では背景色や透明色は Index 形式ではなくRGB 形式にしているためこの様な認識ミスをしてしまいます。

ver 3.4 からは Index 形式もサポートされましたので上記のような問題は解消されています。


[Q8]

アルファチャンネルの使い方を教えてください。

[A8]

アルファチャンネルを使って画像を合成する場合以下のように色を求めます。c0 を合成先、c1 を合成元、a をアルファチャンネル (0=不透明 255=透明) とした場合、

c0 = c1 + (( c0 - c1 ) * a ) / 255 )

で求められます。「こんな式を出されてもわからん」という人用に簡単なサンプルを用意しましたので参考にしてください。(^^;

// dest,source,alphaはすべて同じ大きさで
// dest,sourceは24bit、alphaは8bit

// Delphi版
procedure AlphaBlt(dest,source,alpha: TBitmap);
var
 pSource,pDest,pAlpha: pbyte;
 x,y, r,g,b,a: integer;

begin 
 for y:=0 to source.Height-1 do
 begin
  pDest:=dest.ScanLine[y];
  pSouce:=source.ScanLine[y];
  pAlpha:=alpha.ScanLine[y];
  for x:=0 to source.Width-1 do
  begin
   a:=pAlpha^;
   with PRGBQUAD(pSource)^ do
   begin
    r:=rgbRed; g:=rgbGreen; b:=rgbBlue;
   end;
   with PRGBQUAD(pDest)^ do
   begin
    rgbRed:=r+(((rgbRed-r)*a) div 255);
    rgbGreen:=g+(((rgbGreen-g)*a) div 255);
    rgbBlue:=b+(((rgbBlue-b)*a) div 255);
   end;
   Inc(pSource,3);
   Inc(pDest,3);
   Inc(pAlpha);
  end;
 end;
end;

// BCB版
void AlphaBlt(TBitmap *dest,TBitmap *source,TBitmap *alpha) {
 BYTE *pSource,*pDest,*pAlpha;
 int x,y,r,g,b,a;

 for(y=0;y<source->Height;y++) {
  pSource=(BYTE*)(pSource->ScanLine[y]);
  pDest=(BYTE*)(pDest->ScanLine[y]);
  pAlpha=(BYTE*)(pAlpha->ScanLine[y]);
  for(x=0;x<source->Width;pDest+=3,pSource+=3,pAlpha++,x++){
   a=*pAlpha;
   r=((RGBQUAD*)pSource)->rgbRed; // 間違っているかも・・(^^;
   g=((RGBQUAD*)pSource)->rgbGreen;
   b=((RGBQUAD*)pSource)->rgbBlue;
   ((RGBQUAD*)pDest)->rgbRed=r+(((((RGBQUAD*)pDest)->rgbRed-r)*a)/255);
   ((RGBQUAD*)pDest)->rgbGreen=g+(((((RGBQUAD*)pDest)->rgbGreen-g)*a)/255);
   ((RGBQUAD*)pDest)->rgbBlue=b+(((((RGBQUAD*)pDest)->rgbBlue-b)*a)/255);
  }
 }
}

あくまでサンプルなので非常に遅いです。ご参考程度に。(^^;


[Q9]

5000x5000 の大きな画像が読み込めません。

[A9]

Win95/98 の仕様です。(^^;;

GLDPNG は画像データの読み書きは TBitmap を使います。TBitmap はピクセルデータをメモリマップで持っていて CreateDIBSection を使用してビットマップハンドルを作成しています。ですがこのような方法では大きすぎる画像では失敗してしまうためです。

なおWindows2000(NT4も大丈夫だと思いますが・・)ではこの様な問題は起きません。


[Q10]

WWW ブラウザ上で GLDPNG で作成した PNG 画像を使いましたが Macなどの Windows 以外の環境で見ると色が少し変になるんですが。

[A10]

ガンマ値の設定がされていないためです。GLDPNG は ver 3.4 から標準ではガンマ値を 0.45455 に設定しております。なお、あくまで Windows 環境の目安値ですので、特殊な環境の方は環境にあわせたガンマ値を設定する必要があります。


[Q11]

カイリックスには対応しますか?または移植予定は?

[A11]

カイリックス版を出す予定はありませんし PNG は標準で使えますので必要ないでしょう。


[Q12]

IE5上で GLDPNG で作成した PNG 画像を使いましたが透過されず表示されます。

[A12]

IE5 などのアプリケーション側が PNG の表示に関して完全にサポートしていないためです。


[Q13]

GLDPNG とは関係ないのですが、TBitmap で Index 指定でパレット色を取りたいのですが・・・

[A13]

付属の SFunc.pas に GetPaletteColor という関数がありますのでそれで使用してください。

(例)
  // パレットIndex10の色を取得
  cor:=GetPaletteColor(bitmap.Palette,10);