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++の勉強部屋」(目次)へ