smartcropper 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YWUzYmVjMThjYjkyOGFlYTVkMzBlYzU3YmVmMjExMzBiOTlkMjYxNw==
5
+ data.tar.gz: !binary |-
6
+ YmMyNWFjMGM0NzAyNTAyMDM3NGU3ZDMzZDQ3NDQxOTYzYWY2NWNmYg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YmViZmU3NTY4YzVmNmQ5YjJmYmM3ZTkzZTM3YzRmZGVmNzE2YWFkODRhODNj
10
+ YjE5Y2E4MTQzMmM5MzFlMjcwYmE3ZDI2YWM1MmY5NDRhMTI3Njc5YjJkNjNk
11
+ ZWZmMDZhM2JlMDM2Nzg1NTQzZGJkNGQ3YjNjOGE3OWViYWFkMTQ=
12
+ data.tar.gz: !binary |-
13
+ MGZiZDMyNGI5NTJkODY2ZWQ0ZWY0MTM2ZDMyZjY3ZjUxMGE5ZmZiZmYzNWRj
14
+ NjBkOTg4ZTEwODg2MWJiNzE2NzVhMTYyNzcwODk2Njk3OWFiNjdiMzUyMTAy
15
+ MzgyMjFhZjNmYmEzNjc0NjJjMDU4NjJmNDliZDgyYjlkMzA5ZWM=
data/Gemfile CHANGED
@@ -1,15 +1,3 @@
1
- source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
1
+ source "https://rubygems.org"
5
2
 
6
- gem "rmagick"
7
-
8
- # Add dependencies to develop your gem here.
9
- # Include everything needed to run rake, tests, features, etc.
10
- group :development do
11
- gem "shoulda", ">= 0"
12
- gem "bundler", "~> 1.0.0"
13
- gem "jeweler", "~> 1.5.2"
14
- gem "rcov", ">= 0"
15
- end
3
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,22 +1,48 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ smartcropper (0.6.1)
5
+ rmagick (> 2.11.0)
6
+
1
7
  GEM
2
- remote: http://rubygems.org/
8
+ remote: https://rubygems.org/
3
9
  specs:
4
- git (1.2.5)
5
- jeweler (1.5.2)
6
- bundler (~> 1.0.0)
7
- git (>= 1.2.5)
8
- rake
10
+ activesupport (4.0.0)
11
+ i18n (~> 0.6, >= 0.6.4)
12
+ minitest (~> 4.2)
13
+ multi_json (~> 1.3)
14
+ thread_safe (~> 0.1)
15
+ tzinfo (~> 0.3.37)
16
+ atomic (1.1.10)
17
+ diff-lcs (1.2.4)
18
+ i18n (0.6.4)
19
+ minitest (4.7.5)
20
+ multi_json (1.7.7)
9
21
  rake (0.8.7)
10
- rcov (0.9.9)
11
- rmagick (2.13.1)
12
- shoulda (2.11.3)
22
+ rmagick (2.13.2)
23
+ rspec (2.14.0)
24
+ rspec-core (~> 2.14.0)
25
+ rspec-expectations (~> 2.14.0)
26
+ rspec-mocks (~> 2.14.0)
27
+ rspec-core (2.14.2)
28
+ rspec-expectations (2.14.0)
29
+ diff-lcs (>= 1.1.3, < 2.0)
30
+ rspec-mocks (2.14.1)
31
+ shoulda (3.5.0)
32
+ shoulda-context (~> 1.0, >= 1.0.1)
33
+ shoulda-matchers (>= 1.4.1, < 3.0)
34
+ shoulda-context (1.1.4)
35
+ shoulda-matchers (2.2.0)
36
+ activesupport (>= 3.0.0)
37
+ thread_safe (0.1.0)
38
+ atomic
39
+ tzinfo (0.3.37)
13
40
 
14
41
  PLATFORMS
15
42
  ruby
16
43
 
17
44
  DEPENDENCIES
18
- bundler (~> 1.0.0)
19
- jeweler (~> 1.5.2)
20
- rcov
21
- rmagick
45
+ rake
46
+ rspec
22
47
  shoulda
48
+ smartcropper!
data/README.md CHANGED
@@ -17,7 +17,7 @@ File *uploaders/attachement_uploader.rb*:
17
17
 
18
18
  def smart_crop_and_scale(width, height)
19
19
  manipulate! do |img|
