Blue Theme Orange Theme Green Theme Red Theme
 
Home | Forums | Videos | Photos | Blogs | Beginners
 | Consulting  
Submit an Article Submit a Blog 
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
Nevron Chart
 Resources  
Close
 Our Network  
Close
Search :       Advanced Search »
Home » GDI+ and Graphics » Build a simple Watermarking utility in Visual Basic 2005

Build a simple Watermarking utility in Visual Basic 2005


This article shall describe an approach to building a simple watermarking utility that may be used to add watermarks to any supported image file format. The resulting application shall permit the user to open any supported image file format into a scrollable picture box.

Author Rank:
Total page views :  14643
Total downloads :  592
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
Download Files:
WatermarkVBPack.zip
 
Become a Sponsor

Introduction

This article shall describe an approach to building a simple watermarking utility that may be used to add watermarks to any supported image file format. The resulting application shall permit the user to open any supported image file format into a scrollable picture box, to define the text to be applied as a watermark (with a default version supplied), to set the font and color of the watermark, to define the opacity of the watermark, to determine whether or not the watermark appears at the top or bottom of the image, and to preview the watermark prior to saving it to the image.



Figure 1: the Utility Application showing a Watermarked Image

If you are at all curious about the image, it is of an American Goldfinch, this time of year, I have a about 50 or so such birds hanging around my bird feeders.I tookthe picture with myFuji S700 digital camera through the kitchen window.

Getting Started

The solution contains a single Windows Forms project called “WatermarkingVB” written in Visual Basic 2005; the application contains only a single form (frmWatermark.vb) and all of the code necessary to drive the application is contained in that single form class.


Figure 2:  Solution Explorer with the Project Visible
 

Code:  Watermarking Main Form (frmWatermark.vb)

All of the code necessary for this project is contained in this single form; that form shall be described entirely in this section.

The code for this form class begins with the following:

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Text

 

''' <summary>

''' An Image Watermarking Utility

''' </summary>

''' <remarks></remarks>

Public Class frmWatermark

Following the declaration of the form class, the next order of business in the application is to declare a collection of member variables requiring form wide scope; these variables are contained in a defined region entitled, “Member Variables”. The declaration of the variables follows; as can been determined, the variables are used to keep track of the current file location and image, codec and encoder information used to translate the image from one format to another, and the color and font used to display the image watermark.   

#Region "Member Variables"

 

    Private CurrentFile As String

    Private img As Image

    Private myImageCodecInfo As ImageCodecInfo

    Private myEncoder As System.Drawing.Imaging.Encoder

    Private myEncoderParameter As EncoderParameter

    Private myEncoderParameters As EncoderParameters

    Private myWatermarkColor As System.Drawing.Color

    Private myFont As System.Drawing.Font

 

#End Region

The next block of code in the form class is the constructor; in this instance, the constructor is used to establish a default configuration including the definition of the watermark color, the opacity level of the watermark, the positioning option (top or bottom), the text contained in the watermark, and the font used to display the watermark.

#Region "Constructor"

 

    ''' <summary>

    ''' Constructor with default settings

    ''' </summary>

    ''' <remarks></remarks>

    Public Sub New()

 

        InitializeComponent()

 

        ' setup default settings

        myWatermarkColor = Color.SteelBlue

        cboOpacity.SelectedIndex = 2

        optTop.Checked = True 

        txtWaterMark.Text = "Your Name " & _Char.ConvertFromUtf32(169).ToString() & " " & _            

                                        DateTime.Now.Year.ToString() + ", All Rights Reserved"

        myFont = txtWaterMark.Font

 

    End Sub

 

#End Region

Following the constructor, there is a region defined to handle file input/output operations. This region contains two event handlers, one for the selection of the Open File menu strip option, and one for the save buttons’s click event. The open file menu option is used to allow the user to navigate to and select an image file for load; the selected image file is placed into a scrollable picturebox.

The save button click event handler is used to save the image file with the watermark; the original file may be renamed or overwritten.

