Oct 10, 2007

Set BMP file to Transparent


Set BMP file to Transparent


Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports System.Configuration
Imports System.Resources
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging

Public Class MainClass
    Shared Sub  Main()
        Dim  myform As Form = New TransparencyForm()
        Application.Run(myform)
    End Sub
End Class

Public Class TransparencyForm
    Inherits  System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub  New()
        MyBase.New()

        'Th is call is required by the Windows Form Designer.
        InitializeComponent()

        'Ad d any initialization after the InitializeComponent() call
        Me.SetStyle(ControlStyles.ResizeRedraw , True)
        Me.SetStyle(ControlStyles.DoubleBuffer , True)
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint , True)
    End Sub

    'Fo rm overrides dispose to clean up the component list.
    Protected  Overloads Overrides Sub  Dispose(ByVal disposing As  Boolean)
        If  disposing Then
            If  Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Re quired by the Windows Form Designer
    Private  components As System.ComponentModel.IContainer

    'NO TE: The following procedure  is required by the Windows Form Designer
    'It  can be modified using the Windows Form Designer.  
    'Do  not modify it using the code editor.
    Friend WithEvents splitter2  As System.Windows.Forms.Splitter
    Friend WithEvents splitter1  As System.Windows.Forms.Splitter
    Friend WithEvents groupBox1  As System.Windows.Forms.GroupBox
    Friend WithEvents panel1  As System.Windows.Forms.Panel
    Friend WithEvents groupBox3  As System.Windows.Forms.GroupBox
    Friend WithEvents panel3  As System.Windows.Forms.Panel
    Friend WithEvents groupBox2  As System.Windows.Forms.GroupBox
    Friend WithEvents panel2  As System.Windows.Forms.Panel
    <System.Diagnostics.DebuggerStepThrough ()> Private Sub InitializeComponent()
        Me.splitter2 = New System.Windows.Forms.Splitter ()
        Me.splitter1 = New System.Windows.Forms.Splitter ()
        Me.groupBox1 = New System.Windows.Forms.GroupBox ()
        Me.panel1 = New System.Windows.Forms.Panel ()
        Me.groupBox3 = New System.Windows.Forms.GroupBox ()
        Me.panel3 = New System.Windows.Forms.Panel ()
        Me.groupBox2 = New System.Windows.Forms.GroupBox ()
        Me.panel2 = New System.Windows.Forms.Panel ()
        Me.groupBox1.SuspendLayout()
        Me.groupBox3.SuspendLayout()
        Me.groupBox2.SuspendLayout()
        Me.SuspendLayout()
        '
        'sp litter2
        '
        Me.splitter2.Location = New System.Drawing.Point (232 0)
         Me.splitter2.Name = "splitter2"
        Me.splitter2.Size = New System.Drawing.Size (3 102)
        Me.splitter2.TabIndex =  9
        Me.splitter2.TabStop = False
        '
        'sp litter1
        '
        Me.splitter1.Location = New System.Drawing.Point (229 0)
         Me.splitter1.Name = "splitter1"
        Me.splitter1.Size = New System.Drawing.Size (3 102)
        Me.splitter1.TabIndex =  6
        Me.splitter1.TabStop = False
        '
        'gr oupBox1
        '
        Me.groupBox1.Controls.AddRange (New System.Windows.Forms.Control() {Me.panel1})
        Me.groupBox1.Dock = System.Windows.Forms.DockStyle.Left
        Me.groupBox1.Location = New System.Drawing.Point (117 0)
         Me.groupBox1.Name = "groupBox1"
        Me.groupBox1.Size = New System.Drawing.Size (112 102)
        Me.groupBox1.TabIndex =  5
        Me.groupBox1.TabStop = False
        Me.groupBox1.Text =  "Original Colors"
        '
        'pa nel1
        '
        Me.panel1.BackColor = System.Drawing.Color.White
        Me.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
        Me.panel1.Dock = System.Windows.Forms.DockStyle.Fill
        Me.panel1.Location = New System.Drawing.Point (3 16)
         Me.panel1.Name = "panel1"
        Me.panel1.Size = New System.Drawing.Size (106 83)
        Me.panel1.TabIndex =  0
        '
        'gr oupBox3
        '
        Me.groupBox3.Controls.AddRange (New System.Windows.Forms.Control() {Me.panel3})
        Me.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill
        Me.groupBox3.Location = New System.Drawing.Point (117 0)
         Me.groupBox3.Name = "groupBox3"
        Me.groupBox3.Size = New System.Drawing.Size (235 102)
        Me.groupBox3.TabIndex =  8
        Me.groupBox3.TabStop = False
        Me.groupBox3.Text =  "Made Transparent"
        '
        'pa nel3
        '
        Me.panel3.BackColor = System.Drawing.Color.White
        Me.panel3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
        Me.panel3.Dock = System.Windows.Forms.DockStyle.Fill
        Me.panel3.Location = New System.Drawing.Point (3 16)
         Me.panel3.Name = "panel3"
        Me.panel3.Size = New System.Drawing.Size (229 83)
        Me.panel3.TabIndex =  0
        '
        'gr oupBox2
        '
        Me.groupBox2.Controls.AddRange (New System.Windows.Forms.Control() {Me.panel2})
        Me.groupBox2.Dock = System.Windows.Forms.DockStyle.Left
         Me.groupBox2.Name = "groupBox2"
        Me.groupBox2.Size = New System.Drawing.Size (117 102)
        Me.groupBox2.TabIndex =  7
        Me.groupBox2.TabStop = False
        Me.groupBox2.Text =  "White Background"
        '
        'pa nel2
        '
        Me.panel2.BackColor = System.Drawing.Color.White
        Me.panel2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
        Me.panel2.Dock = System.Windows.Forms.DockStyle.Fill
        Me.panel2.Location = New System.Drawing.Point (3 16)
         Me.panel2.Name = "panel2"
        Me.panel2.Size = New System.Drawing.Size (111 83)
        Me.panel2.TabIndex =  0
        '
        'Tr ansparencyForm
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size (5 13)
        Me.ClientSize = New System.Drawing.Size (352 102)
        Me.Controls.AddRange(New System.Windows.Forms.Control () {Me.splitter2, Me.splitter1, Me.groupBox1, Me.groupBox3, Me.groupBox2})
        Me.Name =  "TransparencyForm"
        Me.Text =  "TransparencyForm"
        Me.groupBox1.ResumeLayout(False)
        Me.groupBox3.ResumeLayout(False)
        Me.groupBox2.ResumeLayout(False)
        Me.ResumeLayout(False)

    End Sub

