diff --git a/Rakefile b/Rakefile index 2aee0dd..149d104 100644 --- a/Rakefile +++ b/Rakefile @@ -1,5 +1,5 @@ require 'rubygems' -require 'rake/gempackagetask' +require 'rubygems/package_task' require 'rake/testtask' require 'lib/image_squeeze' diff --git a/lib/image_squeeze.rb b/lib/image_squeeze.rb index 6f89f71..0bef1c8 100644 --- a/lib/image_squeeze.rb +++ b/lib/image_squeeze.rb @@ -13,6 +13,7 @@ require 'image_squeeze/processors/png_crush_processor' require 'image_squeeze/processors/jpeg_tran_progressive_processor' require 'image_squeeze/processors/jpeg_tran_non_progressive_processor' +require 'image_squeeze/processors/jpeg_optim_processor' require 'image_squeeze/processors/gifsicle_processor' require 'image_squeeze/processors/gif_to_png_processor' require 'image_squeeze/processors/optipng_processor' @@ -53,6 +54,27 @@ def initialize(options = {}) def self.default @processors = self.class.default_processors end + + def squeeze_dir(path, substantial = 0.03) + puts "filename,output_filename,bytes_saved,original_size,percent_savings,processor" + squeeze_dir_recursive(path,substantial) + end + + def squeeze_dir_recursive(path, substantial = 0.03) + if path.directory? + path.each_child {|p| squeeze_dir_recursive(p)} + else + r = squeeze(path) + if r + if r.percent_savings > substantial + finalize_result(r) + puts "#{r.filename},#{r.output_filename},#{r.bytes_saved},#{r.original_size},#{r.percent_savings * 100}%,#{r.processor}" + else + puts "-No substantial savings (#{r.percent_savings * 100}%) on #{r.filename}" + end + end + end + end def squeeze(filename) image_type = self.class.image_type(filename) @@ -66,7 +88,7 @@ def squeeze(filename) output_filename = tmp_filename(filename) processor_class.squeeze(filename, output_filename) output_file_size = File.size(output_filename) - result_options = { :filename => filename, :output_filename => output_filename, :bytes_saved => original_file_size - output_file_size, :output_extension => processor_class.output_extension } + result_options = { :processor => processor_class.to_s, :filename => filename, :output_filename => output_filename, :original_size => original_file_size, :bytes_saved => original_file_size - output_file_size, :output_extension => processor_class.output_extension } Result.new(result_options) end.sort @@ -113,6 +135,7 @@ def self.default_processors end processors << OptiPNGProcessor if ImageSqueeze::Utils.image_utility_available?('optipng', 'png') processors << GifsicleProcessor if ImageSqueeze::Utils.image_utility_available?('gifsicle', 'animated gif') + processors << JpegOptimProcessor if ImageSqueeze::Utils.image_utility_available?('jpegoptim', 'jpg') if ImageSqueeze::Utils.image_utility_available?('jpegtran', 'jpeg') processors << JPEGTranProgressiveProcessor processors << JPEGTranNonProgressiveProcessor diff --git a/lib/image_squeeze/processors/jpeg_optim_processor.rb b/lib/image_squeeze/processors/jpeg_optim_processor.rb new file mode 100644 index 0000000..658a996 --- /dev/null +++ b/lib/image_squeeze/processors/jpeg_optim_processor.rb @@ -0,0 +1,11 @@ +class ImageSqueeze + class JpegOptimProcessor < Processor + def self.input_type + JPEG + end + + def self.squeeze(filename, output_filename) + system("jpegoptim --strip-all --dest=#{output_filename} #{filename} > /dev/null") + end + end +end \ No newline at end of file diff --git a/lib/image_squeeze/processors/optipng_processor.rb b/lib/image_squeeze/processors/optipng_processor.rb index de7be30..d61e419 100644 --- a/lib/image_squeeze/processors/optipng_processor.rb +++ b/lib/image_squeeze/processors/optipng_processor.rb @@ -3,7 +3,8 @@ class OptiPNGProcessor < Processor def self.input_type PNG end - + + #i1 is interlaced, i0 is noninterlaced def self.squeeze(filename, output_filename) system("optipng -i1 -o7 #{filename} -out=#{output_filename} > /dev/null") end diff --git a/lib/image_squeeze/processors/png_crush_processor.rb b/lib/image_squeeze/processors/png_crush_processor.rb index 19d0e16..34989b2 100644 --- a/lib/image_squeeze/processors/png_crush_processor.rb +++ b/lib/image_squeeze/processors/png_crush_processor.rb @@ -3,7 +3,8 @@ class PNGCrushProcessor < Processor def self.input_type PNG end - + + #-rem alla will remove all known ancillary chunks def self.squeeze(filename, output_filename) system("pngcrush -rem alla -brute -reduce #{filename} #{output_filename} > /dev/null") end diff --git a/lib/image_squeeze/result.rb b/lib/image_squeeze/result.rb index cfd3f81..ce95440 100644 --- a/lib/image_squeeze/result.rb +++ b/lib/image_squeeze/result.rb @@ -1,12 +1,14 @@ class ImageSqueeze class Result - attr_reader :filename, :output_filename, :bytes_saved, :output_extension + attr_reader :processor, :filename, :output_filename, :bytes_saved, :output_extension, :original_size def initialize(options = {}) @filename = options[:filename] @output_filename = options[:output_filename] @bytes_saved = options[:bytes_saved] @output_extension = options[:output_extension] + @original_size = options[:original_size] + @processor = options[:processor] end def optimized? @@ -16,5 +18,10 @@ def optimized? def <=>(other) self.bytes_saved <=> other.bytes_saved end + + def percent_savings + @bytes_saved.to_f/@original_size + end + end end \ No newline at end of file