0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Skia Tips:縁取りエフェクト

Last updated at Posted at 2025-11-08

イメージフィルタを応用して、縁取(光彩)りエフェクトを実現する方法を紹介します。

最軽量版

Skiaのドロップシャドウフィルタは、指定したオフセットとぼかしを持つドロップシャドウを描画するためのイメージフィルタです。このフィルタを利用して、縁取りエフェクトを作成することができます。

using var paint = new SKPaint {
    Color = SKColors.BlueViolet,
    IsAntialias = true,
    Style = SKPaintStyle.Stroke,
    StrokeWidth = 20,
    ImageFilter = SKImageFilter.CreateDropShadow( 
        0, 0,   // オフセットをゼロに設定
        8, 8,   // ぼかし半径を大きめに設定
        SKColors.White // 縁取りの色
    )
};
canvas.DrawCircle( 150, 100, 70, paint );

実行すると、以下のように、白い縁取りで囲まれた円が描画されます。ただ、縁取りの濃さはぼかしの影響を受けるため、あまり濃くはなりません。

edge1.jpg

濃い縁取り版

ドロップシャドウフィルタを二重にネストすることで、縁取りの濃さを増強することも可能です。濃さを自由に設定することはできませんが、シンプルに実装できます。

using var paint = new SKPaint {
    Color = SKColors.BlueViolet,
    IsAntialias = true,
    Style = SKPaintStyle.Stroke,
    StrokeWidth = 20,
    ImageFilter = SKImageFilter.CreateDropShadow( // 1段目
        0, 0, 
        10, 10, 
        SKColors.White,
        SKImageFilter.CreateDropShadow( // 2段目
            0, 0,
            10, 10,
            SKColors.White
        )
    )
};
canvas.DrawCircle( 150, 100, 70, paint );

実行すると、以下のように、より濃い白い縁取りで囲まれた円が描画されます。

edge3.jpg

完全版

より自由に縁取りの幅や濃さを調整することのできる、完全版の実装例を示します。この方法では、元図形を膨張し、ぼかして、アルファ値を抽出し、指定色で合成する一連のイメージフィルタを組み合わせています。具体的なフィルタの構成は以下の通りです。

  • ブレンド合成(SKImageFilter.CreateBlendMode(SrcOver))
    • ブレンドのDst側
      • カラーフィルター(SKImageFilter.CreateColorFilter)
        • カラーマトリックスフィルター(アルファ値抽出+着色)
        • ぼかしフィルター(SKImageFilter.CreateBlur)
          • 膨張フィルター(SKImageFilter.CreateDilate)
    • ブレンドのSrc側(元の描画)
SKColor glowColor = SKColors.White;
using var paint = new SKPaint() {
    Color = SKColors.BlueViolet,
    IsAntialias = true,
    Style = SKPaintStyle.Stroke,
    StrokeWidth = 20,
    ImageFilter = SKImageFilter.CreateBlendMode(
        // ブレンドモードSrcOverで合成
        SKBlendMode.SrcOver,
        // ブレンドのDst側
        SKImageFilter.CreateColorFilter(
            // アルファ値を抽出して色を付けるカラーフィルター
            SKColorFilter.CreateColorMatrix( new float[] {
                0, 0, 0, 0, glowColor.Red / 255f,
                0, 0, 0, 0, glowColor.Green / 255f,
                0, 0, 0, 0, glowColor.Blue / 255f,
                0, 0, 0, 1, 0
            } ),
            // ぼかしフィルター
            SKImageFilter.CreateBlur(
                3, 3,
                // 膨張フィルター
                SKImageFilter.CreateDilate( 5, 5 )
            )
        )
        // ブレンドのSrc側は省略(元の描画)
    )
};
canvas.DrawCircle( 150, 100, 70, paint );

実行すると、以下のように、更に濃い白い縁取りで囲まれた円が描画されます。縁取りの幅や濃さを自由に調整できる点が特徴です。

edge4.jpg


総合目次

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?