#End  Region


    Dim  backgroundString As String =  "a\n b\n c\n d\n e\n f\n g\n H \n"


    Private Sub  panel1_Paint(ByVal sender As  Object, ByVal e As  PaintEventArgs) Handles panel1.Paint
        Dim As Graphics = e.Graphics
        Dim  bmp As Bitmap = New Bitmap( "figure2.BMP")
        g.DrawString(backgroundString,  Me.Font, Brushes.Black, Me.ClientRectangle.Left, Me.ClientRectangle.Top)
        Dim  rect As Rectangle = New Rectangle( 0 0, bmp.Width, bmp.Height)
        rect.Offset((Me.panel1.ClientRectangle.Width  - rect.Width) / 2, (Me.panel1.ClientRectangle.Height  - rect.Height) / 2)
        g.DrawImage(bmp, rect)
    End Sub

    Private Sub  panel2_Paint(ByVal sender As  Object, ByVal e As  PaintEventArgs) Handles panel2.Paint
        Dim As Graphics = e.Graphics
        Dim  bmp As Bitmap = New Bitmap( "figure2.BMP")
        g.DrawString(backgroundString,  Me.Font, Brushes.Black, Me.ClientRectangle.Left, Me.ClientRectangle.Top)

        Dim  colorMap As ColorMap() = New ColorMap() {New ColorMap()}
        colorMap( 0).OldColor = bmp.GetPixel(0 , bmp.Height - 1 )
        colorMap( 0).NewColor = Color.White
        Dim  attr As ImageAttributes = New ImageAttributes()
        attr.SetRemapTable(colorMap)

        Dim  rect As Rectangle = New Rectangle( 0 0, bmp.Width, bmp.Height)
        rect.Offset((Me.panel1.ClientRectangle.Width  - rect.Width) / 2, (Me.panel1.ClientRectangle.Height  - rect.Height) / 2)
        g.DrawImage(bmp, rect)
    End Sub

    Private Sub  panel3_Paint(ByVal sender As  Object, ByVal e As  PaintEventArgs) Handles panel3.Paint
        Dim As Graphics = e.Graphics
        Dim  bmp As Bitmap = New Bitmap( "figure2.BMP")
        g.DrawString(backgroundString,  Me.Font, Brushes.Black, Me.ClientRectangle.Left, Me.ClientRectangle.Top)

        bmp.MakeTransparent(bmp.GetPixel (0, bmp.Height -  1))
        Dim  rect As Rectangle = New Rectangle( 0 0, bmp.Width, bmp.Height)
        rect.Offset((Me.panel1.ClientRectangle.Width  - rect.Width) / 2, (Me.panel1.ClientRectangle.Height  - rect.Height) / 2)
        g.DrawImage(bmp, rect)
    End Sub

    Private Sub  TransparencyForm_Layout(ByVal sender  As Object, ByVal e As  LayoutEventArgs) Handles MyBase.Layout
        panel1.Refresh()
        panel2.Refresh()
        panel3.Refresh()
    End Sub
