Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Visual Basic 2008 in PictureBox zeichnen wie in Paint mit Stift

Frage Entwicklung Visual Studio

Mitglied: 69304

69304 (Level 1)

08.02.2010 um 11:36 Uhr, 10928 Aufrufe, 7 Kommentare

Hallo!

Für ein Projekt brauche ich eine Möglichkeit, in eine PictureBox o.ä. zeichnen zu können wie in Paint mit dem Stift-Werkzeug.

Es geht darum, dass eine Unterschrift "digitalisiert" werden kann. Ferner soll per Grafiktablett unterschrieben werden können. Das Image soll dann als BMP, etc. nachher weiter verarbeitet werden können.

Ich habe schon sowas was ich brauche im Netz gerfunden, bloß ist dies zu langsam.

Hat hier jemand eine Idee, oder Vorschlag?


Mein Code, den ich bis jetzt verwende, der aber zu langsam ist..:

01.
Public Class frmUnterschrift 
02.
 
03.
    Dim xStart, yStart, xEnd, yEnd As Integer 
04.
    Dim Drawbitmap As Bitmap 
05.
    Dim Drawgraphics As Graphics 
06.
    Dim myPen As New Pen(Color.BlueViolet, 3) 
07.
    Dim myColor As Color = Color.Black 
08.
    Dim myBrush As New Drawing.SolidBrush(Color.Black) 
09.
    Dim myBrushWidth As Integer 
10.
    Dim ContinuousFlag As Boolean 
11.
 
12.
    Private Sub drawMyline() 
13.
        PictureBox1.Image = Drawbitmap 
14.
        Drawgraphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality 
15.
        Drawgraphics.DrawLine(myPen, xStart, yStart, xEnd, yEnd) 
16.
    End Sub 
17.
 
18.
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
19.
        Drawbitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height) 
20.
        Drawgraphics = Graphics.FromImage(Drawbitmap) 
21.
        PictureBox1.Image = Drawbitmap 
22.
        Drawgraphics.Clear(Color.White) 
23.
        myBrushWidth = 4 
24.
    End Sub 
25.
 
26.
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown 
27.
        xStart = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4) 
28.
        yStart = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31) 
29.
        'to do continuous drawing, enable this line  
30.
        'drawMyline() 
31.
        If RadioButton1.Checked = True Then 
32.
            ContinuousFlag = True 
33.
        End If 
34.
    End Sub 
35.
 
36.
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove 
37.
        If ContinuousFlag Then 
38.
            Drawgraphics.SmoothingMode = Drawing2D.SmoothingMode.None 
39.
            Drawgraphics.FillEllipse(myBrush, e.X, e.Y, myBrushWidth, myBrushWidth) 
40.
            PictureBox1.Image = Drawbitmap 
41.
        End If 
42.
    End Sub 
43.
 
44.
    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp 
45.
        xEnd = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4) 
46.
        yEnd = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31) 
47.
 
48.
        If RadioButton1.Checked Then 
49.
            ContinuousFlag = False 
50.
        Else 
51.
            drawMyline() 
52.
        End If 
53.
    End Sub 
54.
 
55.
End Class
Mitglied: MonoTone
09.02.2010 um 17:11 Uhr
HI rbrixel

Hier mal ein C&P Code von mir aus Internet schnipseln.
Du brauchst PictureBox1, Combobox1 + 2.
Kannst ja aber selber nach deinen belieben ändern bzw siehst ja eh.

01.
Public Class Form1 
02.
    Private MouseD As Boolean 
03.
    Private Col As Color 
04.
    Private NewPen As Pen 
05.
    Private bmp As Bitmap 
06.
    Private Plist As List(Of Point) 
07.
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown 
08.
        MouseD = True 
09.
        Plist.Add(New Point(e.X, e.Y)) 
10.
        NewPen = New Pen(Col, CSng(ComboBox2.SelectedItem)) 
11.
    End Sub 
12.
    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp 
13.
        If MouseD Then 
14.
            MouseD = False 
15.
            Using gr = Graphics.FromImage(bmp) 
16.
 
17.
                Draw(gr) 
18.
                gr.Flush() 
19.
            End Using 
20.
            Plist.Clear() 
21.
            PictureBox1.Invalidate() 
22.
        End If 
23.
    End Sub 
24.
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove 
25.
        If MouseD Then 
26.
            Plist.Add(New Point(e.X, e.Y)) 
27.
            PictureBox1.Invalidate() 
28.
        End If 
29.
    End Sub 
30.
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint 
31.
        If MouseD Then Draw(e.Graphics) 
32.
    End Sub 
33.
    
34.
    Private Sub Draw(ByVal g As Graphics) 
35.
        If Plist.Count > 0 Then 
36.
            Dim bs As Byte() = New Byte(Plist.Count - 1) {} 
37.
            bs(0) = CByte(System.Drawing.Drawing2D.PathPointType.Start) 
38.
            For a = 1 To Plist.Count - 1 
39.
                bs(a) = CByte(System.Drawing.Drawing2D.PathPointType.Line) 
40.
                g.DrawPath(NewPen, New System.Drawing.Drawing2D.GraphicsPath(Plist.ToArray, bs)) 
41.
            Next 
42.
        End If 
43.
    End Sub 
44.
 
45.
    Private Function GetColors() As List(Of String) 
46.
        Dim colors As New List(Of String)() 
47.
        Dim colorNames As String() = [Enum].GetNames(GetType(KnownColor)) 
48.
        For Each colorName As String In colorNames 
49.
            Dim knownColor As KnownColor = DirectCast([Enum].Parse(GetType(KnownColor), colorName), KnownColor) 
