Click here to Skip to main content
15,867,997 members
Articles / Programming Languages / Visual Basic
Article

Image Batch Resizer

Rate me:
Please Sign up or sign in to vote.
4.78/5 (62 votes)
26 Sep 20042 min read 283.7K   4.7K   138   64
A simple utility to quickly resize images

Introduction

I came back from my holidays, with tons of photos taken with my new digital camera. Normally, I prefer to take pictures using the best quality and resolution, and this - of course - implies having bigger files to manage.

Often, at a good resolution, a single photo in JPG format takes more than 1 Mb, and this is not so comfortable if you want to send your pictures to your friends via email, or to put them on a web site. You have to reduce the quality of your pictures, resampling them at a lower resolution.

I had this need of resizing pictures and - even if the world is full of image processing software capable of doing that - I decided to write my little piece of code to do it in VB.NET.

How the utility works

The utility I wrote is very simple: given an "input" folder, it looks for JPG pictures in that folder and - one by one - it takes them, reduces their sizes by a specified factor, and save them in a given "output" folder.

Image Batch Resizer user interface

In the "normal mode", when you press the "GO" button, the input folder is scanned, each single picture found is shown in the preview box and you are asked about the conversion of that specific picture. Under the preview box you can find the filename and the size of the image (size on disk, dimensions X and Y, aspect ratio).

The conversion can be done also in "batch mode" (that is: without human intervention, converting all the pictures found in the input folder) if you check the "Batch processing" checkbox before pressing the "GO" button. To stop the batch processing while running, just uncheck the option to revert to "normal mode".

Something about the code

The core reducing functionality is inside the Reduce() subroutine, specifically in this line of code:

VB.NET
img = New Bitmap(img, New Size(img.Size.Width * factor, 
  img.Size.Height * factor))

Notice that the reducing factor is applied to both picture dimensions (to preserve the aspect ratio); so, if the original picture's size is [x,y] and the reducing factor is F, the resulting image is sized [x*F,y*F] (hence its area is reduced by F*F).

It's easy to modify this formula to obtain different resizing behaviors. For example, if the set of the original pictures is not homogeneous in the sizes, you could want to reduce them not by a fixed factor, but to a specified size (regardless the original size).

The Reduce() subroutine also contains some lines of code used to compute the file size of the resulting JPG picture. This computation is simply done looking at the size of a MemoryStream on which the image is saved in JPG format:

VB.NET
Dim SizeKb As String
Dim ms As New MemoryStream()
img.Save(ms, Imaging.ImageFormat.Jpeg)
SizeKb = (ms.Length \ 1024).ToString() & "Kb "

A last thing to notice in the Image Batch Resizer utility is the persistence of the configuration settings between working sessions, accomplished by the use of the ConfigOpt class (described in a previous article of mine).

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Technical Lead
Italy Italy
I was born in 1970.

My first computer experience dates back to early 80s, with a Sinclair ZX81.
From that time on, as many "friends" say, my IT-illness has increased year by year.

I graduated in Electronic Engineering and earned the following Microsoft certifications:
MCP, MCT, MCDBA, MCSD, MCAD, MCSD for .NET (early achiever).

I worked in IT as a developer, a teacher, a consultant, a technical writer, a technical leader.
IT knowledge applied to real life is my primary interest and focus.

Comments and Discussions

 
GeneralRe: Resize pdf files Pin
preetraj17-Jul-06 21:30
preetraj17-Jul-06 21:30 
GeneralAsk for GIS software Pin
nobita3x13-Mar-05 16:11
nobita3x13-Mar-05 16:11 
GeneralRe: Ask for GIS software Pin
Alberto Venditti14-Mar-05 7:21
Alberto Venditti14-Mar-05 7:21 
GeneralError in saving file back to disk Pin
toffee_paul7-Mar-05 9:01
toffee_paul7-Mar-05 9:01 
GeneralRe: Error in saving file back to disk Pin
Alberto Venditti7-Mar-05 23:38
Alberto Venditti7-Mar-05 23:38 
GeneralRe: Error in saving file back to disk Pin
budbjames9-Jan-06 10:37
budbjames9-Jan-06 10:37 
GeneralReduce by fixed size Pin
toffee_paul2-Mar-05 23:25
toffee_paul2-Mar-05 23:25 
GeneralRe: cReduce by fixed size Pin
Alberto Venditti3-Mar-05 21:45
Alberto Venditti3-Mar-05 21:45 
Nice question, Paul.

To achieve your goal you could simply modify the Reduce() subroutine, substituting the following lines:

img = New Bitmap(img, New Size(img.Size.Width * factor, img.Size.Height * factor))
picPhoto.Image = img

with:

If img.Size.Width > 999 Then
  img = New Bitmap(img, New Size(999, img.Size.Height * 999 / img.Size.Width))
End If
If img.Size.Height > 999 Then
  img = New Bitmap(img, New Size(img.Size.Width * 999 / img.Size.Height, 999))
End If
picPhoto.Image = img


In this way:

  • if your image has a width above 999, it will be resized to fit in a 999-width picture (mantaining the aspect ratio);

  • if your image (eventually already reduced because of width) has a height above 999, it will be resized to fit in a 999-height picture (mantaining the aspect ratio).



Of course, you have to keep in mind two things:

  1. the "factor" parameter (previously used to reduce the picture by a linear factor) is now ignored, because you're not reducing by a fixed factor but by a target dimension (so, as an obvious consequence, the various processed pictures will be reduced by a variable reducing factor);

  2. pictures having width and height below 999 pixels will not be reduced at all.


GeneralRe: Reduce by fixed size Pin
toffee_paul7-Mar-05 8:50
toffee_paul7-Mar-05 8:50 
GeneralRe: Reduce by fixed size Pin
Alberto Venditti7-Mar-05 23:27
Alberto Venditti7-Mar-05 23:27 
GeneralRe: Reduce by fixed size Pin
Mambo073-May-06 14:35
Mambo073-May-06 14:35 
GeneralVery Nice Pin
Steve W Brookes19-Jan-05 16:09
Steve W Brookes19-Jan-05 16:09 
GeneralJust what I need ! Pin
Mauricio Ritter14-Nov-04 3:04
Mauricio Ritter14-Nov-04 3:04 
GeneralCode Source of Doevents Pin
Trankil3-Nov-04 23:54
Trankil3-Nov-04 23:54 
GeneralRe: Code Source of Doevents Pin
Alberto Venditti4-Nov-04 0:08
Alberto Venditti4-Nov-04 0:08 
GeneralRe: Code Source of Doevents Pin
Trankil4-Nov-04 4:37
Trankil4-Nov-04 4:37 
GeneralRe: Code Source of Doevents Pin
ftrbinom,oiunomin26-Nov-04 10:19
ftrbinom,oiunomin26-Nov-04 10:19 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.