End Class

 

Rotating an image around its center in .NET

Rotating an image around its center in .NET#

As you can see on the new screenshots for the WeFly247.NET Passenger website, there's a dynamic flightmap image displaying the route the plane has already traveled and where the plane is at now.

As I was replacing some hard-coded info (like the image to use for the map, the start- and endpoints of the flight on the map, ...), I figured I was also going to need to rotate the plane dynamically so that it would follow the path (I wouldn't feel too comfortable if I was looking at a flightmap where my plane seemed to fly sideways). Before that, I had just rotated the stat ic image itself, but if the flight path can change, so can the rotation.

There is an Image.Rotat eFlip method but that only allows rotating over 90/180/270 degrees. I also looked at some mat rix transformations on a Region object using Matrix.Rotate, but that seemed a little too hard to get working. Furthermore, I wanted to rotat e the plane around its center (not around the upper left corner as most rotations do) so I sat down and thought deeply about rot ation equations (so my math teacher was right, it does come in handy sometimes!), decided I forgot all about it (sorry teach), and looked it up again.

After rotating a point (x, y) around the origin over an angle a, the new coordinates (x', y') are:

x' = x cos(a) + y sin(a)
y' = -x sin(a) + y cos(a)

Now you can use a Graphics. DrawImage method overload to draw the image in a given parallelogram extrapolated from an array of three points. That would do just fine to rot ate the image if I could calculate the three points, which I could using the simple formulas above. So my final implementation to draw a rot ated image onto a graphics object became (beware: VB.NET snippet coming up ;-) ):

' Draws an image onto the given graphics object. The image is rot ated by a specified angle
' (in radians) around its center and then drawn at the given center point.
Private Sub DrawImageRot atedAroundCenter(ByVal g As Graphics, _
    ByVal center As Point, ByVal img As Image, ByVal angle As Double)

     ' Think of the image as a rectangle that needs to be drawn rotated.
     ' Rotate the coordinates of the rectangle's corners.
     Dim upperLeft As Point = RotatePoint(New Point(-img.Width / 2, img.Height / 2), angle)
     Dim upperRight As Point = RotatePoint(New Point(img.Width / 2, img.Height / 2), angle)
     Dim lowerLeft As Point = RotatePoint(New Point(-img.Width / 2, -img.Height / 2), angle)

     ' Create the points array by offsetting the coordinates with the center.
     Dim points() As Point = {upperLeft + center, upperRight + center, lowerLeft + center}
    
    ' Draw the rotated image.
    g.DrawImage(img, points)

End Sub

' Rotates a point around the origin by the specified angle (in radians).
' Rotation adheres to the following rules for the new coordin ates:
' x' = x cos(a) + y sin(a)
' y' = -x sin(a) + y cos(a)
Private Function RotatePoint( ByVal p As Point, ByVal angle As Double) As Point

     Dim x As Integer = p.X * Math.Cos(angle) + p.Y * Math. Sin(angle)
    Dim y As Integer = -p.X * Math. Sin(angle) + p.Y * Math.Cos(angle)

     Return New Point(x, y)

End Function

original source: http://jelle.druyts.net/2004/05/26/RotatingAnImageAroundItsCenterInNET.aspx