50.
            If knownColor > knownColor.Transparent Then 
51.
                colors.Add(colorName) 
52.
            End If 
53.
        Next 
54.
        Return colors 
55.
    End Function 
56.
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
57.
        PictureBox1.BackColor = Color.White 
58.
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height) 
59.
        PictureBox1.Image = bmp 
60.
        Plist = New List(Of Point) 
61.
        Me.DoubleBuffered = True 
62.
        For Each c As String In GetColors() 
63.
            ComboBox1.Items.Add(c) 
64.
        Next 
65.
        For a = 1 To 25 
66.
            ComboBox2.Items.Add(a.ToString) 
67.
        Next 
68.
        ComboBox1.SelectedItem = ComboBox1.Items(0) 
69.
        ComboBox2.SelectedItem = ComboBox2.Items(0) 
70.
    End Sub 
71.
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged 
72.
        Col = Color.FromName(ComboBox1.SelectedItem) 
73.
    End Sub 
74.
    
75.
End Class
gruss Mono
Bitte warten ..
Mitglied: 69304
09.02.2010 um 22:00 Uhr
Funktioniert wunderbar!!!

Danke Mono!

Habs bissl abgeändert und läuft supi!
Bitte warten ..
Mitglied: 69304
10.02.2010 um 09:17 Uhr
Jetzt ist mir aber gerade aufgefallen, als ich das Bild mit image.save speichern will, bekommen ich nur ein schwarzes BMP.

Hat hier jmd noch eine Lösung, dass das Bild richtig abgespeichert wird?
Bitte warten ..
Mitglied: 69304
16.02.2010 um 00:28 Uhr
Hallo!

Hab das Problem weiter einkreisen können ^^

Wenn ich das Image so abspeicher...

01.
bmp.Save("D:\test_neu.bmp", Imaging.ImageFormat.Bmp)
... bekomme ich einfach ein schwarzes Bitmap.

Wenn ich aber die Pen-Color auf Weiss und den Background auf Black stelle, bekomme ich auch ein solches Bild.

Wie könnte ich den Hintergrund weiss einfärben, weil...

01.
PictureBox1.BackColor = Color.White
... bringts ned...
Bitte warten ..
Mitglied: MonoTone
17.02.2010 um 10:48 Uhr
probier mal:

01.
Dim img As Image = Image.FromHbitmap(CType(Me.PictureBox1.Image, _ 
02.
              Bitmap).GetHbitmap) 
03.
img.save("C:myPic.png") 'oder als bmp/jpg mit Imaging.imageformat.bmp/jpeg etc
bin grad auch ein bissi ratlos, so geht es aber zumindest halbwegs... ich such mal ob ich noch eine bessere lösung finde
hab ne bessere:

füge im load event ein:

01.
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
02.
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height) 
03.
        Using gr as Graphics = Graphics.FromImage(bmp) 
04.
            gr.Clear(Color.White) 'das ist der Punkt 
05.
        End Using 
06.
        PictureBox1.Image = bmp 
07.
        Plist = New List(Of Point) 
08.
        Me.DoubleBuffered = True 
09.
'.. 
10.
end sub 
11.
Private Sub Savebutton_click '.. 
12.
bmp.Save("C:\MyPic.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) 
13.
end sub

So sollte es gehen.

Gruss mono
Bitte warten ..
Mitglied: 69304
17.02.2010 um 10:59 Uhr
Ich habe festgestellt, dass der Background einfach "leer" ist.

Wenn ich z.B. den Hintergrund aus einem Bitmap vorlade mit...

01.
Try 
02.
            bmp = Image.FromFile(PROGRAMMPFAD & "\bg.bmp") 
03.
            PictureBox1.Image = bmp 
04.
            Plist = New List(Of Point) 
05.
            Me.DoubleBuffered = True 
06.
        Catch ex As Exception 
07.
            FehlerMeldung("Hintergrund fehlt! " & ex.Message, True) 
08.
 
09.
        End Try
...bekomme ich ein korrektes Image beim speichern.

Wenn ich deinen Vorlag übernehme, Monotone, dann sieht das Bild total hässlich mit einem blauen Hintergrund aus.
Bitte warten ..
Mitglied: 69304
17.02.2010 um 11:12 Uhr
OK, ich habs ;)

01.
Public Function NeuesBild() As Boolean 
02.
        Try 
03.
            bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height) 
04.
            Using gr = Graphics.FromImage(bmp) ' Hintergrund weiss füllen 
05.
                gr.FillRectangle(Brushes.White, 0, 0, PictureBox1.Width, PictureBox1.Height) 
06.
            End Using 
07.
 
08.
            PictureBox1.Image = bmp 
09.
 
10.
            Plist = New List(Of Point) 
11.
            Me.DoubleBuffered = True 
12.
            Return True 
13.
        Catch ex As Exception 
14.
            MsgBox("Hintergrund fehlt! " & ex.Message) 
15.
            Return False 
16.
        End Try 
17.
End Function
Diese Funktion kann dann beim Form-Load ausgeführt werden!

01.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
02.
        NeuesBild() 
03.
End Sub

Danke an Monotone!
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Visual Studio
gelöst Remotedienst prüfen mit Visual Basic (1)

Frage von flyingmichael zum Thema Visual Studio ...

Visual Studio
Mit Visual Basic auf Shopware 5 API zugreifen (9)

Frage von SmogKiel zum Thema Visual Studio ...

Visual Studio
gelöst Pastebin auslesen mit Visual Basic? (2)

Frage von UltraZz zum Thema Visual Studio ...

Basic
gelöst Mit Visual Basic Batch Datei öffnen (26)

Frage von Flodsche zum Thema Basic ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...