図形フィルター機能を追加する
LEADTOOLSコンポーネントで画像を表示できました。ここまでの手順は通常のImageコンポーネントを使った場合と比較しても、大きな違いはありません。
しかし、それが重要なのです。大差ない手順で準備ができたLEADTOOLSコンポーネントが威力を発揮するのは、画像表示のコードができたあとに必要になってくるところからです。
それでは、画像にエフェクトをかける処理を追加してみましょう。表示領域を変形したり回転させたりするのはXAMLの機能で可能ですが、「エッジを抽出する」という課題であれば、どうすればよいでしょうか。
この課題の解決を標準機能だけで行うのは大変ですが、LEADTOOLSコンポーネントを使用すると、あらかじめ用意されている豊富なフィルター機能に「EdgeDetectEffect」も存在するため、コードを少し追加するだけで解決できます。
画像作成時にエフェクト適用
LEADTOOSの機能を適用する場所としては、RasterImageを作成するときに変換してしまう方法があります。
Dim workImage = Await codecs.LoadAsync(leadStream) Dim command As New Leadtools.ImageProcessing.Effects.EdgeDetectEffectCommand( 2, 10, Leadtools.ImageProcessing.Effects.EdgeDetectEffectCommandType.Solid) command.Run(workImage) Me.RasterElement = workImage
LoadAsyncしたものをパブリックプロパティに設定する前に、LEADTOOLSのEdgeDetectEffectCommandを使ってエッジを抽出する処理を行います。これでパブリックプロパティには、エッジを抽出した画像が設定できます。
コンバーターを使ってエフェクト適用
画像作成時に変換してしまう方法は、試しにフィルターをかけたいときやデザイン担当者側でエフェクトを選定したい時などには不向きです。
そこで提案したいのが、XAMLのコンバーターを使ってMainPage.xaml側でエフェクトをかけてしまう方法です。
PictureModelに施した変更を元に戻してから、コンバーターを作成します。
Imports Leadtools.ImageProcessing Namespace Converter Public Class ImageConverter Implements IValueConverter Public Function Convert(value As Object, targetType As Type, parameter As Object, language As String) As Object _ Implements IValueConverter.Convert If TypeOf value Is Leadtools.RasterImage Then Dim orignal = CType(value, Leadtools.RasterImage) Dim command As New Effects.EdgeDetectEffectCommand( 2, 10, Effects.EdgeDetectEffectCommandType.Solid) command.Run(orignal) Return orignal Else Return value End If End Function Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, language As String) As Object _ Implements IValueConverter.ConvertBack Throw New NotImplementedException End Function End Class End Namespace
コンバーターが作成できたら、MainPage.xamlにコンバーターを適用します。
プロパティウィンドウでRasterImageViewerのImageプロパティ欄にある□をクリックして、[データバインディング作成]メニューを選択します。そして、コンバーター欄に「ImageConverter」を指定すれば設定完了です。