当前位置:编程学习 > C#/ASP.NET >>

图片标记

本人在做一个图片浏览器,主要功能是需要对加载进来的图片,进行添加标记(划矩形并获得矩形面积,直线,椭圆,箭头,测量角度,文字标示等),并能够对添加进来的每个标记可以选定删除、拖动等,有没有大大可以给个思路或参考实例,新人虚心求教,求大大门赐教。 图片处理 图片浏览器 --------------------编程问答-------------------- 先将你要的功能细分吧 picturebox是你必要的控键

我之前有设计一支将图片读进来后 可以将图片切离

然后可以移动图片的功能 你参看看看吧 

标尺没有设计 你自己上网找找这部分的代码 

将这些功能拼拼溴溴你要的程序就出来了

Imports System.Drawing
Imports System.Drawing.Imaging

Public Class Form1


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Dim g As Graphics = Graphics.FromImage(bmp)
        g.Clear(Color.White)
        PictureBox1.Image = bmp
        c = 4

    End Sub
    Dim mdp, mdq As Point  '座標點
    Dim x, y, c As New Integer  '取得x,y座標


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

        PictureBox1.Invalidate()
            mdp = e.Location '起始點
        c += 1

    End Sub


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

        Dim G As Graphics = PictureBox1.CreateGraphics
        mdq = e.Location
        Dim NEWBITMAP As New Bitmap(PictureBox1.Image)
        Dim cloneBitmap As Bitmap
        Dim newpic As New Form2

        Dim xpoint, ypoint As Integer '左上角座標點
        c += 1



        If c = 3 Then

           
            xpoint = Math.Min(mdp.X, mdq.X)
            ypoint = Math.Min(mdp.Y, mdq.Y)


            Dim format As PixelFormat = NEWBITMAP.PixelFormat
            Dim W, H As Integer
            W = Math.Abs(mdq.X - mdp.X)
            H = Math.Abs(mdq.Y - mdp.Y)
            Dim acpart As New Rectangle(xpoint, ypoint, W, H)

            If Not W = 0 And Not H = 0 Then

                cloneBitmap = NEWBITMAP.Clone(acpart, format)
                newpic.PictureBox1.Image = cloneBitmap
            End If

            With G
                .DrawLine(Pens.Black, mdp.X, mdp.Y, mdq.X, mdp.Y)
                .DrawLine(Pens.Black, mdp.X, mdp.Y, mdp.X, mdq.Y)
                .DrawLine(Pens.Black, mdp.X, mdq.Y, mdq.X, mdq.Y)
                .DrawLine(Pens.Black, mdq.X, mdp.Y, mdq.X, mdq.Y)
            End With
            newpic.Show()
            acpart = Nothing

            c = 1
        End If


        NEWBITMAP = Nothing
        newpic = Nothing
        G.Dispose()

    End Sub


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        x = mdp.X
        y = mdp.Y
        Me.Label1.Text = "起點座標X:" & x & "起點座標Y:" & y
        x = mdq.X
        y = mdq.Y
        Me.Label2.Text = "終點座標X:" & y & "終點座標Y:" & y

    End Sub


    Private Sub 檔案ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 檔案ToolStripMenuItem.Click
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            PictureBox1.Load(OpenFileDialog1.FileName)
            c = 0
        End If
    End Sub


End Class


Public Class Form2

    '处理图片拖动

    Private m_Leftx As Integer = 152
    Private m_Lefty As Integer = 0
    Dim m_MousePosX As Integer
    Dim m_MousePosY As Integer
    Dim m_DriftX As Integer
    Dim m_DriftY As Integer
    '缩放率
    Dim m_StrecthX As Double
    Dim m_StrecthY As Double
    'label起始相对于picturebox的位置
    Dim m_L_GW_RY_X As Integer
    Dim m_L_GW_RY_Y As Integer

    Dim m_L_STATION_ZF_X As Integer
    Dim m_L_STATION_ZF_Y As Integer
    '是否第一次缩放
    Dim m_L_FIRST As Boolean = True

    '当鼠标按下时,将鼠标变成手形,并且记录下当前鼠标的位置
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

        Me.Cursor = System.Windows.Forms.Cursors.Hand
        m_MousePosX = e.X
        m_MousePosY = e.Y

        'GetLabelPositon()

    End Sub
    '根据偏移量计算出的图片位置,重画图片
    Private Sub picturemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim myBit As New System.Drawing.Bitmap(PictureBox1.Image)

        Dim myPicGrh As System.Drawing.Graphics = Me.PictureBox1.CreateGraphics
        myPicGrh.Clear(Me.PictureBox1.BackColor)
        myPicGrh.DrawImageUnscaled(myBit, m_Leftx - 152, m_Lefty)
        ' StretchLabel()
        myBit.Dispose()
        myPicGrh.Dispose()

    End Sub

    '处理鼠标按键抬起的事件,根据鼠标按下时保存的鼠标位置,和当前鼠标的位置,计算鼠标移动偏移量,借此调用移动图片的函数,移动图片
    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        m_DriftX = m_MousePosX - e.X
        m_DriftY = m_MousePosY - e.Y
        m_Leftx = m_Leftx - m_DriftX
        m_Lefty = m_Lefty - m_DriftY
        picturemove(sender, e)
        Me.Cursor = System.Windows.Forms.Cursors.Arrow

    End Sub
End Class

--------------------编程问答--------------------
引用 1 楼 ctjh900801 的回复:
先将你要的功能细分吧 picturebox是你必要的控键

我之前有设计一支将图片读进来后 可以将图片切离

