画像のフェードアウトいろいろ[VCL]

C++Builderで、表示した画像をじわじわ消していくのはFireMonkeyならほぼコードいらずで可能だが、VCLだと自前で処理する必要がある。いろんな方法を試してみたので暫定まとめ。使いどころはよく分からないが。

0.事前準備

TFormにTImageを置く。
ちらつき防止のためFormのDoubleBufferedプロパティをtrueにしておく。

1.ランダムにPixel操作(力業)

画像がぽつぽつと白くなっていく効果。
画像のPixel分の数値配列をシャッフルして、順番に白くしていくだけのシンプルな力業だが、実際にやってみると一手間かけないと自然な効果が出ない。

基本形

まず基本形。
手順は単純で
 ①画素数分の数値配列を作ってシャッフル
 ②シャッフルした数値のPixelをループで白くする
だけ。

多めに変化

上記のコードだと、PCの性能や画像サイズにもよるがかなり遅い。複数のPixelを白くするよう改良してみる。

実際にやると目の錯覚(たぶん)でだんだん遅くなっているように感じる。

変化量を増やしていく

白くするPixel数がどんどん増えるように改良。

だいぶ自然な感じになった。

Bitmap以外の場合

ここまで使ったImage->CanvasはBitmap以外はアクセスできない。
他の画像形式はBitmapに代入して行うのが安直だけど手軽。

まとめコード

以上のまとめコード。

2.色を薄くしていく

画像が段々薄くなるパターン。
RGBをいじるだけ。ScanLineを使えるので、ランダムなピクセル操作よりは高速。

かなりスムースになる。

3.アルファチャンネルを使う

TBitmapのアルファチャンネルを設定し、だんだん薄くしていく手もある。
(画像タイプみて変換する処理は省略。TPNGImageだと別の方法があるらしい)

実行結果。

4.Drawメソッドの第4引数を使う(お手軽)

Canvas->Drawメソッドで、第4引数の不透明度(Opacity)を指定する方法。
これはかなり手軽。TImageの画像がどんな形式でも、変換する必要はない。

C++Builder10.2.3 / Windows10(21H2)で確認。

TImageに表示されている画像の種類を知る[VCL]

C++Builder(Delphi)のTImageにはJpegやPng、ビットマップなど多様な画像が読み込めるが、あとから画像種類を知りたい場合
 Image->Picture->Graphic->ClassName()
で画像のVCLクラス名が取れる。今さら知ったのでメモ。

C++Builder10.2.3 / Windows10(21H2)で確認。