WICBitmap リファレンス
画像の読み込み・変換・描画・保存を行う WICBitmap オブジェクトのリファレンスです。Windows Imaging Component(WIC)を使っています。
- 関連: te リファレンス、api リファレンス、FolderItems リファレンス、Memory リファレンス
- 作成元:
TE/objects.cppのmethodGB[]とCteWICBitmap(Invoke、GetHBITMAP、GetEncoderClsid、CreateStream、RotateFlipなど)の実装
記法: P=プロパティ、M=メソッド。メンバー名の照合は大文字小文字を区別しません。
目次
1. 取得方法
const image = api.CreateObject("WICBitmap"); // 推奨
const image2 = te.WICBitmap; // te.WICBitmap も同じ(参照のたびに新規生成)
te.GdiplusBitmap は旧名で、非推奨です(同じオブジェクトが返ります)。
ルール(重要)
- 読み込み・作成系(
From*、Create、Free)を呼ぶと、直前に保持していた画像は必ず破棄されます。失敗した場合も破棄されたままです。 - 読み込み・作成系は、成功すると自分自身(
this)を返し、失敗すると空(undefined)を返します。次のように成功を確認してから使ってください。javascript const image = api.CreateObject("WICBitmap").FromFile(path); if (image) { /* 使える */ } - 画像を持っていない状態で、
GetWidthなど画像を必要とするメソッド(保存・サイズ取得・加工・変換・描画)を呼ぶと、何も行わず空を返します(エラーにはなりません)。 - WIC が初期化できない環境では、すべてのメソッドが何も行いません。
- 画素値は
0xAARRGGBB形式の整数(内部形式は 32bpp BGRA)で扱います。
2. 読み込み・作成
| 名前 | 説明 |
|---|---|
FromFile(path [, cx]) |
ファイルから読み込む。path はパス文字列、FolderItem、data: URI(Base64)のいずれか。FolderItem のショートカットは参照先に解決される。標準で読めない形式は、アーカイブ/画像用のプラグイン(te.AddEvent("GetArchive") / "GetImage")で読み込みを試みる。cx は、プラグインに渡す希望サイズ(ピクセル、省略時 0) |
FromStream(stream [, fileName [, cx]]) |
IStream(SHCreateStreamOnFileEx や GetStream の戻り値など)から読み込む。fileName と cx はプラグイン用のヒント |
FromSource(stream [, bKeepStream]) |
IStream から読み込む。bKeepStream が真なら元のデータを保持する(Save で再エンコードせずに保存したり、Frame を切り替えたりできる)。IStream の代わりに別の WICBitmap を渡すと、その WICBitmap をそのまま返す(コピーしない。この画像は破棄される)。WIC の生の IWICBitmap を渡した場合はその画像のコピーになる |
FromHBITMAP(hbm [, hPalette [, nAlpha]]) |
GDI ビットマップから作る。nAlpha: 0=アルファ使用、1=乗算済みアルファ、2=アルファ無視、3=自動判定(既定。32bit でアルファが一つでも 0 以外なら使用)。引数に WICBitmap / IStream を渡した場合は、FromSource と同様に処理される |
FromHICON(hIcon) |
アイコンから作る |
FromResource(hInst, name, type, cx, cy, flags) |
実行ファイルのリソースから作る(6個の引数すべて必須)。引数は LoadImage の hInst, name, type, cx, cy, fuLoad と同じ |
FromArchive(dllPath, CLSID, archivePath, itemPath [, cx]) |
アーカイブ(IStorage を提供する COM の DLL)内の画像を読み込む。itemPath は \ 区切りで階層を指定。4個以上の引数が必要 |
FromClipboard([nAlpha]) |
クリップボードのビットマップ(CF_BITMAP)から作る。nAlpha の既定は 2。ビットマップが無ければ空 |
Create(width, height) |
指定サイズの空の 32bpp BGRA 画像を作る(初期の画素値は要確認。FillRect で塗ってから使うと確実)。2個の引数が必要 |
Free() |
画像と保持しているストリームを解放する |
FromItem(…) |
廃止。何もしない |
- 読み込み時、JPEG などの EXIF の向き情報(
/app1/ifd/{ushort=274})に従って自動的に回転/反転されます。 FromFileでファイルから読めなかった場合、OnGetAlt(9章)が設定されていて、パスが TE の一時フォルダ(%TEMP%\tablacus\)配下なら、代替パスの取得も試みます。- 元データ(ストリーム)は、
FromSourceのbKeepStreamが真のとき、複数フレームの画像のとき、またはメインスレッド以外で読み込んだときに保持されます(FromFile/FromStreamは通常のメインスレッド読み込みでは保持しません。その場合、Save/DataURIのqualityに-2を指定しても元データは出力できません)。
3. 保存・エンコード
出力形式は、第1引数の文字列から判定します。MIME タイプ("image/png")、ファイル名/拡張子("a.jpg"、".jpg")のどちらも使えます。使えるエンコーダは GetCodecInfo(8章)で調べられます。
| 名前 | 戻り値 | 説明 |
|---|---|---|
Save(path [, quality]) |
HRESULT(整数。0=成功、失敗は負値) |
拡張子に対応する形式でファイルへ保存する。エンコーダが見つからなければ失敗値を返す。既存ファイルは上書きされる |
Base64([type [, quality]]) |
文字列 | Base64 文字列(ヘッダーなし)を返す |
DataURI([type [, quality]]) |
文字列 | data:<MIME>;base64,… 形式の文字列を返す |
GetStream([type [, quality]]) |
IStream | エンコード済みデータのメモリストリームを返す(FromStream / api.ReadFile などに渡せる) |
type の省略時: 元データを保持している(FromSource の bKeepStream など)場合は元の形式、そうでなければ image/png になります。
quality
| 値 | 動作 |
|---|---|
1〜100 |
ImageQuality(JPEG などの品質)として指定する |
0(省略時) |
既定の品質。ただし、元データを保持しており、出力形式が元と同じなら、再エンコードせず元のデータをそのままコピーする |
100 |
0 と同様、元データが同じ形式ならそのままコピー |
-2 |
元データを保持していれば、形式にかかわらず元のデータをそのまま出力する(アニメーション GIF の保存などに便利) |
4. サイズ・ピクセル操作
| 名前 | 説明 |
|---|---|
GetWidth() |
幅(px) |
GetHeight() |
高さ(px) |
GetPixelFormat() |
ピクセルフォーマットの GUID 文字列({6FDDC324-4E03-4BFE-B185-3D77768DC90F} など) |
GetPixel(x, y) |
(x, y) の色を整数(0xAARRGGBB)で返す。範囲外は空。32bpp BGRA に変換して読むため、他の形式の画像でも読める(画像自体が変換される) |
SetPixel(x, y, color) |
(x, y) の色を設定する(0xAARRGGBB)。範囲外は何もしない |
FillRect(x, y, w, h, color [, oldColor]) |
矩形を color で塗りつぶす。6個目の引数 oldColor を渡すと、その色と一致する画素だけを置き換える。x/y が負の場合は、はみ出した分だけ幅/高さを広げた範囲として扱われる。範囲は画像内に収まる分だけ処理される |
GetPixel/SetPixel/FillRect/Mask/AlphaBlendは、画像を 32bpp BGRA に変換して処理するため、他の形式の画像ではフォーマットが変わります。- 画素の色の並びは
0xAARRGGBBです。GetRValue型の COLORREF(0x00BBGGRR)とは並びが異なります。
5. 変換・加工
| 名前 | 説明 |
|---|---|
GetThumbnailImage(width, height [, mode]) |
指定サイズに拡大縮小した新しい WICBitmap を返す(元の画像は変更しない)。mode は補間方法(WICBitmapInterpolationMode): 0=最近傍、1=線形、2=キュービック、3=Fant、4=高品質キュービック(既定)。Windows 10 未満では 4 は 3 に切り替わる |
RotateFlip(n [, bKeepMeta]) |
回転/反転して、この画像自体を置き換える。n は WICBitmapTransformOptions: 0=なし、1=90°回転、2=180°回転、3=270°回転、8=左右反転、16=上下反転(組み合わせ可)。bKeepMeta が真でない場合、保持していた元データ・フレーム情報が破棄される(以後の Save は再エンコードされる) |
Mask(color, background) |
白黒(単色)のマスク画像を色付きの画像に変換する。各画素の青成分をアルファ値として使い、色を color(0xRRGGBB の下位24bit)に置き換える。アルファが 0 の画素は、実装上は第1引数の値(下位24bitのマスクなし)で置き換えられる。 |
AlphaBlend(rect, mix [, max]) |
矩形範囲(api.Memory("RECT") の RECT、または null で全体)のアルファ値に mix / max を掛ける(max の既定は 100)。半透明化に使う |
DrawEx と DrawText、GetHBITMAP / GetHICON は 7章 を参照してください。
6. フレーム・メタデータ
| 名前 | 種別 | 説明 |
|---|---|---|
GetFrameCount() |
M | フレーム数(アニメーション GIF など)。画像が無いと 1 |
Frame |
P | 現在のフレーム番号(0始まり)。代入するとそのフレームを読み込み直す。元データを保持している場合のみ切り替えられる(複数フレームの画像は自動で保持される) |
GetFrameMetadata(query) |
M | 現在のフレームのメタデータを、WIC のメタデータクエリ文字列("/app1/ifd/{ushort=274}"、"/ifd/{ushort=306}" など)で取得する。元データを保持している場合のみ有効。見つからなければ空 |
7. GDI・描画への変換
| 名前 | 説明 |
|---|---|
GetHBITMAP([background]) |
GDI のビットマップ(HBITMAP)を作って返す。使い終わったら api.DeleteObject(hbm) で破棄する。background(省略時 -1): -1=アルファ付き(ストレート)の32bit ビットマップ、-2=乗算済みアルファの32bit ビットマップ(アルファ付きメニューアイコン向け)、-4=-2 と同じ(64bit 版の場合。32bit 版かつ Vista 未満ではメニュー色で合成)、0 以上の値=その COLORREF(0x00BBGGRR)を背景にアルファ合成した不透明なビットマップ |
GetHICON([flags]) |
アイコン(HICON)を作って返す。flags は ILD_*(省略時 ILD_NORMAL)。使い終わったら api.DestroyIcon で破棄する |
DrawEx(hdc, x, y, cx, cy, bkColor, fgColor, style) |
ImageList_DrawEx の引数で、デバイスコンテキストへ描画する(8個すべての引数が必要)。bkColor / fgColor は COLORREF(CLR_NONE など)、style は ILD_*。成功は true |
DrawText(text, fontName, size, weight, style, color, x, y) |
画像の上にテキストを描く(Direct2D / DirectWrite 使用。8個すべての引数が必要)。size はフォントサイズ(DIP)、weight は DWRITE_FONT_WEIGHT(400=標準、700=太字)、style は DWRITE_FONT_STYLE(0=標準、1=斜体(オブリーク)、2=イタリック)、color は 0xRRGGBB。(x, y) から画像の右下端までの範囲に描画する。カラーフォントに対応。画像は 32bpp 乗算済みアルファ形式に変換される。Direct2D / DirectWrite が使えない環境では何もしない |
8. コーデック情報
GetCodecInfo(type, mode, array)
WIC に登録されているコーデックの情報を調べ、結果を array(api.Array() や [] など、push メソッドを持つオブジェクト)へ追加します。3個の引数が必要です。
| 引数 | 内容 |
|---|---|
type |
コンポーネントの種類(WICComponentType): 1=デコーダ、2=エンコーダ、4=ピクセルフォーマットコンバーター、8=メタデータリーダー、0x10=メタデータライター、0x20=ピクセルフォーマット |
mode |
取得する情報: 0=ファイル拡張子(,区切り)、1=MIME タイプ(,区切り)、2=表示名、3=作者、4=仕様のバージョン |
array |
結果の追加先 |
const ar = [];
image.GetCodecInfo(2, 1, ar); // エンコーダの MIME タイプ一覧
// 結果の内容は環境により異なる(`image/png` などがカンマ区切りで入る)
画像を持っていなくても呼び出せます。
9. イベント
| 名前 | 説明 |
|---|---|
OnGetAlt |
FromFile で読み込めなかったとき、TE の一時フォルダ(%TEMP%\tablacus\)配下のパスについて呼ばれる関数。引数は (sessionId, name)(パスの一時フォルダ以降の部分から得たセッション ID と文字列)。代替パス(文字列)を返すと、そのパスで読み込みを再試行する |
10. 使用例
// ファイルを読み込み、サムネイルを作ってPNGで保存
const image = api.CreateObject("WICBitmap").FromFile("C:\\Pictures\\a.jpg");
if (image) {
const thumb = image.GetThumbnailImage(128, 128);
thumb.Save("C:\\Temp\\thumb.png");
}
// DataURI(HTMLに埋め込む)
const uri = image.DataURI("image/jpeg", 80);
// 元の形式のまま取り出す(再エンコードしない)
const src = api.CreateObject("WICBitmap").FromSource(api.SHCreateStreamOnFileEx("C:\\Pictures\\a.gif", 0, 0, false), true);
const raw = src.DataURI("", -2);
// 新規作成してピクセル操作
const bmp = api.CreateObject("WICBitmap").Create(100, 100);
bmp.FillRect(0, 0, 100, 100, 0xFFFF0000); // 不透明な赤
bmp.SetPixel(50, 50, 0xFF0000FF); // 青
const c = bmp.GetPixel(50, 50);
// 回転して置き換え(右に90°)
image.RotateFlip(1);
// アイコン/メニュー用のビットマップ
const hbm = image.GetHBITMAP(-2);
// ... 使用後 ...
api.DeleteObject(hbm);
// 利用可能なエンコーダを調べる
const types = [];
image.GetCodecInfo(2, 1, types);
FromSource(api.SHCreateStreamOnFileEx(…))のように IStream を直接渡す形は、api.SHCreateStreamOnFileExの引数(api リファレンス)に合わせて調整してください。