20
- img = CropToelie.new(img)
20
+ img = SmartCropper.new(img)
21
21
  img = img.smart_crop_and_scale(width, height)
22
22
  img = yield(img) if block_given?
23
23
  img
@@ -48,8 +48,12 @@ File *uploaders/attachement_uploader.rb*:
48
48
  2011-04-18: Limit to N steps, instead of step_size.
49
49
  2011-04-16: Introduce tests and a profiler script, to profile performance.
50
50
 
51
- ## Todo
52
- Improved algorythm: first @image.scale by F, investigate the entropy on that, most-interesting square by factor F is to-be-cropped area.
51
+ ## Roadmap
52
+
53
+ 1. Refactoring: It must be cleaned up. There is a lot of smelly code, fat methods and DRY.
54
+ 1. Performance: I want to make it smarter when cropping (really) large images.
55
+ 1. Improve slicing. The results are okay-ish when merely squaring images, but lack when you cut tiny areas from a large image.
56
+ 1. Release 1.0.0
53
57
 
54
58
  ## Copyright
55
59
 
data/Rakefile CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'bundler'
5
+
5
6
  begin
6
7
  Bundler.setup(:default, :development)
7
8
  rescue Bundler::BundlerError => e
@@ -9,25 +10,6 @@ rescue Bundler::BundlerError => e
9
10
  $stderr.puts "Run `bundle install` to install missing gems"
10
11
  exit e.status_code
11
12
  end
12
- require 'rake'
13
-
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "smartcropper"
18
- gem.homepage = "http://github.com/berkes/smartcropper"
19
- gem.license = "GPL"
20
- gem.summary = %Q{Content aware cropper.}
21
- gem.description = %Q{Crops images based on entropy: leaving the most interesting part intact. Don't expect this to be a replacement for human cropping, it is an algorythm and not an extremely smart one at that :). Best results achieved in combination with scaling: the cropping is then only used to square the image, cutting off the least interesting part. The trimming simply chops off te edge that is least interesting, and continues doing so, untill it reached the requested size.}
22
- gem.email = "ber@webschuur.com"
23
- gem.authors = ["Bèr Kessels"]
24
- # Include your dependencies below. Runtime dependencies are required when using your gem,
25
- # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
26
-
27
- gem.add_runtime_dependency 'rmagick', '> 2.11.0'
28
- # gem.add_development_dependency 'rspec', '> 1.2.3'
29
- end
30
- Jeweler::RubygemsDotOrgTasks.new
31
13
 
32
14
  require 'rake/testtask'
33
15
  Rake::TestTask.new(:test) do |test|
@@ -35,14 +17,6 @@ Rake::TestTask.new(:test) do |test|
35
17
  test.pattern = 'test/**/test_*.rb'
36
18
  test.verbose = true
37
19
  end
38
-
39
- require 'rcov/rcovtask'
40
- Rcov::RcovTask.new do |test|
41
- test.libs << 'test'
42
- test.pattern = 'test/**/test_*.rb'
43
- test.verbose = true
44
- end
45
-
46
20
  task :default => :test
47
21
 
48
22
  require 'rake/rdoctask'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.1
1
+ 0.7.0
data/lib/smartcropper.rb CHANGED
@@ -2,7 +2,7 @@ require 'RMagick'
2
2
  class SmartCropper
3
3
  include Magick
4
4
 
5
- attr_accessor :orig
5
+ attr_accessor :image
6
6
  attr_accessor :steps
7
7
 
8
8
  # Create a new SmartCropper object from a ImageList single image object.
@@ -14,7 +14,7 @@ class SmartCropper
14
14
  @steps = 10
15
15
 
16
16
  # Preprocess image.
17
- @image = @image.quantize
17
+ @quantized_image = @image.quantize
18
18
 
19
19
  # Prepare some often-used internal variables.
20
20
  @rows = @image.rows
@@ -83,8 +83,8 @@ class SmartCropper
83
83
  while (width > requested_x)
84
84
  slice_width = [(width - requested_x), step_size].min
85
85
 
86
- left_entropy = entropy_slice(@image, left, 0, slice_width, bottom)
87
- right_entropy = entropy_slice(@image, (right - slice_width), 0, slice_width, bottom)
86
+ left_entropy = entropy_slice(@quantized_image, left, 0, slice_width, bottom)
87
+ right_entropy = entropy_slice(@quantized_image, (right - slice_width), 0, slice_width, bottom)
88
88
 
89
89
  #remove the slice with the least entropy
90
90
  if left_entropy < right_entropy
@@ -100,8 +100,8 @@ class SmartCropper
100
100
  while (height > requested_y)
101
101
  slice_height = [(height - step_size), step_size].min
102
102
 
103
- top_entropy = entropy_slice(@image, 0, top, @columns, slice_height)
104
- bottom_entropy = entropy_slice(@image, 0, (bottom - slice_height), @columns, slice_height)
103
+ top_entropy = entropy_slice(@quantized_image, 0, top, @columns, slice_height)
104
+ bottom_entropy = entropy_slice(@quantized_image, 0, (bottom - slice_height), @columns, slice_height)
105
105
 
106
106
  #remove the slice with the least entropy
107
107
  if top_entropy < bottom_entropy
data/smartcropper.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{smartcropper}
8
- s.version = "0.6.1"
8
+ s.version = "0.7.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Bèr Kessels"]
@@ -17,8 +17,6 @@ Gem::Specification.new do |s|
17
17
  "README.md"
18
18
  ]
19
19
  s.files = [
20
- ".document",
21
- ".rvmrc",
22
20
  "Gemfile",
23
21
  "Gemfile.lock",
24
22
  "LICENSE.txt",
@@ -33,38 +31,10 @@ Gem::Specification.new do |s|
33
31
  s.require_paths = ["lib"]
34
32
  s.rubygems_version = %q{1.5.2}
35
33
  s.summary = %q{Content aware image cropping in Ruby and Carrierwave}
36
- s.test_files = [
37
- "test/helper.rb",
38
- "test/profiler.rb",
39
- "test/test_croptoelie.rb",
40
- "test/fixtures/*"
41
- ]
42
-
43
- if s.respond_to? :specification_version then
44
- s.specification_version = 3
34
+ s.test_files = `git ls-files test`.split("\n")
35
+ s.add_dependency(%q<rmagick>, ["> 2.11.0"])
45
36
 
46
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
- s.add_runtime_dependency(%q<rmagick>, [">= 0"])
48
- s.add_development_dependency(%q<shoulda>, [">= 0"])
49
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
50
- s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
51
- s.add_development_dependency(%q<rcov>, [">= 0"])
52
- s.add_runtime_dependency(%q<rmagick>, ["> 2.11.0"])
53
- else
54
- s.add_dependency(%q<rmagick>, [">= 0"])
55
- s.add_dependency(%q<shoulda>, [">= 0"])
56
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
57
- s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
58
- s.add_dependency(%q<rcov>, [">= 0"])
59
- s.add_dependency(%q<rmagick>, ["> 2.11.0"])
60
- end
61
- else
62
- s.add_dependency(%q<rmagick>, [">= 0"])
63
- s.add_dependency(%q<shoulda>, [">= 0"])
64
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
65
- s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
66
- s.add_dependency(%q<rcov>, [">= 0"])
67
- s.add_dependency(%q<rmagick>, ["> 2.11.0"])
68
- end
37
+ s.add_development_dependency('rake', [">= 0"])
38
+ s.add_development_dependency('rspec', [">= 0"])
39
+ s.add_development_dependency('shoulda', [">= 0"])
69
40
  end
70
-
@@ -59,6 +59,12 @@ class TestSmartcropper < Test::Unit::TestCase
59
59
  assert_equal([19, 19], size)
60
60
  end
61
61
 
62
+ should "return original image, not quantized" do
63
+ img = SmartCropper.new(@image)
64
+ assert_equal(img.image, @image)
65
+ end
66
+
67
+
62
68
  ###########################################################################
63
69
  # Images reported to fail by issue #5 #
64
70
  ###########################################################################
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartcropper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
5
- prerelease:
4
+ version: 0.7.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Bèr Kessels
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-11-28 00:00:00.000000000 Z
11
+ date: 2011-04-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rmagick
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ! '>'
20
18
  - !ruby/object:Gem::Version
21
- version: '0'
19
+ version: 2.11.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ! '>'
28
25
  - !ruby/object:Gem::Version
29
- version: '0'
26
+ version: 2.11.0
30
27
  - !ruby/object:Gem::Dependency
31
- name: shoulda
28
+ name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,47 +34,27 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
- name: bundler
42
+ name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
52
- - !ruby/object:Gem::Version
53
- version: 1.0.0
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 1.0.0
62
- - !ruby/object:Gem::Dependency
63
- name: jeweler
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ~>
45
+ - - ! '>='
68
46
  - !ruby/object:Gem::Version
69
- version: 1.5.2
47
+ version: '0'
70
48
  type: :development
71
49
  prerelease: false
72
50
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
51
  requirements:
75
- - - ~>
52
+ - - ! '>='
76
53
  - !ruby/object:Gem::Version
77
- version: 1.5.2
54
+ version: '0'
78
55
  - !ruby/object:Gem::Dependency
79
- name: rcov
56
+ name: shoulda
80
57
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
58
  requirements:
83
59
  - - ! '>='
84
60
  - !ruby/object:Gem::Version
@@ -86,33 +62,12 @@ dependencies:
86
62
  type: :development
87
63
  prerelease: false
88
64
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
65
  requirements:
91
66
  - - ! '>='
92
67
  - !ruby/object:Gem::Version
93
68
  version: '0'
94
- - !ruby/object:Gem::Dependency
95
- name: rmagick
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ! '>'
100
- - !ruby/object:Gem::Version
101
- version: 2.11.0
102
- type: :runtime
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ! '>'
108
- - !ruby/object:Gem::Version
109
- version: 2.11.0
110
69
  description: ! 'Crops images based on entropy: leaving the most interesting part intact.
111
- Don''t expect this to be a replacement for human cropping, it is an algorythm and
112
- not an extremely smart one at that :). Best results achieved in combination with
113
- scaling: the cropping is then only used to square the image, cutting off the least
114
- interesting part. The trimming simply chops off te edge that is least interesting,
115
- and continues doing so, untill it reached the requested size.'
70
+ Usefull for automatic cropping or resizing of images. '
116
71
  email: ber@webschuur.com
117
72
  executables: []
118
73
  extensions: []
@@ -120,15 +75,14 @@ extra_rdoc_files:
120
75
  - LICENSE.txt
121
76
  - README.md
122
77
  files:
123
- - .document
124
78
  - Gemfile
125
79
  - Gemfile.lock
126
80
  - LICENSE.txt
127
81
  - README.md
128
82
  - Rakefile
129
83
  - VERSION
130
- - lib/smartcropper.rb
131
84
  - smartcropper.gemspec
85
+ - lib/smartcropper.rb
132
86
  - test/fixtures/20x20.png
133
87
  - test/fixtures/entropyish.png
134
88
  - test/fixtures/entropyish.txt
@@ -139,35 +93,39 @@ files:
139
93
  - test/helper.rb
140
94
  - test/profiler.rb
141
95
  - test/test_croptoelie.rb
142
- homepage: http://github.com/berkes/smartcropper
96
+ homepage: http://berk.es/smartcropper
143
97
  licenses:
144
98
  - GPL
99
+ metadata: {}
145
100
  post_install_message:
146
101
  rdoc_options: []
147
102
  require_paths:
148
103
  - lib
149
104
  required_ruby_version: !ruby/object:Gem::Requirement
150
- none: false
151
105
  requirements:
152
106
  - - ! '>='
153
107
  - !ruby/object:Gem::Version
154
108
  version: '0'
155
- segments:
156
- - 0
157
- hash: -779265411
158
109
  required_rubygems_version: !ruby/object:Gem::Requirement
159
- none: false
160
110
  requirements:
161
111
  - - ! '>='
162
112
  - !ruby/object:Gem::Version
163
113
  version: '0'
164
114
  requirements: []
165
115
  rubyforge_project:
166
- rubygems_version: 1.8.24
116
+ rubygems_version: 2.0.3
167
117
  signing_key:
168
- specification_version: 3
169
- summary: Content aware cropper.
118
+ specification_version: 4
119
+ summary: Content aware image cropping in Ruby and Carrierwave
170
120
  test_files:
121
+ - test/fixtures/20x20.png
122
+ - test/fixtures/entropyish.png
123
+ - test/fixtures/entropyish.txt
124
+ - test/fixtures/errors/flo-rida.png
125
+ - test/fixtures/errors/hollywood-undead.jpg
126
+ - test/fixtures/errors/maroon-5.jpg
127
+ - test/fixtures/errors/yo-gotti.jpg
171
128
  - test/helper.rb
172
129
  - test/profiler.rb
173
130
  - test/test_croptoelie.rb
131
+ has_rdoc:
data/.document DELETED
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt