DrawImage en freehand drawing

Status
Niet open voor verdere reacties.

The Mighty Atom

Terugkerende gebruiker
Lid geworden
22 mei 2008
Berichten
1.380
Dat drawing gebeuren in VB.NET is echt niet te bevatten.

Wat ik probeer te maken is een soort van zeer compact tekenprogramma, nog simpeler dan Paint, zou je kunnen zeggen.

Dit tekenen gebeurt in een picturebox genaamd pbPaintWindow.

Op dit moment wil ik twee vormen van drawing implementeren:

1. Een image op de pb tekenen (niet met pbPaintWindow.Image = Image.FromFile...etc)
2. Freehand tekenen.

Beide werken tot nu toe prima, maar niet in samenwerking met elkaar.
Als ik bijvoorbeeld eerst een image teken (met .DrawImage) en vervolgens met freehand wat lijnen teken, verdwijnt die image weer.

Ik heb ook een Clear button dat hele picturebox weer leegmaakt. Dit werkt ook niet helemaal zoals het moet. Als je freehand een paar lijnen tekent, en je klikt daarna op de Clear knop, dan verdwijnt alles weer. Teken ik daarna weer een paar lijnen, dan verschijnen alle lijnen die ik daarvoor had getekend ook weer.

Snap er geen fluit van.

Wie kan mij helpen ervoor te zorgen dat beide manieren van tekenen netje met elkaar kunnen samenwerken?

Nog een vraag:
Wanneer gebruikt je nou:
Dim img As Image
en wanneer:
Dim bm As Bitmap?

Wat is het verschil tussen Image en Bitmap? Een image is een image en een bitmap is een bitmap. Met andere woorden: een afbeelding. Toch? :(
 
Een rasterafbeelding of bitmap is een afbeelding in digitale vorm, waarbij van elke pixel de kleur wordt vastgelegd
Een image is een computerbestand waarin een exacte kopie van een opslagmedium, zoals een harde schijf.

Dus lijkt mij voor jouw dim Bitmap
 
Een image is een computerbestand waarin een exacte kopie van een opslagmedium, zoals een harde schijf.

Ja dat klopt, dat noem je een image. Maar ik bedoel natuurlijk image as in plaatje:

Code:
        Dim Afbeelding1 As Bitmap = Image.FromFile("Iets")
        Dim Afbeelding2 As Image = Image.FromFile("Iets")

Beide werken. Maar ik zie niet wanneer je nou een variable as Bitmap en wanneer als Image moet declareren, en nee, ik heb het natuurlijk niet over een hardeschijf kopie of een kopie van een ander opslagmedium. :)
 
Laatst bewerkt:
Oké daar zit geen verschil in een bitmap is eigenlijk voor een lage resolutie bedoeld.
Je tekent dan ook met blokjes.
En anders met een vector wat veel nauwkeuriger is.
Heb helaas geen ervaring met tekenen en kan je daar dus helaas niet helpen.
 
Zou het helpen als ik mn huidge code post? Misschien is de oplossing wel dichterbij dan je zou denken, het probleem is dat ik het niet zie. :P
 
Ok.

Ik heb deze vars als global:

Code:
    Dim gr As Graphics
    Dim img As Image

Deze subroutine tekent een image vanuit mn Resources in de picturebox:

Code:
  Private Sub btnDraw_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDraw.Click

        gr = pbPaintWindow.CreateGraphics
        img = My.Resources.bug
        gr.DrawImage(img, 200, 200, img.Width, img.Height)

    End Sub

Voor het freehand tekenen, heb ik deze berg code:


Code:
    Dim bm As New Bitmap(536, 487)
    Dim gr2 As Graphics = Graphics.FromImage(bm)

    Dim lstPoint As Point 'the last location of the mouse while drawing
    Dim mousedn As Boolean 'specifies the mouse is held down

    Private Sub pbPaintWindow_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles pbPaintWindow.MouseDown
        lstPoint = New Point(e.X, e.Y) 'record this position
        DoDot(lstPoint) 'draw a dot here
        mousedn = True 'mouse is down

        pbPaintWindow.Image = bm 'show new changes
    End Sub

    Private Sub DoDot(ByVal pnt As Point)
        Dim br As New SolidBrush(btnBrushColor.BackColor) 'setup brush with our brushcolor
        Dim size As Integer = tbBrushSize.Value

        pnt.X -= CLng(size / 2) 'adjust position of dot to be center of the mouse
        pnt.Y -= CLng(size / 2)
        Dim rect As New Rectangle(pnt, New System.Drawing.Size(size, size)) 'create the rectangle where dot will be drawn

        gr2.FillEllipse(br, rect)
    End Sub
    Private Sub DoLine(ByVal pnt1 As Point, ByVal pnt2 As Point)
        Dim pn As New Pen(btnBrushColor.BackColor, tbBrushSize.Value) 'setup pen with our brush color and thickness
        gr2.DrawLine(pn, pnt1, pnt2) 'draw the line between the two points
    End Sub

    Private Sub pbPaintWindow_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles pbPaintWindow.MouseUp
        mousedn = False
    End Sub

    Private Sub pbPaintWindow_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles pbPaintWindow.MouseMove

        If mousedn Then 'mouse is down
            Dim newpoint As New Point(e.X, e.Y)
            DoDot(newpoint) 'draw dot at this mouse position
            DoLine(lstPoint, newpoint) 'draw line between last mouse position and this one
            lstPoint = newpoint 'remember this point

            pbPaintWindow.Image = bm 'show new changes
        End If

    End Sub

Hopelijk kan je het probleem vinden. :)
 
deze componenten kan ik even niet thuis brengen.
btnBrushColor
tbBrushSize
zijn niet gedeclareerd
 
Ja sorry, ik wilde mn post nog editten om te zeggen wat die voorstellen, maar dat ging effe niet. :rolleyes:

btnBrushColor is een button die een colordialog laat zien om een kleur voor de brush te kiezen. De backcolor property van deze button krijgt dan de gekozen kleur.

tbBrushSize is een TrackBar control om de brush size te bepalen.
 
Wat een image hier voor?
img = My.Resources.bug

en is het de bedoeling dat je over de image heen kan tekenen?
 
Hier mee blijft je image staan.

Code:
 Private Sub btnDraw_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDraw.Click
        pbPaintWindow.BackgroundImage = My.Resources.bug
    End Sub

hier mee wis je de image
Code:
 pbPaintWindow.BackgroundImage = Nothing

Hoe je de freehand wis weet ik nog niet.:rolleyes:
 
Ik ben bang dat dat niet de oplossing is die ik zoek.

Wat je daar doet is de BackGroundImage property gebruiken om een image in te zetten, maar het is juist de bedoeling dat dat met .DrawImage gebeurt, zodat je er met freehand drawing overheen kan tekenen en dus de pixels van die image kan over tekenen/overheen tekenen.
 
A Ha Dus de image zelf bewerken.

je lieveheerstbeestje bv blauwe stippen geven.

oeps dan moet ik een andere kant op denken.
 
Heb wel in de gaten dat het tekenen in de picturebox geschied en niet in de afbeelding.
dus ben ik aan het zoeken hoe ik in de afbeelding kan tekenen .
ben nog wel even zoet denk ik nu laad je een plaatje en teken je in de picturebox.
 
Heb effe verder gekeken en volgens mij moet je één graphics object hebben voor zowel het freehand tekenen als het tekenen van een individuele image door middel van .DrawImage. Zeker weten doe ik dit niet en ik heb verder niet een idee hoe ik dat zou moeten doen. Misschien dat je het kan uitvogelen. :)
 
Ben heel wat aan het vogelen geweest.
Heb geen oplossing gevonden.
het editen van een afbeelding is toch wat ingewikkelder dan we dachten.
kan hier over ook niet veel vinden alles verwijst naar bestaande programma's.

geef het voorlopig op.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan