user2506643
user2506643

Reputation: 45

Saving a Drawing but not a Full Image in VB.net

I'm working on making a paint-esq image manipulator in VB.Net, and I'm still new to vb. I want the user to be able to upload an image and make adjustments to it, such as adding lines and text. I also want the user to be able to transfer the drawings and text they added to a different baseimage. For example, if the user draws a dog on top of a picture of a park, they can change it so the dog is on a street instead.

I've been messing with the idea of loading the image as the picturebox.backgroundImage, but running into difficulties changing the backgroundImage without reseting the drawings and with croping the image. I've also been dabling in having two pictureboxes with the one on top for drawings, but I'm running into transparency and cropping issues

Here is the code I'm using to establish my picturebox by setting the base image as .backgroundImage

Private Sub LoadImage(thisImage As Image)

    'we set the picturebox size according to image, we can get image width and height with the help of Image.Width and Image.height properties.
    img.BackgroundImage = thisImage 'c'
    img.Image = New Bitmap(thisImage.Width, thisImage.Height) 'c'

    img.BorderStyle = BorderStyle.FixedSingle
  End Sub

example of the image maniputlation

 Private Sub ButtonDone_Click(sender As Object, e As EventArgs) Handles ButtonDone.Click, DoneToolStripMenuItem.Click
    Cursor = Cursors.Default
    Select Case LCase(stateFlag)
        Case "header"
            'Reset stuff back to normal
            ButtonHeader.Text = "Header"
            stateFlag = ""
            Cancel_Button.Enabled = False

            'set up space to draw on the image
            Dim newBm As New Bitmap(img.Image.Width, img.Image.Height)

             ' First we define a rectangle with the help of already calculated points 
            Dim newGraphics As Graphics = Graphics.FromImage(newBM) ' create graphics 
            newGraphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
            newGraphics.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
            newGraphics.CompositingQuality = Drawing2D.CompositingQuality.HighQuality

            'set image attributes 
            newGraphics.DrawImage(img.Image, New Rectangle(0, 0, img.Image.Width + 1, img.Image.Height + 1), _
                      0, 0, img.Image.Width + 1, img.Image.Height + 1, GraphicsUnit.Pixel)
            'Draw Edges for header

            newGraphics.DrawLine(Pens.Black, startPoint.X, borderSize - 20, startPoint.X, borderSize - 50)
            newGraphics.DrawLine(Pens.Black, endPoint.X, borderSize - 20, endPoint.X, borderSize - 50)

            Dim drawFont As New Font("Times New Roman", 12)
            Dim drawBrush As New SolidBrush(Color.Black)
            Dim stringSize As SizeF = newGraphics.MeasureString(HeaderLabel.Text, drawFont)
            ' Draw header label inbetween the two edges.
            newGraphics.DrawString(HeaderLabel.Text, drawFont, drawBrush, (startPoint.X + endPoint.X) / 2 - (stringSize.Width / 2), borderSize - 45)

            img.Image = newBm
            PushUndo(img.Image.Clone)

End Sub

Upvotes: 1

Views: 644

Answers (1)

Piratica
Piratica

Reputation: 483

I would advise trying the following method to use one picturebox on top of the other, it is a lot simpler than some other methods. In your form load handler, do something like:

pctBackground.BackgroundImage = Bitmap.FromFile("park.jpg")
pctForeground.BackColor = Color.Transparent
pctForeground.Parent = pctBackground
pctForeground.Image = New Bitmap(pctForeground.ClientSize.Width, pctForeground.ClientSize.Height)

Then when you have drawn on the pctForeground, save it like:

pctForeground.Image.Save("dog_in_park.png", System.Drawing.Imaging.ImageFormat.Png)

Upvotes: 2

Related Questions