#Region "File IO"
 

    Private Sub openToolStripMenuItem_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles openToolStripMenuItem.Click

 

        ' configure the open file dialog to point to some

        ' common (usable) image file formats

        openFileDialog1.Title = "Open Image File"

        openFileDialog1.Filter = "Bitmap Files|*.bmp" & _|Enhanced Windows MetaFile|*.emf" & _"|Exchangeable Image File|*.exif"

               & _"|Gif Files|*.gif|JPEG Files|*.jpg" & _"|PNG Files|*.png|TIFF Files|*.tif|Windows MetaFile|*.wmf"

        openFileDialog1.DefaultExt = "bmp"

        openFileDialog1.FilterIndex = 1

        openFileDialog1.FileName = ""

        openFileDialog1.ShowDialog()

 

        ' if the user did not select a file, return

        If (openFileDialog1.FileName = "") Then Return 

 

        ' update the current file and form caption text

        CurrentFile = openFileDialog1.FileName.ToString()

        Me.Text = "Watermark Utility: " & CurrentFile.ToString()

 

        Try

 

            ' open the image into the picture box

            img = Image.FromFile(openFileDialog1.FileName, True)

            picContainer.Image = img

 

            ' resize the picture box to support scrolling

            ' large images

            picContainer.Size = img.Size

 

        Catch ex As Exception

 

            MessageBox.Show(ex.Message, "File Open Error")

 

        End Try

 

    End Sub 

 

    Private Sub btnSave_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles btnSave.Click

 

        Try

 

            ' get the extension to figure out how to limit the save

            ' option to the current image file type

            Dim strExt As String

            strExt = System.IO.Path.GetExtension(CurrentFile)

            strExt = strExt.ToUpper()

            strExt = strExt.Remove(0, 1)

 

            ' if the current image is, for example, a gif, only

            ' allow the user to save the file with the watermark

            ' as a gif

            SaveFileDialog1.Title = "Save File"

            SaveFileDialog1.DefaultExt = strExt

            SaveFileDialog1.Filter = strExt & " Image Files|*." + strExt

            SaveFileDialog1.FilterIndex = 1

 

            If SaveFileDialog1.ShowDialog() = DialogResult.OK Then

                If (SaveFileDialog1.FileName = "") Then

                    Return

                Else

                    ' save the file with the name supplied by the user

                    picContainer.Image.Save(SaveFileDialog1.FileName)

                End If

 

                ' update the current image file to point to the newly saved

                ' image

                CurrentFile = SaveFileDialog1.FileName

                Me.Text = "Watermark Utility: " + CurrentFile

                MessageBox.Show(CurrentFile.ToString() + " saved.", "File

                Save")

            Else

                MessageBox.Show("The save file request was cancelled by

                user.", "Save Cancelled")

            End If

 

        Catch ex As Exception

 

            MessageBox.Show(ex.Message.ToString(), "Image Save Error")

 

        End Try

 

    End Sub 

 

#End Region
 

After handling the file IO operations, the next region of code is the Image Format Conversion section.  In this region, the methods provided are used to convert the open image into an alternative format (e.g., bitmap to JPEG, or JPEC to GIF, etc.). Each section of code is annotated and may be reviewed in the following:

#Region "Image Format Conversion"

 

    Private Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo

 

        Dim j As Integer

        Dim encoders As ImageCodecInfo()

        encoders = ImageCodecInfo.GetImageEncoders()

 

        For j = 0 To encoders.Length

 

            If (encoders(j).MimeType = mimeType) Then

                Return encoders(j)

            End If

 

        Next

 

        Return Nothing

 

    End Function

 

    Private Sub bitmapToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bitmapToolStripMenuItem.Click

 

        ' create a new name with the bitmap extension

        Dim newName As String = _

        System.IO.Path.GetFileNameWithoutExtension(CurrentFile)

        newName = newName + ".bmp"

 

        Try

 

            ' save the file as a bitmap

            img.Save(newName, ImageFormat.Bmp)

            CurrentFile = newName

            picContainer.Image = Image.FromFile(CurrentFile)

            Me.Text = "Watermark Utility: " + CurrentFile.ToString()

 

        Catch

 

            MessageBox.Show("Failed to save image to bitmap.", "Error", _

            MessageBoxButtons.OK, MessageBoxIcon.Error)

            Return

 

        End Try

 

        MessageBox.Show("Image file saved to " + newName.ToString(), _"Image Saved", MessageBoxButtons.OK,   

                            MessageBoxIcon.Information)

 

    End Sub

 

    Private Sub emfToolStripMenuItem_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles

             emfToolStripMenuItem.Click

 

        ' create a new name with the emf extension

        Dim newName As String = _

        System.IO.Path.GetFileNameWithoutExtension(CurrentFile)

        newName = newName + ".emf"

 

        Try

 

            ' save the file as a EMF

            img.Save(newName, ImageFormat.Emf)

            CurrentFile = newName

            picContainer.Image = Image.FromFile(CurrentFile)

            Me.Text = "Watermark Utility: " + CurrentFile.ToString()

 

        Catch

 

            MessageBox.Show("Failed to save image to EMF.", "Error", _

            MessageBoxButtons.OK, MessageBoxIcon.Error)

 

            Return

 

        End Try

 

        MessageBox.Show("Image file saved to " + newName.ToString(), _"Image Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)

 

    End Sub

 

    Private Sub exifToolStripMenuItem_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles

                 exifToolStripMenuItem.Click

 

        ' create a new name with the EXIF extension

        Dim newName As String = _

        System.IO.Path.GetFileNameWithoutExtension(CurrentFile)

        newName = newName + ".exif"

 

        Try

 

            ' save the file as a EXIF

            img.Save(newName, ImageFormat.Exif)

            CurrentFile = newName

            picContainer.Image = Image.FromFile(CurrentFile)

            Me.Text = "Watermark Utility: " + CurrentFile.ToString()

 

        Catch

 

            MessageBox.Show("Failed to save image to EXIF.", "Error", _

            MessageBoxButtons.OK, MessageBoxIcon.Error)

 

            Return

 

        End Try

 

        MessageBox.Show("Image file saved to " + newName.ToString(), _"Image Saved", MessageBoxButtons.OK,

                         MessageBoxIcon.Information)

 

    End Sub 

 

    Private Sub gIFFileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles

                        gIFFileToolStripMenuItem.Click

 

        ' create a new name with the GIF extension

        Dim newName As String = _

        System.IO.Path.GetFileNameWithoutExtension(CurrentFile)

        newName = newName + ".gif"

 

        Try

 

            ' save the file as a GIF

            img.Save(newName, ImageFormat.Gif)

            CurrentFile = newName

            picContainer.Image = Image.FromFile(CurrentFile)

            Me.Text = "Watermark Utility: " + CurrentFile.ToString()

 

        Catch

 

            MessageBox.Show("Failed to save image to GIF.", "Error", _

            MessageBoxButtons.OK, MessageBoxIcon.Error)

 

            Return

 

        End Try

 

        MessageBox.Show("Image file saved to " + newName.ToString(), _"Image Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)

 

    End Sub
 

    Private Sub jPEGFileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles

    jPEGFileToolStripMenuItem.Click

 

        ' create a new name with the JPEG extension

        Dim newName As String = _

        System.IO.Path.GetFileNameWithoutExtension(CurrentFile)

        newName = newName + ".jpg"

 

        Try

 

            ' save the file as a JPG

            img.Save(newName, ImageFormat.Jpeg)

            CurrentFile = newName

            picContainer.Image = Image.FromFile(CurrentFile)

            Me.Text = "Watermark Utility: " + CurrentFile.ToString()

 

        Catch

 

            MessageBox.Show("Failed to save image to JPEG.", "Error", _

            MessageBoxButtons.OK, MessageBoxIcon.Error)

 

            Return

 

        End Try

 

        MessageBox.Show("Image file saved to " + newName.ToString(), _"Image Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)

 

    End Sub

 

    Private Sub pNGFileToolStripMenuItem_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles pNGFileToolStripMenuItem.Click

 

        ' create a new name with the PNG extension

        Dim newName As String = _

        System.IO.Path.GetFileNameWithoutExtension(CurrentFile)

        newName = newName + ".png"

 

        Try

 

            ' save the file as a png

            img.Save(newName, ImageFormat.Png)

            CurrentFile = newName

            picContainer.Image = Image.FromFile(CurrentFile)

            Me.Text = "Watermark Utility: " + CurrentFile.ToString()

 

        Catch

 

            MessageBox.Show("Failed to save image to PNG.", "Error", _

            MessageBoxButtons.OK, MessageBoxIcon.Error)

 

            Return

 

        End Try

 

        MessageBox.Show("Image file saved to " + newName.ToString(), _"Image Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)

 

    End Sub

 

    Private Sub tIFFFileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles

    tIFFFileToolStripMenuItem.Click

 

        ' create a new name with the tif extension

        Dim newName As String = _

        System.IO.Path.GetFileNameWithoutExtension(CurrentFile)

        newName = newName + ".tif"

 

        Try

 

            ' save the file as a tif

            img.Save(newName, ImageFormat.Tiff)

            CurrentFile = newName

            picContainer.Image = Image.FromFile(CurrentFile)

            Me.Text = "Watermark Utility: " + CurrentFile.ToString()

 

        Catch

 

            MessageBox.Show("Failed to save image to TIF.", "Error", _

            MessageBoxButtons.OK, MessageBoxIcon.Error)

 

            Return

 

        End Try

 

        MessageBox.Show("Image file saved to " + newName.ToString(), _"Image Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)

 

    End Sub

 

    Private Sub windowsMetafileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles

    windowsMetafileToolStripMenuItem.Click

 

        ' create a new name with the WMF extension

        Dim newName As String = _

        System.IO.Path.GetFileNameWithoutExtension(CurrentFile)

        newName = newName + ".wmf"

 

        Try

 

            ' save the file as a WMF

            img.Save(newName, ImageFormat.Wmf)

            CurrentFile = newName

            picContainer.Image = Image.FromFile(CurrentFile)

            Me.Text = "Watermark Utility: " + CurrentFile.ToString()

 

        Catch

 

            MessageBox.Show("Failed to save image to WMF.", "Error", _

            MessageBoxButtons.OK, MessageBoxIcon.Error)

 

            Return

 

        End Try

 

        MessageBox.Show("Image file saved to " + newName.ToString(), _"Image Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)

 

    End Sub

 

#End Region
 

Following the image conversion routines, the next region of code is used to perform the actual water marking functions.

#Region "Watermarking"

    ''' <summary>

    ''' Display the watermark as it would appear after

    ''' the watermark were saved to the file

    ''' </summary>

    ''' <remarks></remarks>

    Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click

 

        ' Update the applicaton by reloading the image

        picContainer.Image = Image.FromFile(CurrentFile)

 

        Dim opac As Integer = 0

        Dim sOpacity As String = cboOpacity.Text

 

        ' Determine the opacity of the watermark

        Select Case (sOpacity)

            Case "100%"

                opac = 255 ' 1 * 255

            Case "75%"

                opac = 191 ' .75 * 255

            Case "50%"

                opac = 127 ' .5 * 255

            Case "25%"

                opac = 64  ' .25 * 255

            Case "10%"

                opac = 25  ' .10 * 255

            Case Else

                opac = 127 ' default at 50%; .5 * 255

        End Select

 

        ' Get a graphics context

        Dim g As Graphics = Graphics.FromImage(picContainer.Image)

 

        ' Create a solid brush to write the watermark text on the image

        Dim myBrush As Brush

        myBrush = New SolidBrush(Color.FromArgb(opac, myWatermarkColor))

 

        ' Calculate the size of the text

        Dim sz As SizeF = g.MeasureString(txtWaterMark.Text, myFont)

 

        ' Creae a copy of variables to keep track of the

        ' drawing position (X,Y)

        Dim X As Integer

        Dim Y As Integer

 

        ' Set the drawing position based on the users

        ' selection of placing the text at the bottom or

        ' top of the image

        If (optTop.Checked = True) Then

            X = Convert.ToInt32((picContainer.Image.Width - sz.Width) / 2)

            Y = Convert.ToInt32((picContainer.Top + sz.Height) / 2)

        Else

            X = Convert.ToInt32((picContainer.Image.Width - sz.Width) / 2)

            Y = Convert.ToInt32((picContainer.Image.Height - sz.Height))

        End If

 

        ' draw the water mark text

        g.DrawString(txtWaterMark.Text, myFont, myBrush, New Point(X, Y))

 

    End Sub

 

    Private Sub btnFont_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFont.Click

 

        ' default the current font and color to that

        ' used in the watermark textbox

        fontDialog1.ShowColor = True

        fontDialog1.Font = txtWaterMark.Font

        fontDialog1.Color = txtWaterMark.ForeColor

 

        If fontDialog1.ShowDialog() <> DialogResult.Cancel Then

 

            myFont = fontDialog1.Font

            myWatermarkColor = fontDialog1.Color

            txtWaterMark.Font = fontDialog1.Font

            txtWaterMark.ForeColor = fontDialog1.Color

 

        End If

    End Sub

 

#End Region

That wraps up the sum of the code needed to drive the Watermarking utility. With the code provided, it is possible to convert from one image format to another and to apply a user defined watermark on an existing image file.

Summary

While this article was written to demonstrate an approach to watermarking an image file in the context of a Win Foms utility application; the code used in the project could be modified to batch process image files, or to watermark image files programmatically and without user intervention. Even used as a utility, the application could have some value to anyone wishing to watermark or caption an image file before exposing the image file on the web.

 


Login to add your contents and source code to this article
 About the author
 
Scott Lysle
Freelance software developer residing in Alabama. Bachelors, Masters Degrees from Wichita State University. I spent the first half of my career working on aircraft controls and displays and in that time I worked on the cockpits for the OH-58 AHIP, the AH-1W, the V-22, the F-22, the C-130J, the C-5 AMP, AWACS, JPATS, and a few others. Since 1997 I have been largely involved with Windows and web development, GIS application development, consumer electronics development (embedded linux/java), but still sometimes work on aircraft and military projects, the most recent of which was the presidential transport helicopter. I tend to work primarily with C/C++, Java, VB, and C#.
Looking for C# Consulting?
C# Consulting is founded in 2002 by the founders of C# Corner. Unlike a traditional consulting company, our consultants are well-known experts in .NET and many of them are MVPs, authors, and trainers. We specialize in Microsoft .NET development and utilize Agile Development and Extreme Programming practices to provide fast pace quick turnaround results. Our software development model is a mix of Agile Development, traditional SDLC, and Waterfall models.
Click here to learn more about C# Consulting.
 
Introducing MaxV - one click. infinite control. Hyper-V Hosting from MaximumASP.
Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Dynamic PDF
ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications.
SQL and .NET performance profiling in one place
Investigate SQL and .NET code side-by-side with ANTS Performance Profiler 6, so you can see which is causing the problem without switching tools.
Go.NET
Build custom interactive diagrams, network, workflow editors, flowcharts, or software design tools. Includes many predefined kinds of nodes, links, and basic shapes. Supports layers, scrolling, zooming, selection, drag-and-drop, clipboard, in-place editing, tooltips, grids, printing, overview window, palette. 100% implemented in C# as a managed .NET Control. Document/View/Tool architecture with many properties&events. Optional automatic layout.
Dundas Software
Dundas Chart for .NET is the most advanced .NET charting package available today.  With an extremely complete feature set, elegant architecture and easy implementation, Dundas Chart can quickly add advanced Charting functionality to enhance and transform ASP.NET and Windows Forms applications.  Whether you are implementing charting into internal projects, or building applications for clients, Dundas Chart offers advanced technology and advanced results to get the most out of data.
60 FREE UI Controls from DevExpress
Register for your FREE copy on over 60 free presentation controls from DevExpress - Absolutely Free-of-Charge without any royalties or distribution costs. Visit Devexpress.com/60 today. Free controls include advanced lists box, dropdown calendar, rich text edit, spin edit, tab control and so much more!

DevExpress engineers feature rich presentation controls and reporting tools for WinForms, ASP.NET, WPF, and Silverlight. Our technologies help you build your best, see complex software with greater clarity and deliver compelling business solutions for Windows and the web in the shortest possible time.
Clickatell's SMS Gateway
Clickatell's Developer Solutions allow you to SMS enable any website or application via a range of API's. Learn More about our API connections.
Free access to .NET Memory Management video
Everything you need to know about Garbage Collection, Temporary Objects, Fragmentation, Finalization and common causes of memory leaks in .NET. Watch the video here.
Microsoft Visual Studio 2010
Visualize your workspace with new multiple monitor support, powerful Web development, new SharePoint support with tons of templates and Web parts, and more accurate targeting of any version of the .NET Framework. Get set to unleash your creativity.
Nevron Chart for .NET 2010.1 Now Available
The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
Developer-Ready ASP.NET 2.0 Web Hosting with 3 MONTHS FREE
Now supporting .NET 3.0 Framework with Windows Workflow Foundation, Windows Communication Foundation (WCF), Windows Presentation Foundation (WPF), windows CardSpace (WCS)! Providing more flexibility for Developers with Web Services Support and a User/Permission Manger. Also supporting MS SQL 2005/2000 with Real-Time Backups, FREE Automated Attach .MDF Tool, FREE SQL Restore and Shrink SQL DB Tools, and SQL
Read the Top 10 Books for Microsoft Developers, 15 Days FREE
Read the Top 10 Books for Microsoft Developers, 15 Days FREE
Try Safari Books Online - 15 Days FREE + 15% Off for 1 Year
Try Safari Books Online - 15 Days FREE + 15% Off for 1 Year
 
 Post a Feedback, Comment, or Question about this article
Subject:
Comment:
Become a Sponsor
 Comments
asa by watches On July 11, 2010
n general Hogan are made from very flexible materials and have a rubber sole. When they first entered the market Hogan scarpe donna were quite simple but the growing popularity has increased competition and spurned a number of new designs. While other styles of hogan donna such as casual loafers or dress shoes tend to come in one generic mould, Hogan uomo are designed to support and contrast an athlete s foot.
Reply | Email | Delete | Modify | 

 Hosted by MaximumASP  |  Found a broken link?  |  Contact Us  |  Terms & conditions  |  Privacy Policy  |  Site Map  |  Suggest an Idea  |  Media Kit
Current Version: 5.2010.8.14
 © 2010  contents copyright of their authors. Rest everything copyright Mindcracker. All rights reserved.