How to resize an image in C# to a certain hard-disk size?

pupeno picture pupeno · Aug 11, 2009 · Viewed 7.8k times · Source

How to resize an image an image in C# to a certain hard-disk size, like 2MiB? Is there a better way than trial and error (even if it's approximate, of course).

Any particular keywords to search for when trying to find the solution on the web?

Answer

Guffa picture Guffa · Aug 11, 2009

You can calculate an approximate information level for the image by taking the original image size divided by the number of pixels:

info = fileSize / (width * height);

I have an image that is 369636 bytes and 1200x800 pixels, so it uses ~0.385 bytes per pixel.

I have a smaller version that is 101111 bytes and 600x400 pixels, so it uses ~0.4213 bytes per pixel.

When you shrink an image you will see that it generally will contain slightly more information per pixel, in this case about 9% more. Depending on your type of images and how much you shrink them, you should be able to calculate an average for how much the information/pixel ration increases (c), so that you can calculate an approximate file size:

newFileSize = (fileSize / (width * height)) * (newWidth * newHeight) * c

From this you can extract a formula for how large you have to make an image to reach a specific file size:

newWidth * newHeight = (newFileSize / fileSize) * (width * height) / c

This will get you pretty close to the desired file size. If you want to get closer you can resize the image to the calculated size, compress it and calculate a new bytes per pixel value from the file size that you got.