the_image 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 11489c85bdd57b5e438f024ccd8d9de61656e452
4
+ data.tar.gz: e64893b0a1176272fab816e956bcdd8737af6c01
5
+ SHA512:
6
+ metadata.gz: f1c9e0e43b4991970133f4744848327f73b3e867c1a246eade3d8e82f4352efacfbfee7c05b758b88e4fa0784196f26e6f6c78f5724a1926f51f7840a231434f
7
+ data.tar.gz: 54321deb1897311636a9ffb3374d1f806aef34d08890e7d32ddcb7b733cf2477fcb8fdba2bd21ff64f0fd6298960b565eb2ff54739af5c9c801edaf5a1a94b48
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in the_image.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Ilya N. Zykin
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,3 @@
1
+ # TheImage
2
+
3
+ Helpers for image manipulations
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,3 @@
1
+ module TheImage
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,147 @@
1
+ require_relative 'the_image/version'
2
+ require 'mini_magick'
3
+
4
+ module TheImage
5
+ # Helpers
6
+ def path_to_file file_path
7
+ file_path.split('/')[0...-1].join('/')
8
+ end
9
+
10
+ def destroy_file file_path
11
+ FileUtils.rm(file_path , force: true)
12
+ end
13
+
14
+ def destroy_dir dir_path
15
+ FileUtils.rm_rf dir_path
16
+ end
17
+
18
+ def create_path_for_file file_path
19
+ FileUtils.mkdir_p path_to_file(file_path)
20
+ end
21
+
22
+ def destroy_dir_of_file file_path
23
+ FileUtils.rm_rf path_to_file(file_path)
24
+ end
25
+
26
+ # Main methods
27
+ def landscape? image
28
+ image[:width] > image[:height]
29
+ end
30
+
31
+ def portrait? image
32
+ image[:width] < image[:height]
33
+ end
34
+
35
+ def manipulate opts = {}, &block
36
+ src = opts[:src]
37
+ dest = opts[:dest]
38
+ format = opts[:format]
39
+
40
+ image = ::MiniMagick::Image.open src
41
+ image.format(format.to_s.downcase) if format
42
+
43
+ image = instance_exec(image, opts, &block)
44
+ image.write dest
45
+ end
46
+
47
+ # Image manipulate
48
+ # Resizing can be wrong when .EXT of file is wrong
49
+ def strict_resize image, w, h
50
+ image.resize "#{ w }x#{ h }!"
51
+ image
52
+ end
53
+
54
+ def resize image, w, h
55
+ image.resize "#{ w }x#{ h }"
56
+ image
57
+ end
58
+
59
+ def rotate image, angle
60
+ image.rotate angle
61
+ image
62
+ end
63
+
64
+ def rotate_left image
65
+ rotate image, '-90'
66
+ end
67
+
68
+ def rotate_right image
69
+ rotate image, '90'
70
+ end
71
+
72
+ def biggest_side_not_bigger_than image, size
73
+ if landscape?(image)
74
+ image.resize("#{ size }x") if image[:width] > size.to_i
75
+ else
76
+ image.resize("x#{ size }") if image[:height] > size.to_i
77
+ end
78
+
79
+ image
80
+ end
81
+
82
+ def strip image
83
+ image.strip
84
+ image
85
+ end
86
+
87
+ def auto_orient image
88
+ image.auto_orient
89
+ image
90
+ end
91
+
92
+ def to_rect image, width, height, opts = {}
93
+ default_opts = { valign: :center, align: :center }
94
+ opts = default_opts.merge(opts)
95
+
96
+ align = opts[:align].to_sym
97
+ valign = opts[:valign].to_sym
98
+
99
+ w0, h0 = image[:width].to_f, image[:height].to_f
100
+ w1, h1 = width.to_f, height.to_f
101
+ fw, fh = w0, h0
102
+
103
+ scale = ((w1 / w0) > (h1 / h0)) ? (w1 / w0) : (h1 / h0)
104
+
105
+ fw = (w1 / scale).to_i
106
+ fh = (h1 / scale).to_i
107
+
108
+ x0 = case align
109
+ when :center
110
+ ((w0 - fw) / 2).to_i
111
+ when :right
112
+ (w0 - fw).to_i
113
+ else
114
+ 0
115
+ end
116
+
117
+ y0 = case valign
118
+ when :center
119
+ ((h0 - fh) / 2).to_i
120
+ when :bottom
121
+ (h0 - fh).to_i
122
+ else
123
+ 0
124
+ end
125
+
126
+ image.crop "#{ fw }x#{ fh }+#{ x0 }+#{ y0 }"
127
+ image.resize "#{ width }x#{ height }!"
128
+ image
129
+ end
130
+
131
+ def to_square image, size, opts = {}
132
+ to_rect image, size, size, opts
133
+ end
134
+
135
+ # scale = original_iamge[:width].to_f / image_on_screen[:width].to_f
136
+ # usually scale should be 1
137
+ def crop image, x0 = 0, y0 = 0, w = 100, h = 100, scale = 1
138
+ x0 = (x0.to_f * scale).to_i
139
+ y0 = (y0.to_f * scale).to_i
140
+
141
+ w = (w.to_f * scale).to_i
142
+ h = (h.to_f * scale).to_i
143
+
144
+ image.crop "#{ w }x#{ h }+#{ x0 }+#{ y0 }"
145
+ image
146
+ end
147
+ end
@@ -0,0 +1 @@
1
+ require_relative '../../gem_version'
Binary file
@@ -0,0 +1,63 @@
1
+ _root_ = File.expand_path('../../../', __FILE__)
2
+
3
+ require "#{ _root_ }/lib/the_image"
4
+
5
+ # Processor
6
+ class Tool; include TheImage; end
7
+ tool = Tool.new
8
+
9
+ # base paths
10
+ src_dir = "#{ _root_ }/spec/crop_tool/src_images"
11
+ dest_dir = "#{ _root_ }/spec/crop_tool/dest_images"
12
+
13
+ # reset dest dir
14
+ tool.destroy_dir dest_dir
15
+ tool.create_path_for_file "#{ dest_dir }/filename"
16
+
17
+ # test_1
18
+ src = "#{ src_dir }/1200x100.png"
19
+ dest = "#{ dest_dir }/test_1.png"
20
+
21
+ tool.manipulate({ src: src, dest: dest }) do |image, opts|
22
+ to_rect image, 100, 100
23
+ end
24
+
25
+ # test_2
26
+ src = "#{ src_dir }/100x100.png"
27
+ dest = "#{ dest_dir }/test_2.png"
28
+
29
+ tool.manipulate({ src: src, dest: dest }) do |image, opts|
30
+ to_rect image, 100, 100
31
+ end
32
+
33
+ # test_3
34
+ src = "#{ src_dir }/1504x846.jpg"
35
+ dest = "#{ dest_dir }/test_3.png"
36
+
37
+ tool.manipulate({ src: src, dest: dest }) do |image, opts|
38
+ to_rect image, 300, 100
39
+ end
40
+
41
+ # test_4
42
+ src = "#{ src_dir }/600x1000.jpg"
43
+ dest = "#{ dest_dir }/test_4.png"
44
+
45
+ tool.manipulate({ src: src, dest: dest }) do |image, opts|
46
+ to_rect image, 100, 100, { valign: :top }
47
+ end
48
+
49
+ # test_5
50
+ src = "#{ src_dir }/169x150.jpg"
51
+ dest = "#{ dest_dir }/test_5.png"
52
+
53
+ img_w = 500
54
+ x0 = 115
55
+ y0 = 52
56
+ w = 348.42857142857144
57
+ h = 271
58
+
59
+ tool.manipulate({ src: src, dest: dest }) do |image, opts|
60
+ scale = image[:width].to_f / img_w.to_f
61
+ crop image, x0, y0, w, h, scale
62
+ to_rect image, 270, 210
63
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'the_image/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "the_image"
8
+ spec.version = TheImage::VERSION
9
+ spec.authors = ["Ilya N. Zykin"]
10
+ spec.email = ["zykin-ilya@ya.ru"]
11
+ spec.summary = %q{TheImage - helpers for image manipulations}
12
+ spec.description = %q{Helpers for image manipulations}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'mini_magick'
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.6"
24
+ spec.add_development_dependency "rake"
25
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: the_image
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ilya N. Zykin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mini_magick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Helpers for image manipulations
56
+ email:
57
+ - zykin-ilya@ya.ru
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
66
+ - Rakefile
67
+ - gem_version.rb
68
+ - lib/the_image.rb
69
+ - lib/the_image/version.rb
70
+ - spec/crop_tool/.DS_Store
71
+ - spec/crop_tool/crop.rb
72
+ - spec/crop_tool/dest_images/test_1.png
73
+ - spec/crop_tool/dest_images/test_2.png
74
+ - spec/crop_tool/dest_images/test_3.png
75
+ - spec/crop_tool/dest_images/test_4.png
76
+ - spec/crop_tool/dest_images/test_5.png
77
+ - spec/crop_tool/src_images/100x100.png
78
+ - spec/crop_tool/src_images/1200x100.png
79
+ - spec/crop_tool/src_images/1504x846.jpg
80
+ - spec/crop_tool/src_images/169x150.jpg
81
+ - spec/crop_tool/src_images/600x1000.jpg
82
+ - the_image.gemspec
83
+ homepage: ''
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.2.2
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: TheImage - helpers for image manipulations
107
+ test_files:
108
+ - spec/crop_tool/.DS_Store
109
+ - spec/crop_tool/crop.rb
110
+ - spec/crop_tool/dest_images/test_1.png
111
+ - spec/crop_tool/dest_images/test_2.png
112
+ - spec/crop_tool/dest_images/test_3.png
113
+ - spec/crop_tool/dest_images/test_4.png
114
+ - spec/crop_tool/dest_images/test_5.png
115
+ - spec/crop_tool/src_images/100x100.png
116
+ - spec/crop_tool/src_images/1200x100.png
117
+ - spec/crop_tool/src_images/1504x846.jpg
118
+ - spec/crop_tool/src_images/169x150.jpg
119
+ - spec/crop_tool/src_images/600x1000.jpg