Module: ImageOptimizer::Png

Defined in:
lib/image-optimizer/png.rb

Overview

PNG optimizing module.

Since:

  • 0.2

Class Method Summary collapse

Class Method Details

.optimize(path, &block) ⇒ Object

Since:

  • 0.2



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/image-optimizer/png.rb', line 17

def self.optimize(path, &block)
    path_escaped = Shellwords::escape(path)
  
    # calls back
    block.call(path.dup, ImageOptimizer::BEFORE)
              
    # New method (GIMP & XcfTools)
    if ImageOptimizer.available? :gimp and ImageOptimizer.available? :xcf2png and ImageOptimizer.available? :convert
        
        Dir.mktmpdir do |tmpdir|
            original_size = File.size(path)                
            dirname = tmpdir
            basename = File.basename(path, '.png')
            basepath = dirname + '/' + basename 
            png_path = basepath + '.png'
            xcf_path = basepath + '.xcf'
            tif_path = basepath + '.tif'
            
            # ImageMagick
            block.call(:mogrify, ImageOptimizer::METHOD)
            `convert #{path_escaped} #{Shellwords::escape(tif_path)} 2> /dev/null`
          
            # GIMP
            block.call(:gimp, ImageOptimizer::METHOD)
            gimp = File.read(File.dirname(__FILE__) + '/png.script')
            gimp.gsub!(':path', tif_path)
            `#{gimp}`

            # xcf2png
            block.call(:xcf2png, ImageOptimizer::METHOD)
            `xcf2png #{Shellwords::escape(xcf_path)} > #{Shellwords::escape(png_path)} 2> /dev/null`
            
            # General optimizers
            self.__general_optimizers(png_path, &block)

            # Copy back
            new_size = File.size(png_path)
            if new_size < original_size
                FileUtils.cp(png_path, path)
            end
            
        end
        
    # Old method (ImageMagick)
    elsif ImageOptimizer.available? :mogrify
    
        # Mogrify
        block.call(:convert, ImageOptimizer::METHOD)
        `mogrify #{path_escaped} -quality 100 2> /dev/null`
    
        # General optimizers
        self.__general_optimizers(path, &block)
        
    end

    # Calls back
    block.call(path.dup, ImageOptimizer::AFTER)
    
end