然后可以移动图片的功能 你参看看看吧 

标尺没有设计 你自己上网找找这部分的代码 

将这些功能拼拼溴溴你要的程序就出来了

Imports System.Drawing
Imports System.Drawing.Imaging

Public Class Form1


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Dim g As Graphics = Graphics.FromImage(bmp)
        g.Clear(Color.White)
        PictureBox1.Image = bmp
        c = 4

    End Sub
    Dim mdp, mdq As Point  '座標點
    Dim x, y, c As New Integer  '取得x,y座標


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

        PictureBox1.Invalidate()
            mdp = e.Location '起始點
        c += 1

    End Sub


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

        Dim G As Graphics = PictureBox1.CreateGraphics
        mdq = e.Location
        Dim NEWBITMAP As New Bitmap(PictureBox1.Image)
        Dim cloneBitmap As Bitmap
        Dim newpic As New Form2

        Dim xpoint, ypoint As Integer '左上角座標點
        c += 1



        If c = 3 Then

           
            xpoint = Math.Min(mdp.X, mdq.X)
            ypoint = Math.Min(mdp.Y, mdq.Y)


            Dim format As PixelFormat = NEWBITMAP.PixelFormat
            Dim W, H As Integer
            W = Math.Abs(mdq.X - mdp.X)
            H = Math.Abs(mdq.Y - mdp.Y)
            Dim acpart As New Rectangle(xpoint, ypoint, W, H)

            If Not W = 0 And Not H = 0 Then

                cloneBitmap = NEWBITMAP.Clone(acpart, format)
                newpic.PictureBox1.Image = cloneBitmap
            End If

            With G
                .DrawLine(Pens.Black, mdp.X, mdp.Y, mdq.X, mdp.Y)
                .DrawLine(Pens.Black, mdp.X, mdp.Y, mdp.X, mdq.Y)
                .DrawLine(Pens.Black, mdp.X, mdq.Y, mdq.X, mdq.Y)
                .DrawLine(Pens.Black, mdq.X, mdp.Y, mdq.X, mdq.Y)
            End With
            newpic.Show()
            acpart = Nothing

            c = 1
        End If


        NEWBITMAP = Nothing
        newpic = Nothing
        G.Dispose()

    End Sub


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        x = mdp.X
        y = mdp.Y
        Me.Label1.Text = "起點座標X:" & x & "起點座標Y:" & y
        x = mdq.X
        y = mdq.Y
        Me.Label2.Text = "終點座標X:" & y & "終點座標Y:" & y

    End Sub


    Private Sub 檔案ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 檔案ToolStripMenuItem.Click
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            PictureBox1.Load(OpenFileDialog1.FileName)
            c = 0
        End If
    End Sub


End Class


Public Class Form2

    '处理图片拖动

    Private m_Leftx As Integer = 152
    Private m_Lefty As Integer = 0
    Dim m_MousePosX As Integer
    Dim m_MousePosY As Integer
    Dim m_DriftX As Integer
    Dim m_DriftY As Integer
    '缩放率
    Dim m_StrecthX As Double
    Dim m_StrecthY As Double
    'label起始相对于picturebox的位置
    Dim m_L_GW_RY_X As Integer
    Dim m_L_GW_RY_Y As Integer

    Dim m_L_STATION_ZF_X As Integer
    Dim m_L_STATION_ZF_Y As Integer
    '是否第一次缩放
    Dim m_L_FIRST As Boolean = True

    '当鼠标按下时,将鼠标变成手形,并且记录下当前鼠标的位置
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

        Me.Cursor = System.Windows.Forms.Cursors.Hand
        m_MousePosX = e.X
        m_MousePosY = e.Y

        'GetLabelPositon()

    End Sub
    '根据偏移量计算出的图片位置,重画图片
    Private Sub picturemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim myBit As New System.Drawing.Bitmap(PictureBox1.Image)

        Dim myPicGrh As System.Drawing.Graphics = Me.PictureBox1.CreateGraphics
        myPicGrh.Clear(Me.PictureBox1.BackColor)
        myPicGrh.DrawImageUnscaled(myBit, m_Leftx - 152, m_Lefty)
        ' StretchLabel()
        myBit.Dispose()
        myPicGrh.Dispose()

    End Sub

    '处理鼠标按键抬起的事件,根据鼠标按下时保存的鼠标位置,和当前鼠标的位置,计算鼠标移动偏移量,借此调用移动图片的函数,移动图片
    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        m_DriftX = m_MousePosX - e.X
        m_DriftY = m_MousePosY - e.Y
        m_Leftx = m_Leftx - m_DriftX
        m_Lefty = m_Lefty - m_DriftY
        picturemove(sender, e)
        Me.Cursor = System.Windows.Forms.Cursors.Arrow

    End Sub
End Class


感谢ctjh900801的帮助,但还不是我想要的功能,图片切割的我知道怎么做,但我需要的是对到入的图片进行标识,类似在图片上涂鸦,只是希望涂鸦部分能选中和指定删除。
还有哪位大神能帮助小弟下,现在就差这部分功能了。 --------------------编程问答-------------------- > 标记可以选定删除、拖动等

那你就得自己定义标记了,例如每个标记应有:
类别
位置
颜色
内容

等各种数据,然后每个图片对应一个标记列表,
显示图片后再显示每个标记。

然后处理鼠标事件,增加对标记的选中,移动,修改等操作。



--------------------编程问答-------------------- 那就用getpixl 和setpixl 这两个API去做吧 不过如果要照顾效率问题那就是另

一门学问了

呵呵
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,