Start a new project.

Click on the main form, properties -> WindowState: change to Maximized
Add a picturebox to the main form, properties -> Dock: change to Fill

On the top-right of the form add a button, text: Load Image,  Anchor: change to Top, Right
Below the button, near the form's right border, add a label, text: change to 0%,
On the left of the label add another button, text: change to +, while size should be: 25, 25
On the left of the "+" button add a TrackBar from the toolbox.
Go to properties -> property "Maximum": change to 300 -> this is the number of possible "tick" positions the trackbar will have. Change "TickStyle" to none.
On the left of the trackbar add another button, text: change to -, size change to 25, 25

Change the "Anchor" property of the label, "+" and "-" buttons and trackbar to: Top, Right
Add an "OpenFileDialog" control to the program.

Double click on the load image button. Outside the sub declare this:
Private a As String = "1"

Inside the load image sub add this:
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
a = OpenFileDialog1.FileName
PictureBox1.Image = Image.FromFile(a)
TrackBar1.Value = 100
Label1.Text = "100%"
End If

- we send the chosen image to the picturebox. We will only use the "a" variable to shorten the code somewhat. Once the image is in the picturebox, the trackbar and label receive the 100% size value.

Double click on the trackbar control, add this inside:
Label1.Text = TrackBar1.Value & "%"
If TrackBar1.Value > 0 And a <> "1" Then
PictureBox1.Image = New Bitmap(Image.FromFile(a), Image.FromFile(a).Width * (TrackBar1.Value / 100), Image.FromFile(a).Height * (TrackBar1.Value / 100))
Else
PictureBox1.Image = Nothing
End If

The default event that triggers the code from the trackbar sub is, obviously, the trackbar scrolling, so sliding the trackbar left or right is going to resize the image.

Label1.Text = TrackBar1.Value & "%"  - when we scroll, the label is going to change and display the current size of the image in percentage value.
If TrackBar1.Value > 0 And a <> "1" Then  - it's best that we have a condition disallowing the trackbar to create an image at 0% size which would cause a program crash. If the value becomes zero, the picturebox becomes empty. "a" must not have the initial value of 1, which means that the trackbar will only be using the resizing code if we have previously chosen a file.
PictureBox1.Image = New Bitmap(...) - we create a new image by using "New Bitmap". During creation we give the image new properties: it gets a new width and a new height depending on the current TrackBar position. The picturebox gets directly updated with the new image

Always loading a new image when changing image size will result in giving us a relatively good quality in the newly created image. Taking the image from the picturebox directly (rather than from the hard drive) and then resizing it up and down while "repainting it" with various program functions will end up decreasing the image quality. It is, however, a quicker resizing operation. Slow resizing speed can become noticeable on high resolution large image files.

Double click on the "-" button, inside the sub add:
If TrackBar1.Value > 0 Then
TrackBar1.Value = TrackBar1.Value - 1
TrackBar1_Scroll(sender, e)
End If

Double click on the "+" button, inside the sub add:
If TrackBar1.Value < 300 Then
TrackBar1.Value = TrackBar1.Value + 1
TrackBar1_Scroll(sender, e)
End If

- now we can use the plus and minus buttons for resizing.

It would be nice if we could make the background of the trackbar transparent, but that is not possible in the current version of visual basic.
Add another button to the program below the taskbar control, text: Save Image,  anchor: Top, Right
Add a SaveFileDialog from the toolbox to the system tray.

Double click the save image button, add this inside:
SaveFileDialog1.Filter = "Images(*.jpg)|*.jpg"
If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
PictureBox1.Image.Save(SaveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg)
End If

- this will allow us to choose a save location for our resized image. The filter will be applied in the Save File prompt.

Code:


    Public Class Form1

    Private a As String = "1"

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    a = OpenFileDialog1.FileName
    PictureBox1.Image = Image.FromFile(a)
    TrackBar1.Value = 100
    Label1.Text = "100%"
    End If
    End Sub

    Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
    Label1.Text = TrackBar1.Value & "%"
    If TrackBar1.Value > 0 And a <> "1" Then
    PictureBox1.Image = New Bitmap(Image.FromFile(a), Image.FromFile(a).Width * (TrackBar1.Value / 100), Image.FromFile(a).Height * (TrackBar1.Value / 100))
    Else
    PictureBox1.Image = Nothing
    End If
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    If TrackBar1.Value > 0 Then
    TrackBar1.Value = TrackBar1.Value - 1
    TrackBar1_Scroll(sender, e)
    End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    If TrackBar1.Value < 300 Then
    TrackBar1.Value = TrackBar1.Value + 1
    TrackBar1_Scroll(sender, e)
    End If
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    SaveFileDialog1.Filter = "Images(*.jpg)|*.jpg"
    If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
    PictureBox1.Image.Save(SaveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg)
    End If
    End Sub

    End Class


Resizing with the trackbar should work.

Below the Save image button add another button, text: Crop Image.
Below the this button add a label, erase all text. Remember the name of the label, should be Label2
Below the label add 2 more buttons, text for the first one is: Crop, text for the second one is: Cancel
Inside the properties window change the visibility of both of this 2 buttons to: false.
You will have to change the anchor of all the 3 new buttons and label to: Top, Right
Add a timer to the program.

Double click the "Crop Image" button. Before we write inside the sub, declare this outside:
Private nn As Graphics
Private x1 As Integer
Private y1 As Integer
Private x2 As Integer
Private y2 As Integer

Inside the "Crop Image" sub:
nn = PictureBox1.CreateGraphics()
Label2.Text = "! Crop is on !"
Button7.Visible = True

- we will use the "nn" variable to draw inside the picturebox. The label will be informing the user that the process of cropping has begun. The "Cancel" button is made visible in that moment.

