2017. 9.18.
石立 喬

Visual C#とWin2DによるUWPでの画像処理(6)

――― その他の有用なEffectクラスを確認する ―――

 Win2DのMicrosoft.Graphics.Canvas.Effects名前空間には、すでに紹介した以外にも、多くのEffectクラスがある。ここでは、二つの画像を合成・混合するその他のEffectクラスと、RGB空間からHSV表色系に変換してその値に変更を加え、再びRGB系に戻すのに使用するEffectクラスについて紹介する。

二つの画像を合成・混合するその他のEffectクラス
 前々稿で紹介したCompositeEffectクラス、前稿のBlendEffectクラスの他にも、類似するEffectクラスがあるので、参考までに紹介する。
◎CrossFadeEffectクラスによる画像混合
 CrossFadeEffectクラスの主なプロパティは、
   CrossFade ------- デフォルトは0.5で、0~1の間、0はSource1が出力され、1はSource2が出力される
   Source1 --------- IGraphicsEffectSource型
   Source2 --------- IGraphicsEffectSource型
であるので、二つの画像を任意の割合で混合することができる。。
 図1はプログラムの一例で、Source1を25%、Source2を75%とした場合と、Source1を75%、Source2を25%とした場合を実行している。図2はその結果である。


図1 CrossFadeEffectクラスを使う



図2 CrossFadeEffectで二つの画像を混合した結果


◎ArithmeticCompositeEffectクラスによる画像混合
 ArithmeteicCompositeEffectクラスの主なプロパティは、
   Source1 ----------- IGraphicsEffectSource型
   Source2 ----------- IGraphicsEffectSource型
   Source1Amount ----- Source1が出力に占める割合、デフォルトは0、-1にすると減算ができる
   Source2Amount ----- Source2が出力に占める割合、デフォルトは0、-1にすると減算ができる
   MultiplyAmount ---- Source1とSource2の積が、出力に占める割合、デフォルトは1
   Offset ------------ 出力に加算される値、デフォルトは0
   ClampOutput ------- デフォルトはfalse、trueにすると、出力を0~1にクランプする
であるので、BlendEffectのMultiplyモードやSubtractモード、CrossFadeEffectと同様な処理ができる。
 たとえば、Source1Amount = 1.0f、Source2Amount = -1.0fとすると、Source1からSource2を減算でき、Source1Amount = 0.25f、Source2Amount = 0.75fとするとこの比率での加算ができる。
 この使い方についてのプログラムや実行結果は省略する。

HueRotationEffectクラスによる色相の補正
 HueRotationEffectクラスの主なプロパティは、
   Angle ------- デフォルトは0で、0~2πの間、マイナス値も正常に使用できることを確認した
   Source ------ IGraphicsEffectSource型
である。
 図3はプログラムの一例で、Angleを-0.5、0.5、1と変化させて実行している。図4はその結果である。


図3 HueRotationEffectクラスでAngleを変えるとHueを変えることができる



図4 HueRotationEffectクラスでAngleを変える


RgbToHueEffect、LinearTransferEffce、HueToRgbEffectによる画像補正
 まず、RgbToHueEffectクラスでRGB画像をHSV空間に変換し、HSVを個別に、LinearTransferEffectクラスで変更してから、再び、HueToRgbEffectクラスでRGB画像に戻すと、画像の補正ができる。
 HueRotationEffect、SaturationEffect、BrightnessEffectを使用しても類似の効果は得られるが、LinearTransferEffectを使用すると、Offset(一定量のシフト)とSlope(一定倍率による変更)の両面から補正できるのが便利である。
 RgbToHueEffectクラスの主なプロパティは、
   OutputColorSpace --- EffectHueColorSpace列挙子、デフォルトはHsvで、Hslを指定することもできる
   Source ------------ IGraphicsEffectSource型
である。
 LinearTransferEffectクラスの主なプロパティは、
   RedOffset ------- デフォルトは0
   RedSlope -------- デフォルトは1
   GreenOffset ----- デフォルトは0
   GreenSlope ------ デフォルトは1
   BlueOffset ------ デフォルトは0
   BlueSlope ------- デフォルトは1
   ClampOutput ----- デフォルトはfalse、trueにすると、出力を0~1にクランプする
   Source --------- IGraphicsEffectSource型
である。
 RgbToHueによって得られたHSV擬似画像は、H = Red、S = Blue、V = Greenに対応している。H(Hue)すなわちRedに対してはClampOutputをデフォルトのままにしておく必要がある。簡単な実験によると、ClampOutputをfalse(デフォルトのまま)にしても、オーバーフロー、アンダーフローが他のビットに影響している恐れがあり、注意を要する。その他では、ClampOutput = trueにして置くのが無難である。
 HueToRgbEffectクラスの主なプロパティは、
   SourceColorSpace ----- デフォルトはHsvで、Hslを指定することもできる
   Source -------------- IGraphicsEffectSource型
である。
 図5はプログラムの一例で、HueにOffsetで0,2を加え(RGB表示との互換性で、範囲は0~2πである)、SaturatuionをSlopeで1.8倍にし、ValueをSlopeで1.4倍にしてある。図6はその結果である。


図5 RgbToHueEffectでHSV系に変え、LinearTransferEffectで変更してからHueToRgbEffectで戻す



図6 HSV系で変更を加えてRGB系に戻した結果


感想
 ArithmeticCompositeEffectはCompositeEffectとどう違うのか?Arithmeticは代数学であるが、論理代数を含むこともある。区別するならば、CompositeEffectはLogicalCompositeEffectとすべきではないか。CrossFadeEffectもおかしい。ArithmeticCompositeEffectに完全に含まれる。Win2Dには画像処理用の優れたクラスが多数あるが、統一が取れていない感もある。
 RgbToHueEffect、LinearTransferEffect、HueToRgbEffectを使用してのHueの変更は、HueRotationEffectでの結果と完全に一致しない場合があり(Hueの範囲による)、なるべくならばHueRotationEffectの使用を奨める。







「Visual C++の勉強部屋」(目次)へ