Whenever I get photos from others after a trip, the photos tend to be huge. Who the heck needs 20 megapixels anyway? Four is plenty for me so the first thing I want to do to make the photos easier to deal with is resample them. I use ImageMagick’s convert
for this. convert
wants a percentage reduction. Here’s how you can calculate what percentage to use:
pc = ((desiredMP / ((originalpixelcountinx * originalpixelcountiny) / 1000000.)) ** 0.5) * 100
Of course, it’s helpful if all the photos that you have are the same size. I use jhead
to see the original size of the photo, but since we’re already talking ImageMagick here, identify
works as well. So, if your original photo size was 5312×2988 and you want four megapixel output, then you calculate the percentage for convert
like this:
>>> ((4 / ((5312 * 2988) / 1000000.)) ** 0.5) * 100
50.20080321285141
>>>
50% for these photos. Then you can run a little bash script to do the conversion:
for img in `ls *.JPG`
do
convert -sample 50% $img small/$img
echo "$img converted"
done
The reduced photos are written into a directory called “small” that must already exist. Now you can delete those huge photos since we’re not making billboards. 🙂
Update September 18, 2018:
I quickly wrote this code to deal with a directory of photos of varying sizes. The code still needs some work.
#!/usr/bin/python
import os
from PIL import Image
def shellquote(s):
return "'" + s.replace("'", "'\\''") + "'"
sInDir = '.'
sFileType = 'jpg'
iTargetMP = 4
sOutDir = 'small'
lName = os.listdir(sInDir)
for sName in lName:
if (sName[-3:].lower() == sFileType):
mImage = Image.open(sName)
iWidth, iHeight = mImage.size
fPC = ((iTargetMP / ((iWidth * iHeight) / 1000000.)) ** 0.5) * 100
iPC = int(fPC)
#fix the filenames
sInName = shellquote(sName)
sOutName = shellquote('%s/%s' % (sOutDir, sName))
if (iPC <= 99):
sLine = 'convert -sample %i%% ' % iPC
else:
sLine = 'cp '
sLine += '%s %s' % (sInName, sOutName)
print sLine