Home

GDI+ Brushes: Texture Brushes

 

Introduction

The hatch brushes we have used are based on already designed patterns to fill a shape. In some cases, you may want to create or design your own pattern and use it to fill an area. To do this, you must perform two main steps. First, you must design a picture and save it as a file. Then you must create an object referred to as a texture brush and pass the picture to it.

A texture brush is an object that holds a picture and uses it to regularly fill the interior of a closed shape. To initialize it, you can use an existing picture designed by someone else or you can design your own picture using any normal graphics application, including Microsoft Paint that is automatically installed with Microsoft Window. You should have the picture as a file with a normal graphics file extension, which could be .bmp. Here is an example of a designed bitmap saved as Papers.bmp:

Bitmap

Equipped with the picture, you can then use the TextureBrush class that provides various constructors.

Creating a Texture Brush

The simplest constructor of this class takes as argument an Image object. The syntax of this constructor is:

Public Sub New(bitmap As Image)

This constructor expects a bitmap as argument. After initializing the brush, you can use it to fill the interior of a closed shape. For example, you can call a Fill... method to paint its shape. Here is an example:

Imports System.Drawing
Imports System.Windows.Forms

Module Exercise

    Public Class Starter
        Inherits Form

        Dim components As System.ComponentModel.Container

        Public Sub New()
            InitializeComponent()
        End Sub

        Public Sub InitializeComponent()

        End Sub

        Private Sub FormPaint(ByVal sender As Object, _
                              ByVal e As PaintEventArgs) _
                              Handles MyBase.Paint

            Dim BmpPapers As Bitmap = New Bitmap("Papers.bmp")
            Dim BrushPapers As TextureBrush = New TextureBrush(BmpPapers)
            e.Graphics.FillRectangle(BrushPapers, 5, 5, 430, 280)


        End Sub
    End Class

    Function Main() As Integer

        Dim frmStart As Starter = New Starter

        Application.Run(frmStart)

        Return 0
    End Function

End Module

Texture Brush

If you use this constructor, the compiler would itself find out the location and dimensions of the picture in the area where it was designed. Although the location must be at (0, 0), the width and the height must be lower or equal to the intended dimensions of the bitmap. For example, if you have a picture that is 48x48 pixels, the width you can use from this picture must be <= 48 and the height must be <= 48. This allows you to use only a portion of the picture if you want. To use a portion of the picture, you can use the following constructor:

Public Sub New(image As Image, dstRect As Rectangle)

The second argument to this constructor is used to specify the width and height of the picture. If you prefer to use a rectangle whose arguments are decimal numbers, you can use the following constructor:

Public Sub New(image As Image, dstRect As RectangleF)

Here is an example:

Private Sub FormPaint(ByVal sender As Object, _
                              ByVal e As PaintEventArgs) _
                              Handles MyBase.Paint

    Dim BmpPapers As Bitmap = New Bitmap("Papers.bmp")
    Dim BrushPapers As TextureBrush = New TextureBrush(BmpPapers, _
                                                   New Rectangle(0, 0, 42, 42))
            e.Graphics.FillRectangle(brushPapers, 5, 5, 416, 290)

End Sub

Texture Brush

Wrapping a Texture Brush

The constructors we have used so far allow you to draw the bitmap in each allocated rectangle in a tiled fashion. To make it more fun, the TextureBrush class is equipped with a factor referred to as wrap mode. This factor specifies how the tiling must be performed. To apply it, you can use one of the following constructors:

Public Sub New(image As Image, wrapMode As WrapMode)
Public Sub New(image As Image, wrapMode As WrapMode, dstRect As Rectangle)
Public Sub New(image As Image, wrapMode As WrapMode, dstRect As RectangleF)

The bitmap and the destination arguments are used in the same way we have done so far. The wrapMode argument is a member of the WrapMode enumerator. The WrapMode enumerator is defined in the System.Drawing.Drawing2D namespace. It has the following members:

Clamp: Draws one picture in the allocated rectangle:

Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms

Module Exercise

    Public Class Starter
        Inherits Form

        Dim components As System.ComponentModel.Container

        Public Sub New()
            InitializeComponent()
        End Sub

        Public Sub InitializeComponent()

        End Sub

        Private Sub FormPaint(ByVal sender As Object, _
                              ByVal e As PaintEventArgs) _
                              Handles MyBase.Paint

            Dim bmpPapers As Bitmap = New Bitmap("Papers.bmp")
            Dim brushPapers As TextureBrush = New TextureBrush(bmpPapers, _
         			WrapMode.Clamp)
            e.Graphics.FillRectangle(brushPapers, 5, 5, 438, 290)

        End Sub
    End Class

    Function Main() As Integer

        Dim frmStart As Starter = New Starter

        Application.Run(frmStart)

        Return 0
    End Function

End Module

Texture Brush

Tile: Draws the picture continuous in a tiled fashion:

Private Sub FormPaint(ByVal sender As Object, _
                              ByVal e As PaintEventArgs) _
                              Handles MyBase.Paint

    Dim BmpPapers As Bitmap = New Bitmap("Papers.bmp")
    Dim BrushPapers As TextureBrush = New TextureBrush(BmpPapers, _
                                                       WrapMode.Tile, _
                               New Rectangle(0, 0, 42, 42))
            e.Graphics.FillRectangle(BrushPapers, 5, 5, 414, 290)

End Sub

Texture Brush

TileFlipX: Draws the picture, draws it again on its right side but flipped horizontally, and then repeats this technique continuous in a tiled fashion and in the allocated rectangle:

Private Sub FormPaint(ByVal sender As Object, _
                              ByVal e As PaintEventArgs) _
                              Handles MyBase.Paint

    Dim bmpPapers As Bitmap = New Bitmap("Papers.bmp")
    Dim brushPapers As TextureBrush = New TextureBrush(bmpPapers, _
                                                       WrapMode.TileFlipX)
    e.Graphics.FillRectangle(brushPapers, 5, 5, 430, 280)

End Sub

Tile Flip X

TileFlipY: Draws the picture, draws it again under it but flipped vertically, and then repeats this technique continuous in a tiled fashion and in the allocated rectangle:

Private Sub FormPaint(ByVal sender As Object, _
                              ByVal e As PaintEventArgs) _
                              Handles MyBase.Paint

    Dim bmpPapers As Bitmap = New Bitmap("Papers.bmp")
    Dim brushPapers As TextureBrush = New TextureBrush(bmpPapers, _
                                                    WrapMode.TileFlipX, _
                                      		New Rectangle(0, 0, 42, 42))
    e.Graphics.FillRectangle(brushPapers, 5, 5, 412, 290)

End Sub

Tile Flip X

TileFlipXY: Draws the picture, draws it again on its right side but flipped horizontally, then draws both the original and the right copy under each other but flipped vertically. These four pictures are redrawn in a tiled fashion and in the allocated rectangle:

Private Sub FormPaint(ByVal sender As Object, _
                              ByVal e As PaintEventArgs) _
                              Handles MyBase.Paint

    Dim bmpPapers As Bitmap = New Bitmap("Papers.bmp")
    Dim brushPapers As TextureBrush = New TextureBrush(bmpPapers, _
                                                     WrapMode.TileFlipXY, _
                                                     New Rectangle(0, 0, 42, 42))
            e.Graphics.FillRectangle(brushPapers, 5, 5, 412, 244)

End Sub

Texture Brush

 

Home Copyright © 2008-2016, FunctionX, Inc. Home