The picturebox should have the same size as the client area of the application. Double click on the picturebox to go the sub, add this:
If Button7.Visible = True Then
x1 = PointToClient(Cursor.Position).X
y1 = PointToClient(Cursor.Position).Y
Timer1.Start()
Button6.Visible = False
End If

- the first click made after we start cropping is going to give us the starting location of the copped image, then the timer is started. On the second mouse click button6 will appear, so a person can then choose to press the button or make a new cropping selection in the picturebox instead. We make the button6 disappear inside this sub when the person chooses to make a new selection.
If Button7.Visible = True Then - this "if" statement is required so that we only start the code of the picturebox sub after we have pressed the "Crop Image" button. Otherwise a person could do that at any moment and the program would then crash.

Double click Timer1 in the system tray, and add this in the sub:
Refresh()
x2 = PointToClient(Cursor.Position).X - x1
y2 = PointToClient(Cursor.Position).Y - y1
nn.DrawRectangle(Pens.Black, x1, y1, x2, y2)

- the timer will be painting a rectangle during every tick depending on our mouse cursor location. The program is now waiting for the second mouse click.

We now go back to the picturebox sub and, at the start, before the "if" statement we insert the next program step:
If Timer1.Enabled = True Then
Timer1.Stop()
Button6.Visible = True 
Exit Sub
End If

- second mouse click stops the timer, gives us our last drawn rectangle (crop selection) and the "Crop" button appears.

In the design page, double click the "Cancel" button, add this to the sub:
Refresh()
Button6.Visible = False
Button7.Visible = False
Label2.Text = ""

- "cancel" removes our last drawn rectangle, removes the buttons and resets the label. Since button7 is no longer visible, the picturebox sub cannot begin it's operations.

Double click the "Crop" button. Add to the sub:
Dim i As Image = New Bitmap(x2, y2)
Dim bb As Graphics = Graphics.FromImage(i)
bb.DrawImage(PictureBox1.Image, 0, 0, New Rectangle(x1, y1, x2, y2), GraphicsUnit.Pixel)
PictureBox1.Image = i
Button7_Click(sender, e)

- first we create a new image "i" that will store our desired crop selection from the picturebox image. We adjust it to have the same size like the selection for convenience.
Dim bb As Graphics = Graphics.FromImage(i)  - the "bb" variable will be used for changing the "i" image
bb.DrawImage(...) - the "DrawImage" function first takes the image from the picturebox, then takes the specified "New Rectangle(x1, y1, x2, y2)" section from it and inserts it into "i" on coordinates 0, 0.
GraphicsUnit.Pixel - we need to choose the smallest graphical unit that is going define our new image, we obviously have chosen pixels
After we get what we need from the picturebox image and "draw" that into the "i" image, we need to insert the "i" image into the picturebox:  PictureBox1.Image = i
Button7_Click(sender, e) - when we are done cropping, we use the code from the "cancel" button to reset the starting conditions in the program.

Final code:

    Public Class Form1

    Private a As String = "1"

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    a = OpenFileDialog1.FileName
    PictureBox1.Image = Image.FromFile(a)
    TrackBar1.Value = 100
    Label1.Text = "100%"
    End If
    End Sub

    Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
    Label1.Text = TrackBar1.Value & "%"
    If TrackBar1.Value > 0 And a <> "1" Then
    PictureBox1.Image = New Bitmap(Image.FromFile(a), Image.FromFile(a).Width * (TrackBar1.Value / 100), Image.FromFile(a).Height * (TrackBar1.Value / 100))
    Else
    PictureBox1.Image = Nothing
    End If
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    If TrackBar1.Value > 0 Then
    TrackBar1.Value = TrackBar1.Value - 1
    TrackBar1_Scroll(sender, e)
    End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    If TrackBar1.Value < 300 Then
    TrackBar1.Value = TrackBar1.Value + 1
    TrackBar1_Scroll(sender, e)
    End If
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    SaveFileDialog1.Filter = "Images(*.jpg)|*.jpg"
    If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
    PictureBox1.Image.Save(SaveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg)
    End If
    End Sub

    Private nn As Graphics
    Private x1 As Integer
    Private y1 As Integer
    Private x2 As Integer
    Private y2 As Integer

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    nn = PictureBox1.CreateGraphics()
    Label2.Text = "! Crop is on !"
    Button7.Visible = True
    End Sub

    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    If Timer1.Enabled = True Then
    Timer1.Stop()
    Button6.Visible = True
    Exit Sub
    End If
    If Button7.Visible = True Then
    x1 = PointToClient(Cursor.Position).X
    y1 = PointToClient(Cursor.Position).Y
    Timer1.Start()
    Button6.Visible = False
    End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Refresh()
    x2 = PointToClient(Cursor.Position).X - x1
    y2 = PointToClient(Cursor.Position).Y - y1
    nn.DrawRectangle(Pens.Black, x1, y1, x2, y2)
    End Sub

    Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    Refresh()
    Button6.Visible = False
    Button7.Visible = False
    Label2.Text = ""
    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    Dim i As Image = New Bitmap(x2, y2)
    Dim bb As Graphics = Graphics.FromImage(i)
    bb.DrawImage(PictureBox1.Image, 0, 0, New Rectangle(x1, y1, x2, y2), GraphicsUnit.Pixel)
    PictureBox1.Image = i
    Button7_Click(sender, e)
    End Sub
    End Class


Crop image then save it, see if that works.

Cropping a resized image might work, but resizing a cropped selection will not, since resizing constantly loads a new image from the hard drive with every TrackBar movement. The program would require some changes for that to be possible. I mainly wanted to show how to resize and crop images in this program.