Created
February 3, 2012 09:04
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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