65.9K
CodeProject 正在变化。 阅读更多。
Home

简单的图像映射实用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (5投票s)

2006年10月26日

8分钟阅读

viewsIcon

54334

downloadIcon

878

本文介绍了一种构建简单图像映射工具的便捷方法,该工具可用于从图像文件或直接从网页中标记和存储像素坐标点。

引言

本文介绍了一种构建简单图像映射工具的便捷方法,该工具可用于从图像文件或直接从网页中标记和存储像素坐标点。该应用程序能够捕获一组点,并允许用户命名并将使用该工具建立的点集保存到文本文件中。

该应用程序可用于对图像进行数字化处理,通过收集图像中的关键特征点来实现。例如,如果用户想要收集模拟显示器上的尺寸和间距信息,以便定义创建该设备数字版本的方案,那么可以将该应用程序与设备1:1比例的图像结合使用,以确定在哪里绘制线条、添加文本和调整文本大小等。对于Web开发,该应用程序可以作为辅助工具,用于定义图像映射中区域的尺寸和形状。

在应用程序初始化时,用户可以选择两种操作模式之一:

  1. 直接将图像文件加载到应用程序中,或者,
  2. 设置应用程序的不透明度,以便用户可以看到应用程序下方的对象。

在任何一种情况下,一旦图像被加载或通过应用程序可见,用户就可以将鼠标移动到对象的边缘来查看任意点的坐标。如果用户想要捕获点并将其保存到文件中,可以右键单击应用程序以显示上下文菜单。菜单包含“开始录制”和“停止录制”选项。选择“开始录制”后,应用程序将存储每个选定点的坐标,直到用户选择“停止录制”。选择“停止录制”后,应用程序将显示一个保存文件对话框,并捕获用户在该对话框中定义的 the file name and path,这些信息将用于存储到目前为止保存的所有点集。

图 1 图像映射工具使用中

图 2 应用程序存储点的文本文件输出

入门

要开始,请解压缩附件并将解决方案加载到Visual Studio 2005中。检查解决方案资源管理器,注意项目中包含的文件。

解决方案的内容显示它包含一个名为“ImageMapper”的单个项目。该项目包含一个名为“frmMain”的窗体类。frmMain.vb 类是项目中唯一的类。

快速查看引用会发现项目中只包含默认的类库。

代码:frmMain 类

frmMain 类包含应用程序中使用的所有代码。该类导入System.TextSystem.IO,它们用于将点数据存储到文本文件中。

窗体本身包含一个菜单,其中有以下选项:

  • 文件
    • 加载图像文件选项
    • 退出应用程序选项
  • 十字准星
    • 颜色选项
    • 可见性选项
  • Opacity
    • 100% 到 10% 选项

窗体还包含一个与图片框控件关联的上下文菜单,其内容为:

  • 开始录制
  • 停止录制
  • 取消

窗口包含一个图片框,其停靠属性设置为“填充”。该类还包含一个打开文件对话框、一个保存文件对话框、一个颜色对话框和一个工具提示。

在导入和类声明之后,应用程序中的第一部分代码是声明区域,其中包括以下变量声明:

#Region "Declarations"
    Private mCrosshairs As Boolean
    Private mLineColor As System.Drawing.Color
    Private mRecord As Boolean
    Private mPoints As SortedList
    Private mPointCount As Integer
#End Region
  • 十字准星变量用于确定是否在当前鼠标位置显示十字准星。如果变量设置为 false,则不会显示十字准星,用户将只看到标准的十字光标。如果变量设置为 true,用户将看到以鼠标指针当前位置为中心的整个屏幕十字准星。十字准星旨在帮助沿着边缘设置点。
  • 线条颜色变量用于存储用于绘制十字准星的颜色。
  • 记录变量用于确定应用程序是否存储用户左键单击的点。
  • 点变量是一个排序列表,用于在用户添加要保存的点时临时存储点集。
  • 点计数变量用于跟踪已保存在排序列表中的点的数量。

声明之后,应用程序中的下一段代码是窗体构造函数;此块用于在应用程序初始化时设置一些变量。该代码如下:

Public Sub New()

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

    mLineColor = Color.Crimson
    mPointCount = 0
    Me.DoubleBuffered = True
    mCrosshairs = True

End Sub

下一段代码是“加载图像文件”菜单选项的单击事件处理程序;该代码如下:

Private Sub LoadImageFileToolStripMenuItem_Click(ByVal sender _
        As System.Object, ByVal e As System.EventArgs) _
        Handles LoadImageFileToolStripMenuItem.Click

    Dim openFile As New System.Windows.Forms.OpenFileDialog
    openFile.DefaultExt = "bmp"
    openFile.Filter = "Bitmap File (*.bmp)|*.bmp" & _ 
                      "|Jpeg File (*.jpg)|*.jpg|Gif File 
    (*.gif)|*.gif"
    openFile.ShowDialog()

    If openFile.FileNames.Length > 0 Then
        Dim img As New Bitmap(openFile.FileName.ToString())
        PictureBox1.Image = img
        PictureBox1.Refresh()
    End If

End Sub

此代码用于将图像加载到应用程序的图片框控件中。该代码打开一个“打开文件”对话框,允许用户从文件系统中选择一个常用图像文件;一旦根据用户的选择定义了文件的名称和路径,应用程序将从该文件创建一个新的位图,并将图片框的图像属性设置为包含该图像。

文件中的下一项是文件菜单的“退出”选项;该代码足够简单:

Private Sub ExitToolStripMenuItem_Click(ByVal sender _
        As System.Object, ByVal e As System.EventArgs) _
        Handles ExitToolStripMenuItem.Click

    Application.Exit()

End Sub

下一个代码块是十字准星菜单的“颜色”菜单选项的单击事件处理程序,其代码如下:

Private Sub ColorToolStripMenuItem_Click(ByVal sender As _
        System.Object, ByVal e As System.EventArgs) _
        Handles ColorToolStripMenuItem.Click

    ColorDialog1.AllowFullOpen = True
    ColorDialog1.AnyColor = True
    ColorDialog1.FullOpen = True

    If (ColorDialog1.ShowDialog() = _
           Windows.Forms.DialogResult.OK) Then
        mLineColor = ColorDialog1.Color
    End If

End Sub

此代码块显示一个颜色对话框,允许用户选择一种颜色;然后将该颜色用于设置颜色变量的值。应用程序使用存储的颜色值来设置绘制十字准星时的颜色。

接下来是一个子程序,用于将不透明度菜单的所有子选项的复选标记设置为未选中;每当用户选择一个新的不透明度选项时,就会调用此子程序。

Private Sub ClearOpacityChecks()

    mnu100percent.Checked = False
    mnu90percent.Checked = False
    mnu80percent.Checked = False
    mnu70percent.Checked = False
    mnu60percent.Checked = False
    mnu50percent.Checked = False
    mnu40percent.Checked = False
    mnu30percent.Checked = False
    mnu20percent.Checked = False
    mnu10percent.Checked = False

End Sub

接下来是用于设置应用程序不透明度的菜单选项;菜单中暴露的每种不透明度设置都有类似的选项:

Private Sub mnu100percent_Click(ByVal sender As _
        System.Object, ByVal e As System.EventArgs) _
        Handles mnu100percent.Click

    ClearOpacityChecks()
    mnu100percent.Checked = True
    Me.Opacity = 1

End Sub

在不透明度设置之后,下一段代码是可见性菜单项的单击事件处理程序;此处理程序用于将十字准星变量设置为 true 或 false,并更新菜单选项的复选标记。如果十字准星变量设置为 false,则不会显示十字准星;如果设置为 true,则会在鼠标指针的当前位置绘制十字准星。

Private Sub VisibilityToolStripMenuItem_Click(ByVal sender _
        As System.Object, ByVal e As System.EventArgs) _
        Handles VisibilityToolStripMenuItem.Click

    If VisibilityToolStripMenuItem.Checked = True Then
        VisibilityToolStripMenuItem.Checked = False
        mCrosshairs = False
    Else
        VisibilityToolStripMenuItem.Checked = True
        mCrosshairs = True
    End If

End Sub

应用程序中的下一个子程序用于处理图片框控件的鼠标单击事件:

Private Sub PictureBox1_MouseClick(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles PictureBox1.MouseClick

    If mRecord = True Then
        If e.Button = Windows.Forms.MouseButtons.Left Then
            'record
            mPoints.Add("Point " & _
                    mPointCount.ToString(), _
                    e.X & ", " & e.Y)
            mPointCount += 1
        End If
    End If

End Sub

此子程序首先检查记录变量以确定是否记录点,如果应用程序处于记录模式,则该子程序会检查用户是否单击了图片框控件的左键,然后将一个包含点 X 和 Y 值的字符串添加到点集中。排序列表的键属性设置为包含文本“Point”以及当前点计数;添加点后,点计数器变量递增到下一个整数值。

在此代码之后,类中的下一项是图片框控件的鼠标移动事件处理程序:

Private Sub PictureBox1_MouseMove(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles PictureBox1.MouseMove

    PictureBox1.Refresh()
    ToolTip1.SetToolTip(PictureBox1, e.X & ", " & e.Y)
    Dim pPen As New Pen(mLineColor, 1)

    Try
        If mCrosshairs Then
            Dim g As Graphics
            g = PictureBox1.CreateGraphics
            g.DrawLine(pPen, e.X, PictureBox1.Top, _
                       e.X, PictureBox1.Height)
            g.DrawLine(pPen, PictureBox1.Left, _
                       e.Y, PictureBox1.Width, e.Y)
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message.ToString(), _
                        "Error", MessageBoxButtons.OK, _
                        MessageBoxIcon.Exclamation)
    End Try

End Sub

此事件处理程序用于在与图片框控件关联的工具提示中显示当前的鼠标位置。此外,如果十字准星变量设置为 true,则处理程序会使用十字准星颜色变量的颜色值在屏幕上绘制十字准星。

下一个子程序是上下文菜单的“开始录制”选项单击事件处理程序:

Private Sub StartRecordingToolStripMenuItem_Click(ByVal sender _
        As System.Object, ByVal e As System.EventArgs) _
        Handles StartRecordingToolStripMenuItem.Click

    If mRecord = True Then
        MessageBox.Show("The application is " & _ 
                        "already recording.", "Recording", _
                        MessageBoxButtons.OK, _
                        MessageBoxIcon.Exclamation)
        Exit Sub
    End If

    mRecord = True
    mPoints = New SortedList
    mPoints.Clear()
    mPointCount = 0

End Sub

此处理程序检查应用程序是否已处于记录模式;如果是,则会通知用户并退出子程序。如果应用程序未处于记录模式,则应用程序将进入记录模式,实例化并清空一个排序列表,并将点计数器变量设置为零。

下一个子程序用于处理上下文菜单的“停止录制”选项单击事件处理程序:

Private Sub StopRecordingToolStripMenuItem_Click(ByVal sender As _
        System.Object, ByVal e As System.EventArgs) _
        Handles StopRecordingToolStripMenuItem.Click

    If mRecord = False Then
        MessageBox.Show("Recording is not current enabled.", _
                   "Recording", MessageBoxButtons.OK, _
                   MessageBoxIcon.Exclamation)
        Exit Sub
    End If

    mRecord = False
    Dim strPoints As String = ""
    Dim fname As String = ""

    SaveFileDialog1.Filter = "Text Files|*.txt|All Files|*.*"
    SaveFileDialog1.DefaultExt = "txt"
    If SaveFileDialog1.ShowDialog() = _
              Windows.Forms.DialogResult.OK Then
        fname = SaveFileDialog1.FileName
    End If

    Try
        Dim de As DictionaryEntry
        For Each de In mPoints
            strPoints = strPoints + de.Value.ToString()_
                                  + Environment.NewLine
        Next

        Dim SW As StreamWriter
        Dim FS As FileStream
        FS = New FileStream(fname, FileMode.Create)
        SW = New StreamWriter(FS)
        SW.Write(strPoints)
        SW.Close()
        FS.Close()

        MessageBox.Show("Point file saved as " & _
                        fname.ToString())

    Catch ex As Exception

        MessageBox.Show(ex.Message.ToString(), _
                   "Error", MessageBoxButtons.OK, _
                   MessageBoxIcon.Exclamation)

    End Try

End Sub

此子程序检查应用程序是否处于记录模式,如果不是,则通知用户并退出子程序。如果应用程序正在录制,则禁用录制,声明一个用于包含整个点列表的字符串变量,并声明一个用于保存文件名和路径的字符串变量。

然后通过迭代排序列表并将每对点添加到其内容中来填充字符串。

接下来,显示一个“保存文件”对话框,并用于捕获用户定义的路径和文件名。定义路径和文件名后,创建流写入器和文件流,并将点字符串保存到文件中。

应用程序中的最后一个子程序用于取消录制。此处理程序用于释放任何现有的点集并禁用录制;该代码块如下:

Private Sub CancelToolStripMenuItem_Click(ByVal sender As _
        System.Object, ByVal e As System.EventArgs) _
        Handles CancelToolStripMenuItem.Click

    Me.mRecord = False
    Me.mPoints.Clear()

End Sub

摘要

此示例旨在提供一个工具的示例,该工具可用作各种用途的图像映射的建设性补充。我已将类似应用程序用于多种目的,包括为应用程序中渲染类似显示器而对图像进行映射,以及验证设计是否符合基于像素坐标的图像目录规范。

© . All rights reserved.