image_optimizer 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +24 -2
- data/certs/jtescher.pem +15 -15
- data/checksum/image_optimizer-1.6.0.gem.sha512 +1 -0
- data/image_optimizer.gemspec +1 -1
- data/lib/image_optimizer/gif_optimizer.rb +28 -0
- data/lib/image_optimizer/version.rb +1 -1
- data/lib/image_optimizer.rb +2 -0
- data/spec/image_optimizer/gif_optimizer_spec.rb +63 -0
- data/spec/image_optimizer_spec.rb +2 -1
- data.tar.gz.sig +1 -2
- metadata +23 -19
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc1965ff20a12b495be3c4b0bf4e312e4a81eddb
|
4
|
+
data.tar.gz: 1df870fc21e4a638420c7df2fad7a16b7d151d1b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bbb9fc93085a14e99ea772bdf15aa802f0f541f6e3dea65d669b5595f67276c1bb14d2175e87aeac08e6af3ab4c43fcc55e3005ea83f2432312954552451c95
|
7
|
+
data.tar.gz: f2e8eec48adb796e0089d34188820aa1f75da6cbda3af71837b150675e09d5df67e16eff7efed256e4229ca128695f94f6d5b838efdca02f3628be3502217fb2
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -22,10 +22,12 @@ Tested against ruby 2.0.x, 2.1.x, 2.2.x, 2.3.x, and ruby-head
|
|
22
22
|
|
23
23
|
2. OptiPNG, which can be installed from [sourceforge.net](http://optipng.sourceforge.net/)
|
24
24
|
|
25
|
+
3. Gifsicle, which can be installed from [www.lcdf.org/gifsicle/](https://www.lcdf.org/gifsicle/)
|
26
|
+
|
25
27
|
Or install the utilities via homebrew:
|
26
28
|
|
27
29
|
```bash
|
28
|
-
$ brew install optipng jpegoptim
|
30
|
+
$ brew install optipng jpegoptim gifsicle
|
29
31
|
```
|
30
32
|
|
31
33
|
Then add this line to your application's Gemfile:
|
@@ -45,7 +47,7 @@ $ gem install image_optimizer
|
|
45
47
|
|
46
48
|
## Usage
|
47
49
|
|
48
|
-
#### Optimize PNG
|
50
|
+
#### Optimize PNG formats:
|
49
51
|
|
50
52
|
OptiPNG is a PNG optimizer that recompresses image files to a smaller size without losing any information and
|
51
53
|
performs PNG integrity checks and corrections.
|
@@ -63,6 +65,14 @@ All jpegs will be progressively optimized for a better web experience
|
|
63
65
|
ImageOptimizer.new('path/to/file.jpg').optimize
|
64
66
|
```
|
65
67
|
|
68
|
+
#### Optimize GIF formats:
|
69
|
+
|
70
|
+
Gifsicle is a command-line tool for creating, editing, and getting information about GIF images and animations. This stores only the changed portion of each frame, and can radically shrink your GIFs. You can also use transparency to make them even smaller. Gifsicle’s optimizer is pretty powerful, and usually reduces animations to within a couple bytes of the best commercial optimizers.
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
ImageOptimizer.new('path/to/file.gif').optimize
|
74
|
+
```
|
75
|
+
|
66
76
|
## Optimization Options
|
67
77
|
|
68
78
|
##### Quiet optimization
|
@@ -109,6 +119,18 @@ You can skip removing the meta data by changing the `strip_metadata` parameter t
|
|
109
119
|
ImageOptimizer.new('path/to/file.png', strip_metadata: false).optimize
|
110
120
|
```
|
111
121
|
|
122
|
+
##### Custom GIF optimization quality
|
123
|
+
|
124
|
+
By default, `gifsicle` is called with the `-O1` flag, which controls the level of
|
125
|
+
optimization. It stores only the changed portion of each image. Other allowed flag are `-O2` (Also uses transparency to shrink the file further), `-O3` (Try several optimization methods , usually slower, sometimes better results)
|
126
|
+
|
127
|
+
You can pass an optional `level` parameter to change this value. the JPEG
|
128
|
+
optimizer will ignore the value.
|
129
|
+
|
130
|
+
```ruby
|
131
|
+
ImageOptimizer.new('path/to/file.gif', level: 3).optimize
|
132
|
+
```
|
133
|
+
|
112
134
|
##### Use identify
|
113
135
|
|
114
136
|
Pass an optional `identify` parameter to identify file types using ImageMagick or GraphicsMagick `identify`
|
data/certs/jtescher.pem
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
2
|
MIIDdDCCAlygAwIBAgIBATANBgkqhkiG9w0BAQUFADBAMRIwEAYDVQQDDAlqYXRl
|
3
3
|
c2NoZXIxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
|
4
|
-
|
4
|
+
bTAeFw0xNjA5MjYxNzU4NTRaFw0xNzA5MjYxNzU4NTRaMEAxEjAQBgNVBAMMCWph
|
5
5
|
dGVzY2hlcjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYD
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
/
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7ptCQvN739Rjos4e
|
7
|
+
G2Y8uGCQxpBoXozU36PXLtR5ws7aly1QV0zRc1cy7nKnOSnXn7dEfbLGZS6/87pM
|
8
|
+
rDFFszHsn/dizlXe3wejHePyG1EsYnIezISP9YSDcm7qpysrUAa2fKPqqZ6DNbIP
|
9
|
+
6wRF9Cun4hvmQPDrs0zKU6p43XHnJUg7YBYCOVACa7eFD1EOya+599hFMhnWChvT
|
10
|
+
rKkVc/JRvmKYLIkB6Y6N3TFrVi9x0Qpo4fjG5rQ9xxNZhpFIOMJ0VJbuRSIMlLwr
|
11
|
+
Ryd/QG0BcvkSHph/ZDlgfZ1V/lzWWq+mZOt/U+t6cVITSET5XDzHkeZ0BodGyAMr
|
12
|
+
lZpggQIDAQABo3kwdzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU
|
13
|
+
QLcGxzEu2F2XI+3tIWSu8KqAFrkwHgYDVR0RBBcwFYETamF0ZXNjaGVyQGdtYWls
|
14
14
|
LmNvbTAeBgNVHRIEFzAVgRNqYXRlc2NoZXJAZ21haWwuY29tMA0GCSqGSIb3DQEB
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
BQUAA4IBAQCh9hDqN3lZw0PLVkXVcnwnl3KAjJfwCwk1okeuJ+IeQSfRLPp2ECLn
|
16
|
+
j87oXZPcBukPB0/zTHcF/eBPIGvOedqVhp9SEar51dXLdiCe+deXx/bI3YMRdTGH
|
17
|
+
6NtqR6hWjm+hzBthxDsKhmQRczJ+5FNzAoW+pzf7ouKGfeFiFPwvAMolzsi2T+O/
|
18
|
+
AmsZcBYVI8HbrnuoQI30XfdhNoRrKhoMyzAyVdWX9xQW56TWUO+o8iXBKjOxX2C5
|
19
|
+
8lVFrLvGNGPCLQmEf498hBYT99EVYiuiI0F7YlTmBdzL1uwTMk5le/b0NguYdSJ7
|
20
|
+
qKlUP9usSwMVc+qmaOg1EYfPGYvt63qS
|
21
21
|
-----END CERTIFICATE-----
|
@@ -0,0 +1 @@
|
|
1
|
+
c1e31ef50556ea85d20d056bb5145879e85fd60a8814d8eb62ffdf6e144d2bdd52c9b718c17e2b9fd14c58a0fdc23dc7a23ae5a6982edcf280ff5eaaf0963189
|
data/image_optimizer.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |gem|
|
|
9
9
|
gem.authors = ["Julian Tescher"]
|
10
10
|
gem.email = ["jatescher@gmail.com"]
|
11
11
|
gem.description = %q{A simple image optimizer}
|
12
|
-
gem.summary = %q{Simply optimize images via jpegoptim or OptiPNG}
|
12
|
+
gem.summary = %q{Simply optimize images via jpegoptim or OptiPNG or Gifsicle}
|
13
13
|
gem.homepage = "https://github.com/jtescher/image_optimizer"
|
14
14
|
gem.license = 'MIT'
|
15
15
|
gem.signing_key = File.expand_path('~/.ssh/gem-private_key.pem') if $0 =~ /gem\z/
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class ImageOptimizer
|
2
|
+
class GIFOptimizer < ImageOptimizerBase
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
def command_options
|
7
|
+
flags = %W[-b -O#{level}]
|
8
|
+
flags << path
|
9
|
+
end
|
10
|
+
|
11
|
+
def level
|
12
|
+
options[:level] || 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def type
|
16
|
+
'gif'
|
17
|
+
end
|
18
|
+
|
19
|
+
def extensions
|
20
|
+
%w[gif]
|
21
|
+
end
|
22
|
+
|
23
|
+
def bin_name
|
24
|
+
'gifsicle'
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
data/lib/image_optimizer.rb
CHANGED
@@ -3,6 +3,7 @@ require 'image_optimizer/shell'
|
|
3
3
|
require 'image_optimizer/image_optimizer_base'
|
4
4
|
require 'image_optimizer/jpeg_optimizer'
|
5
5
|
require 'image_optimizer/png_optimizer'
|
6
|
+
require 'image_optimizer/gif_optimizer'
|
6
7
|
|
7
8
|
class ImageOptimizer
|
8
9
|
include Shell
|
@@ -17,6 +18,7 @@ class ImageOptimizer
|
|
17
18
|
identify_format if options[:identify]
|
18
19
|
JPEGOptimizer.new(path, options).optimize
|
19
20
|
PNGOptimizer.new(path, options).optimize
|
21
|
+
GIFOptimizer.new(path, options).optimize
|
20
22
|
end
|
21
23
|
|
22
24
|
private
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ImageOptimizer::GIFOptimizer do
|
4
|
+
describe '#optimize' do
|
5
|
+
let(:options) { {} }
|
6
|
+
let(:gif_optimizer) { ImageOptimizer::GIFOptimizer.new('/path/to/file.gif', options) }
|
7
|
+
after { ImageOptimizer::GIFOptimizer.instance_variable_set(:@bin, nil) }
|
8
|
+
subject { gif_optimizer.optimize }
|
9
|
+
|
10
|
+
context 'with gif optimizing utility installed' do
|
11
|
+
before do
|
12
|
+
allow(ImageOptimizer::GIFOptimizer).to receive(:which).and_return('/usr/local/bin/gifsicle')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'optimizes the gif' do
|
16
|
+
expect(gif_optimizer).to receive(:system).with('/usr/local/bin/gifsicle', '-b', '-O1', '/path/to/file.gif')
|
17
|
+
subject
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'ENV variable path to gifsicle' do
|
21
|
+
let(:image_optim_gifsicle_bin_path) { '/app/vendor/bundle/ruby/2.0.0/gems/image_optim_bin-0.0.2/bin/gifsicle' }
|
22
|
+
before do
|
23
|
+
ENV['GIFSICLE_BIN'] = image_optim_gifsicle_bin_path
|
24
|
+
end
|
25
|
+
after do
|
26
|
+
ENV['GIFSICLE_BIN'] = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'detects if there is an ENV variable path to gifsicle' do
|
30
|
+
expect(gif_optimizer).to receive(:system).with(image_optim_gifsicle_bin_path, '-b', '-O1', '/path/to/file.gif')
|
31
|
+
subject
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'without optimization parameter' do
|
36
|
+
it 'optimizes the gif with level 7 optimization' do
|
37
|
+
expect(gif_optimizer).to receive(:system).with('/usr/local/bin/gifsicle', '-b', '-O1', '/path/to/file.gif')
|
38
|
+
subject
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'with optimization parameter' do
|
43
|
+
let(:options) { { level: 2 } }
|
44
|
+
it 'optimizes the gif with the requested optimization level' do
|
45
|
+
expect(gif_optimizer).to receive(:system).with('/usr/local/bin/gifsicle', '-b', '-O2', '/path/to/file.gif')
|
46
|
+
subject
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
context 'with gif optimizing utility not installed' do
|
53
|
+
before do
|
54
|
+
allow(ImageOptimizer::GIFOptimizer).to receive(:which).and_return(nil)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'warns the user' do
|
58
|
+
expect(gif_optimizer).to receive(:warn).with('Attempting to optimize a gif without gifsicle installed. Skipping...')
|
59
|
+
subject
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -7,9 +7,10 @@ describe ImageOptimizer do
|
|
7
7
|
describe '#optimize' do
|
8
8
|
subject { ImageOptimizer.new(File.join(image_path), options) }
|
9
9
|
|
10
|
-
it 'delegates to jpeg and
|
10
|
+
it 'delegates to jpeg, png and gif optimizers' do
|
11
11
|
expect_any_instance_of(ImageOptimizer::JPEGOptimizer).to receive(:optimize)
|
12
12
|
expect_any_instance_of(ImageOptimizer::PNGOptimizer).to receive(:optimize)
|
13
|
+
expect_any_instance_of(ImageOptimizer::GIFOptimizer).to receive(:optimize)
|
13
14
|
subject.optimize
|
14
15
|
end
|
15
16
|
end
|
data.tar.gz.sig
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
�6^���z#���c�"�D�ACD=D�n����Ό(��0��MjГ�歫;>s����Bg�~6��u��T
|
1
|
+
�3+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: image_optimizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Tescher
|
@@ -12,25 +12,25 @@ cert_chain:
|
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
13
|
MIIDdDCCAlygAwIBAgIBATANBgkqhkiG9w0BAQUFADBAMRIwEAYDVQQDDAlqYXRl
|
14
14
|
c2NoZXIxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
|
15
|
-
|
15
|
+
bTAeFw0xNjA5MjYxNzU4NTRaFw0xNzA5MjYxNzU4NTRaMEAxEjAQBgNVBAMMCWph
|
16
16
|
dGVzY2hlcjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYD
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
/
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7ptCQvN739Rjos4e
|
18
|
+
G2Y8uGCQxpBoXozU36PXLtR5ws7aly1QV0zRc1cy7nKnOSnXn7dEfbLGZS6/87pM
|
19
|
+
rDFFszHsn/dizlXe3wejHePyG1EsYnIezISP9YSDcm7qpysrUAa2fKPqqZ6DNbIP
|
20
|
+
6wRF9Cun4hvmQPDrs0zKU6p43XHnJUg7YBYCOVACa7eFD1EOya+599hFMhnWChvT
|
21
|
+
rKkVc/JRvmKYLIkB6Y6N3TFrVi9x0Qpo4fjG5rQ9xxNZhpFIOMJ0VJbuRSIMlLwr
|
22
|
+
Ryd/QG0BcvkSHph/ZDlgfZ1V/lzWWq+mZOt/U+t6cVITSET5XDzHkeZ0BodGyAMr
|
23
|
+
lZpggQIDAQABo3kwdzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU
|
24
|
+
QLcGxzEu2F2XI+3tIWSu8KqAFrkwHgYDVR0RBBcwFYETamF0ZXNjaGVyQGdtYWls
|
25
25
|
LmNvbTAeBgNVHRIEFzAVgRNqYXRlc2NoZXJAZ21haWwuY29tMA0GCSqGSIb3DQEB
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
BQUAA4IBAQCh9hDqN3lZw0PLVkXVcnwnl3KAjJfwCwk1okeuJ+IeQSfRLPp2ECLn
|
27
|
+
j87oXZPcBukPB0/zTHcF/eBPIGvOedqVhp9SEar51dXLdiCe+deXx/bI3YMRdTGH
|
28
|
+
6NtqR6hWjm+hzBthxDsKhmQRczJ+5FNzAoW+pzf7ouKGfeFiFPwvAMolzsi2T+O/
|
29
|
+
AmsZcBYVI8HbrnuoQI30XfdhNoRrKhoMyzAyVdWX9xQW56TWUO+o8iXBKjOxX2C5
|
30
|
+
8lVFrLvGNGPCLQmEf498hBYT99EVYiuiI0F7YlTmBdzL1uwTMk5le/b0NguYdSJ7
|
31
|
+
qKlUP9usSwMVc+qmaOg1EYfPGYvt63qS
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2016-09-
|
33
|
+
date: 2016-09-26 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: rspec
|
@@ -125,13 +125,16 @@ files:
|
|
125
125
|
- checksum/image_optimizer-1.3.0.gem.sha512
|
126
126
|
- checksum/image_optimizer-1.4.0.gem.sha512
|
127
127
|
- checksum/image_optimizer-1.5.0.gem.sha512
|
128
|
+
- checksum/image_optimizer-1.6.0.gem.sha512
|
128
129
|
- image_optimizer.gemspec
|
129
130
|
- lib/image_optimizer.rb
|
131
|
+
- lib/image_optimizer/gif_optimizer.rb
|
130
132
|
- lib/image_optimizer/image_optimizer_base.rb
|
131
133
|
- lib/image_optimizer/jpeg_optimizer.rb
|
132
134
|
- lib/image_optimizer/png_optimizer.rb
|
133
135
|
- lib/image_optimizer/shell.rb
|
134
136
|
- lib/image_optimizer/version.rb
|
137
|
+
- spec/image_optimizer/gif_optimizer_spec.rb
|
135
138
|
- spec/image_optimizer/jpeg_optimizer_spec.rb
|
136
139
|
- spec/image_optimizer/png_optimizer_spec.rb
|
137
140
|
- spec/image_optimizer/shell_spec.rb
|
@@ -158,11 +161,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
161
|
version: '0'
|
159
162
|
requirements: []
|
160
163
|
rubyforge_project:
|
161
|
-
rubygems_version: 2.
|
164
|
+
rubygems_version: 2.5.1
|
162
165
|
signing_key:
|
163
166
|
specification_version: 4
|
164
|
-
summary: Simply optimize images via jpegoptim or OptiPNG
|
167
|
+
summary: Simply optimize images via jpegoptim or OptiPNG or Gifsicle
|
165
168
|
test_files:
|
169
|
+
- spec/image_optimizer/gif_optimizer_spec.rb
|
166
170
|
- spec/image_optimizer/jpeg_optimizer_spec.rb
|
167
171
|
- spec/image_optimizer/png_optimizer_spec.rb
|
168
172
|
- spec/image_optimizer/shell_spec.rb
|
metadata.gz.sig
CHANGED
Binary file
|