IWICPalette
COM公式ドキュメント
カラーテーブルへのアクセスおよび構築を行うためのメソッドを公開します。主にインデックス付きピクセル形式向けです。
解説(Remarks)
WICBitmapPaletteType が WICBitmapPaletteCustom でない場合、色は上記のテーブルに基づいて自動的に生成されます。ユーザーがその後カラーパレットのエントリを変更すると、その操作によって WICBitmapPalette は Custom に設定されます。
InitializeFromBitmap の fAddTransparentColor パラメーターは、カラーコレクションのサイズが 256 未満の場合、透明色をコレクションの末尾に追加します。それ以外の場合は、インデックス 255 が透明色で置き換えられます。事前定義パレット型が使用されている場合、事前定義パレットと一致しなくなるため、型は BitmapPaletteTypeCustom に変更されます。
パレットインターフェイスは補助的なイメージングインターフェイスであり、ビットマップやピクセルを直接扱うものではありません。むしろ、インデックス付きビットマップに対してインデックス色変換を提供します。1 ピクセルあたり M ビットのインデックス付きピクセル形式の場合、(パレット内の色数) は 2^M より大きくなります。
従来、パレットの基本的な動作は、バイト(またはそれより小さい)インデックスから 32bpp のカラー値への変換を提供することです。これは多くの場合、256 エントリのカラー値テーブルによって実現されます。
例
IWICImagingFactory *pFactory = NULL;
IWICBitmapDecoder *pDecoder = NULL;
IWICBitmapFrameDecode *pBitmapFrameDecode = NULL;
IWICPalette *pPalette = NULL;
UINT uiFrameCount = 0;
HRESULT hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
(LPVOID*)&pFactory
);
if (SUCCEEDED(hr))
{
hr = pFactory->CreateDecoderFromFilename(
L"test.gif",
NULL,
GENERIC_READ,
&pDecoder);
}
if (SUCCEEDED(hr))
{
hr = pDecoder->GetFrameCount(&uiFrameCount);
}
if (SUCCEEDED(hr) && (uiFrameCount > 0))
{
hr = pDecoder->GetFrame(0, &pBitmapFrameDecode);
if (SUCCEEDED(hr))
{
hr = pFactory->CreatePalette(&pPalette);
}
if (SUCCEEDED(hr))
{
hr = pBitmapFrameDecode->CopyPalette(pPalette);
}
if (SUCCEEDED(hr))
{
UINT uiColorCount = 0;
UINT uiActualColorCount = 0;
WICColor *pColors = NULL;
hr = pPalette->GetColorCount(&uiColorCount);
if (SUCCEEDED(hr) && (uiColorCount > 0))
{
pColors = new WICColor[uiColorCount];
if (pColors)
{
hr = pPalette->GetColors(uiColorCount, pColors, &uiActualColorCount);
// ここで色を使って何らかの処理を行う...
delete[] pColors;
}
else
{
hr = E_OUTOFMEMORY;
}
}
}
}
if (pPalette)
{
pPalette->Release();
}
if (pBitmapFrameDecode)
{
pBitmapFrameDecode->Release();
}
if (pDecoder)
{
pDecoder->Release();
}
if (pFactory)
{
pFactory->Release();
}
return hr;
このサンプルコードでは、WICColor は次のレイアウトを持つ UINT32 値として定義されています。
0xAARRGGBB
wincodec.h ヘッダーは WICColor を UINT32 として型定義しています。
メソッド 10
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
WICBitmapPaletteType で指定された事前定義パレットのいずれかにパレットを初期化し、オプションで透明色を追加します。
| ePaletteType | WICBitmapPaletteType | in | 目的の事前定義パレット型。 |
| fAddTransparentColor | BOOL | in | パレットに追加するオプションの透明色。透明色が不要な場合は 0 を使用します。グレースケールまたは白黒パレットに初期化する場合は、このパラメーターを FALSE に設定します。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
パレットに透明色が追加されると、そのパレットは事前定義ではなくなり、WICBitmapPaletteTypeCustom として返されます。256 エントリ未満のパレットの場合、透明エントリはパレットの末尾に追加されます(つまり、16 色パレットは 17 色パレットになります)。256 色のパレットの場合、透明パレットエントリは事前定義パレットの最後のエントリを置き換えます。
指定されたカスタムカラーエントリにパレットを初期化します。
| pColors | DWORD* | in | カラー配列へのポインター。 |
| cCount | DWORD | in | pColors 内の色数。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
透明色が必要な場合は、カスタムエントリの一部として指定します。パレットに透明値を追加するには、そのアルファ値を 0 にする必要があります(0x00RRGGBB)。
エントリ数は 256 に制限されています。
参照ビットマップに基づいて計算された最適化された値を使用してパレットを初期化します。
| pISurface | IWICBitmapSource* | in | ソースビットマップへのポインター。 |
| cCount | DWORD | in | パレットを初期化する色数。 |
| fAddTransparentColor | BOOL | in | 透明色を追加するかどうかを示す値。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
結果として得られるパレットには、ビットマップ内に存在する色を最もよく表現する、指定された数の色が含まれます。アルゴリズムは参照ビットマップの各ピクセルの不透明な RGB カラー値に対して動作するため、アルファ値は無視されます。透明色が必要な場合は、fAddTransparentColor パラメーターを TRUE に設定します。その場合、最適化される色が 1 つ少なく計算されて colorCount が減り、完全に透明なカラーエントリが追加されます。
指定されたパレットに基づいてパレットを初期化します。
| pIPalette | IWICPalette* | in | ソースパレットへのポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
パレットを記述する WICBitmapPaletteType を取得します。
| pePaletteType | WICBitmapPaletteType* | out | ビットマップのパレット型を受け取るポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
WICBitmapPaletteCustom は、InitializeCustom と InitializeFromBitmap の両方から初期化されたパレットに使用されます。最適化パレットとカスタムパレットの区別はありません。
カラーテーブル内の色数を取得します。
| pcCount | DWORD* | out | カラーテーブル内の色数を受け取るポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
指定されたカラー配列を、内部カラーテーブルの色で埋めます。カラー配列は GetColorCount の戻り結果に従ってサイズを設定する必要があります。
| cCount | DWORD | in | pColors 配列のサイズ。 |
| pColors | DWORD* | out | パレットの色を受け取るポインター。 |
| pcActualColors | DWORD* | out | パレットの色を取得するために必要な実際のサイズ。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
パレットが白黒であるかどうかを示す値を取得します。
| pfIsBlackWhite | BOOL* | out | パレットが白黒であるかどうかを示すブール値を受け取る変数へのポインター。TRUE はパレットが白黒であることを示し、それ以外の場合は FALSE です。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
パレットが白黒とみなされるのは、完全な黒(0xFF000000)と完全な白(0xFFFFFFF)の 2 つのエントリのみを含む場合に限られます。
パレットがグレースケールであるかどうかを示す値を取得します。
| pfIsGrayscale | BOOL* | out | パレットがグレースケールであるかどうかを示すブール値を受け取る変数へのポインター。TRUE はパレットがグレースケールであることを示し、それ以外の場合は FALSE です。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
パレットがグレースケールとみなされるのは、すべてのエントリについてアルファ値が 0xFF であり、赤・緑・青の値が一致する場合に限られます。
パレットに不透明でないエントリ(すなわちアルファが 1 未満のエントリ)が含まれているかどうかを示します。
| pfHasAlpha | BOOL* | out | パレットに透明色が含まれている場合は TRUE、それ以外の場合は FALSE を受け取るポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
さまざまな画像形式が、それぞれ異なる方法でアルファをサポートしています。PNG は部分的に透明なパレットエントリをサポートすることで、完全なアルファサポートを備えています。GIF は色をアルファなしの 24bpp で格納しますが、1 つのパレットエントリを完全に透明として指定できます。パレットに複数の完全透明エントリ(0x00RRGGBB)がある場合、GIF は最後のものを透明インデックスとして使用します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWICPalette "{00000040-A8F2-4877-BA0A-FD2B6645FB94}" #usecom global IWICPalette IID_IWICPalette "{}" #comfunc global IWICPalette_InitializePredefined 3 int,int #comfunc global IWICPalette_InitializeCustom 4 var,int #comfunc global IWICPalette_InitializeFromBitmap 5 sptr,int,int #comfunc global IWICPalette_InitializeFromPalette 6 sptr #comfunc global IWICPalette_GetType 7 var #comfunc global IWICPalette_GetColorCount 8 var #comfunc global IWICPalette_GetColors 9 int,var,var #comfunc global IWICPalette_IsBlackWhite 10 var #comfunc global IWICPalette_IsGrayscale 11 var #comfunc global IWICPalette_HasAlpha 12 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWICPalette "{00000040-A8F2-4877-BA0A-FD2B6645FB94}" #usecom global IWICPalette IID_IWICPalette "{}" #comfunc global IWICPalette_InitializePredefined 3 int,int #comfunc global IWICPalette_InitializeCustom 4 sptr,int #comfunc global IWICPalette_InitializeFromBitmap 5 sptr,int,int #comfunc global IWICPalette_InitializeFromPalette 6 sptr #comfunc global IWICPalette_GetType 7 sptr #comfunc global IWICPalette_GetColorCount 8 sptr #comfunc global IWICPalette_GetColors 9 int,sptr,sptr #comfunc global IWICPalette_IsBlackWhite 10 sptr #comfunc global IWICPalette_IsGrayscale 11 sptr #comfunc global IWICPalette_HasAlpha 12 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。