執筆者: インフラジスティックス・ジャパン株式会社 池原 大然

動作確認環境: Visual Studio 2010、.NET Framework 2.0、Windows 7 Enterprise 32 bit

更新日: 2010 年 6 月 4 日


GDI+ を介してテキスト、イメージの描画を行う場合、System.Drawing.Graphics オブジェクトを作成する必要があります。Graphics クラスでは、四角形や楕円など色々な図形を描画することが可能です。その際に図形の色を 2 色のグラデーションで表したい場合、System.Drawing.Drawing2D.LinearGradientBrush を使用します。

なお、コンソール アプリケーションは初期状態で System.Drawing.dll アセンブリがプロジェクトで参照されていないため、[ソリューション エクスプローラー] から [参照の追加] を実行し、アセンブリを予めプロジェクトに追加しておく必要があります。

今回のサンプルコードでは 作成した Bitmap オブジェクトから Graphics オブジェクトを取得し、青色、赤色の 2 色を用いて四角形を描画します。さらに描画が完了した段階で、ファイルとして保存し、拡張子に紐付けられたアプリケーションが起動するように設定しています。

Visual Basic
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Drawing2D

Module Module1

    Sub Main()
        Dim FilePath As String = Path.Combine( _
            Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),"GradientSample.jpg")

        Using oBitmap As New Bitmap(300, 300)
            Using g As Graphics = Graphics.FromImage(oBitmap)
                Using oBrush As New LinearGradientBrush( _
                            g.VisibleClipBounds, _
                            Color.Blue, _
                            Color.Red, _
                            LinearGradientMode.BackwardDiagonal)

                    g.FillRectangle(oBrush, g.VisibleClipBounds)
                    oBitmap.Save(FilePath)

                End Using
            End Using
        End Using
        Process.Start(FilePath)

    End Sub

End Module
 

今回は、LinearGradientBrush の初期化時に

  • グラデーションの範囲を示す四角形
  • 開始色
  • 終了色
  • グラデーションの方向

を設定しています。

Visual Basic
Dim oBrush As New LinearGradientBrush( _
             g.VisibleClipBounds, _
             Color.Blue, _
             Color.Red, _
             LinearGradientMode.BackwardDiagonal)
 

グラデーションの方向を設定するには LinearGradientMode 列挙体から選択するか、あるいは X 軸からの角度を指定することも可能です。

サンプルコードを実行すると、Windows 7 では Windows フォト ビューアーが起動し、作成した画像が表示されます。

より複雑なグラデーションを表現するためには PathGradientBrush を使用します。

Visual Basic
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Drawing2D

Module Module1

    Sub Main()
        Dim FilePath As String = Path.Combine( _
            Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),  "GradientSample.jpg")

        Using oBitmap As New Bitmap(300, 300)
            Using g As Graphics = Graphics.FromImage(oBitmap)
                Using gPath As New GraphicsPath()

                    Dim points As PointF() = New PointF() { _
                        New PointF(g.VisibleClipBounds.Width / 2, 0), _
                        New PointF(0, g.VisibleClipBounds.Height / 2), _
                        New PointF(g.VisibleClipBounds.Width / 2, g.VisibleClipBounds.Height), _
                        New PointF(g.VisibleClipBounds.Width, g.VisibleClipBounds.Height / 2)}

                    gPath.AddPolygon(points)

                    Using oBrush As New PathGradientBrush(gPath)

                        oBrush.SurroundColors = New Color() { _
                            Color.Blue, _
                            Color.Green, _
                            Color.Yellow, _
                            Color.Red}
                        oBrush.CenterColor = Color.White

                        g.FillRectangle(oBrush, g.VisibleClipBounds)
                        oBitmap.Save(FilePath)

                    End Using
                End Using
            End Using
        End Using
        Process.Start(FilePath)

    End Sub

End Module
 

この場合、グラデーションの各点を GraphicsPath クラスで定義し、PathGradientBrush.SurroundColors で塗りつぶす色の配列を定義しています。

この実行結果は下記のようになります。

今回はコンソール アプリケーションとして実装していますが、Windows Forms アプリケーションにおいても同様にグラデーションを持った図形の描画を行うことが可能です。また、.NET Framework 3.0 からは WPF 用に System.Windows.Media 名前空間に同名の LinearGradientBrush クラスが追加され、こちらを使用することが可能です。


Code Recipe Code Recipe

ページのトップへ