Skip to content

Instantly share code, notes, and snippets.

@zuf
Created February 3, 2012 09:04
Show Gist options
  • Save zuf/1729169 to your computer and use it in GitHub Desktop.
Save zuf/1729169 to your computer and use it in GitHub Desktop.
Small ruby script that try to optimize JPEG and PNG images with external tools like jpgcrush or optipng
#!/usr/bin/env ruby
require 'rubygems'
@optimize_image_bin = 'optimize_image_bin' # from google pagespeed sdk
@pngout = 'pngout'
@pngcrush = 'pngcrush'
@optipng = 'optipng'
@advpng = 'advpng'
@jpegtran = 'jpegtran'
@jpegoptim = 'jpegoptim'
@jpgcrush = 'jpgcrush'
def optimize_block(file)
before_size = File.size file
if block_given?
yield(file)
end
after_size = File.size file
before_size - after_size
end
def optimize_with_pagespeed(file)
optimize_block(file) do
`#{@optimize_image_bin} '#{file}' '#{file}'`
end
end
def optimize_with_pngout(file)
optimize_block(file) do
`#{@pngout} '#{file}'`
end
end
def optimize_with_pngcrush(file)
optimize_block(file) do
`#{@pngcrush} -brute -q '#{file}' '#{file}'`
end
end
def optimize_with_optipng(file)
optimize_block(file) do
`#{@optipng} -o7 -quiet '#{file}'`
end
end
def optimize_with_advpng(file)
optimize_block(file) do
`#{@advpng} -z -4 -q '#{file}'`
end
end
def optimize_with_jpegtran(file)
optimize_block(file) do
`#{@jpegtran} -copy none -optimize -progressive '#{file}'`
end
end
def optimize_with_jpgcrush(file)
optimize_block(file) do
`#{@jpgcrush} '#{file}'`
end
end
def optimize_with_jpegoptim(file)
optimize_block(file) do
`#{@jpegoptim} --strip-all '#{file}'`
end
end
def optimize_png(file)
optimize_with_pagespeed(file)
optimize_with_pngout(file)
optimize_with_advpng(file)
optimize_with_pngcrush(file)
optimize_with_optipng(file)
end
def optimize_jpg(file)
optimize_with_jpegtran(file)
optimize_with_jpegoptim(file)
optimize_with_jpgcrush(file)
optimize_with_pagespeed(file)
end
if ARGV[0] && ARGV.size==1
pngs = Dir.glob(File.join(ARGV[0], '**', '*.{png,PNG}'))
pngs_count = pngs.size
puts "PNG count: #{pngs_count}"
pngs_size_before = pngs.inject(0){|i, f| i += File.size(f)}
puts "PNG size old: #{pngs_size_before} bytes"
pngs.each_with_index {|f, i| optimize_png f; print("\r #{i+1}/#{pngs_count}"); STDOUT.flush}
print "\r"
puts
pngs_size_after = pngs.inject(0){|i, f| i += File.size(f)}
puts "PNG size new: #{pngs_size_after} bytes (after optimizations)\tSaved: #{pngs_size_before - pngs_size_after} bytes"
jpegs = Dir.glob(File.join(ARGV[0], '**', '*.{jpg,JPG,jpeg,JPEG}'))
jpegs_count = jpegs.size
puts "JPEG count: #{jpegs_count}"
jpegs_size_before = jpegs.inject(0){|i, f| i += File.size(f)}
puts "JPEG size old: #{jpegs_size_before} bytes"
jpegs.each_with_index {|f, i| optimize_jpg f; print("\r #{i+1}/#{jpegs_count}"); STDOUT.flush}
print "\r"
puts
jpegs_size_after = jpegs.inject(0){|i, f| i += File.size(f)}
puts "JPEG size new: #{jpegs_size_after} bytes (after optimizations)\tSaved: #{jpegs_size_before - jpegs_size_after} bytes"
else
puts "Usage optimize_images <directory with images>"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment