Chris
Chris

Reputation: 73

VB.NET - Create An Image - Resize But Add Background To Remainding Space

I am attempting to resize an image to specific dimensions but I do not want to stretch the image at all if it is smaller than my chosen dimensions. Instead I want to add a black background around the image area that is not in use.

I think that the easiest way to do this would be to create a new image of my desired dimensions & set a background color & then add & center the image over top of this background.

I have created a Bitmap using:

Dim bmp As New Drawing.Bitmap(500, 500)
Dim grap As Drawing.Graphics = Drawing.Graphics.FromImage(bmp)
grap.Clear(Drawing.Color.Black)

From this point I got a bit lost on how to complete the process, all that is needed is to add an image to the Bitmap & center.

Any ideas would be much appretiated

Upvotes: 1

Views: 6022

Answers (3)

jalbertoa
jalbertoa

Reputation: 88

By using just the ratio of the larger axis, you can fail in the situation that the other ratio forces you to exceed the other axis. i.e. 1400x1000 ->( i want to fit into 300x200) -> but just with 1400/300 ratio (4.6) the result will be 300x214. I think it would be useful to check both ratios and continue with the bigger

Upvotes: 0

Chris
Chris

Reputation: 73

Ended up using:

' Load Image
Dim FilePath As String = "testimage.jpg"
Dim OriginalImage As New Bitmap(FilePath)

' Resize Image While Maintaining Aspect Ratio
Dim aspectRatio As Double
Dim newHeight As Integer
Dim newWidth As Integer
Dim maxWidth As Integer = 500
Dim maxHeight As Integer = 500

' Calculate Size
If OriginalImage.Width > maxWidth Or OriginalImage.Height > maxHeight Then
    If OriginalImage.Width >= OriginalImage.Height Then ' image is wider than tall
        newWidth = maxWidth
        aspectRatio = OriginalImage.Width / maxWidth
        newHeight = CInt(OriginalImage.Height / aspectRatio)
    Else ' image is taller than wide
        newHeight = maxHeight
        aspectRatio = OriginalImage.Height / maxHeight
        newWidth = CInt(OriginalImage.Width / aspectRatio)
    End If
Else ' if image is not larger than max then increase size
    If OriginalImage.Width > OriginalImage.Height Then
        newWidth = maxWidth
        aspectRatio = OriginalImage.Width / maxWidth
        newHeight = CInt(OriginalImage.Height / aspectRatio)
    Else
        newHeight = maxHeight
        aspectRatio = OriginalImage.Height / maxHeight
        newWidth = CInt(OriginalImage.Width / aspectRatio)
    End If

    ' Below keeps original height & width instead of resizing to fit new height / width
    ' newWidth = OriginalImage.Width
    ' newHeight = OriginalImage.Height
End If

Dim newImg As New Bitmap(OriginalImage, CInt(newWidth), CInt(newHeight)) '' blank canvas
' Create New Bitmap
Dim bmp As New Drawing.Bitmap(500, 500)
Dim grap As Drawing.Graphics = Drawing.Graphics.FromImage(bmp)
grap.Clear(Drawing.Color.Black)
Dim g As Graphics = Graphics.FromImage(bmp)

' Calculate Points To Insert Resized Image
Dim InsertX As Integer
Dim InsertY As Integer

' Calculate Y Axis Point
If newImg.Height >= 500 Then
    InsertY = 0
Else
    InsertY = CInt(((500 - newImg.Height) / 2))
End If

' Calculate X Axis Point
If newImg.Width >= 500 Then
    InsertX = 0
Else
    InsertX = CInt(((500 - newImg.Width) / 2))
End If

' Add Resized Image To Canvas
g.DrawImage(newImg, New Point(InsertX, InsertY))

Upvotes: 1

Science_Fiction
Science_Fiction

Reputation: 3433

I haven't tested this but it looks like you've pretty much got what you want but:

grap.Clear(Drawing.Color.Black)

Will surely just wipe the entire graphic back to black.

Try doing the clear prior to drawing image:

Graphics pic = this.CreateGraphics();
pic.Clear(Color.Black);
pic.DrawImage(img, new Point(center));

Upvotes: 2

Related Questions