image_processing 0.2.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.

Potentially problematic release.


This version of image_processing might be problematic. Click here for more details.

@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d685d2233ad9b0da42966e273cc5a453215eb82a
4
+ data.tar.gz: 18ce0a061ba6eeff0501c311aa9f217404c25371
5
+ SHA512:
6
+ metadata.gz: 8859c7bcf11803b4e41b8eb03f04fc30ddf65ffd4756c4c4d76907189fb7a7c5fb9bb4f1b6287b34ce21cd07b7c0edd566fb9ec14b30d128bdea910c6f31c802
7
+ data.tar.gz: 649891929efd850e926f6f30487dfca66c44e12f614dff1b47fa0e4191e368880f331ee88634cebe381aad90fa73824eca8afaf0c432f1a1adc53d651235abd6
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Janko Marohnić
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,87 @@
1
+ # ImageProcessing
2
+
3
+ Provides higher-level helper methods for image processing in Ruby using
4
+ ImageMagick. This methods are extracted from CarrierWave and Refile, and
5
+ can be reused in any project.
6
+
7
+ ## Installation
8
+
9
+ ```ruby
10
+ gem 'image_processing'
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ Typically you will include the module in your class:
16
+
17
+ ```rb
18
+ require "image_processing/mini_magick"
19
+
20
+ include ImageProcessing::MiniMagick
21
+
22
+ original = File.open("path/to/image.jpg")
23
+
24
+ converted = convert(original, "png") # makes a converted copy
25
+ converted #=> #<Tempfile:/var/folders/k7/6zx6dx6x7ys3rv3srh0nyfj00000gn/T/mini_magick20151003-23030-9e1vjz.png (closed)>
26
+ File.exist?(original.path) #=> true
27
+
28
+ converted = convert!(original, "png") # destructively converts the file
29
+ converted #=> #<Tempfile:/var/folders/k7/6zx6dx6x7ys3rv3srh0nyfj00000gn/T/mini_magick20151003-23030-9e1vjz.png (closed)>
30
+ File.exist?(original.path) #=> false
31
+ ```
32
+
33
+ If you would rather not pollute your namespace, you can also call the methods
34
+ directly on the module:
35
+
36
+ ```rb
37
+ image = File.open("path/to/image.jpg")
38
+
39
+ ImageProcessing::MiniMagick.resize_to_fit(image, 400, 400)
40
+ ```
41
+
42
+ The following is the list of helper methods that ImageProcessing provides:
43
+
44
+ ```rb
45
+ # Converts file to the specified format.
46
+ convert(file, format) # nondestructive
47
+ convert!(file, format) # destructive
48
+
49
+ # Resizes image to fit the specified dimensions (shrinks if larger, enlarges if
50
+ # smaller, but keeps the aspect ratio).
51
+ resize_to_fit(file, width, height) # nondestructive
52
+ resize_to_fit!(file, width, height) # destructive
53
+
54
+ # Resizes image in limit of the specified dimensions (shrinks if larger, keeps
55
+ # if smaller, but keeps the aspect ratio).
56
+ resize_to_limit(file, width, height) # nondestructive
57
+ resize_to_limit!(file, width, height) # destructive
58
+
59
+ # Resizes image to fill the specified dimensions (shrinks if larger,
60
+ # enlarges if smaller, crops the longer side).
61
+ resize_to_fill(file, width, height, gravity: "Center") # nondestructive
62
+ resize_to_fill!(file, width, height, gravity: "Center") # destructive
63
+
64
+ # Resizes image to the specified dimensions and pads missing space (shrinks if
65
+ # larger, enlarges if smaller, fills the shorter side with specified color).
66
+ resize_and_pad(file, width, height, background: "transparent", gravity: "Center") # nondestructive
67
+ resize_and_pad!(file, width, height, background: "transparent", gravity: "Center") # destructive
68
+ ```
69
+
70
+ ## Contributing
71
+
72
+ ImageMagick and GraphicsMagick are both required to be installed, on Mac this is
73
+
74
+ ```
75
+ $ brew install imagemagick
76
+ $ brew install graphicsmagick
77
+ ```
78
+
79
+ Run tests with
80
+
81
+ ```
82
+ $ rake test
83
+ ```
84
+
85
+ ## License
86
+
87
+ [MIT](LICENSE.txt)
@@ -0,0 +1,22 @@
1
+ require_relative "lib/image_processing/version"
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "image_processing"
5
+ spec.version = ImageProcessing::VERSION
6
+ spec.authors = ["Janko Marohnić"]
7
+ spec.email = ["janko.marohnic@gmail.com"]
8
+
9
+ spec.summary = "Set of higher-level helper methods for image processing."
10
+ spec.description = "Set of higher-level helper methods for image processing."
11
+ spec.homepage = "https://github.com/janko-m/image_processing"
12
+ spec.license = "MIT"
13
+
14
+ spec.files = Dir["README.md", "LICENSE.txt", "lib/**/*", "image_processing.gemspec"]
15
+ spec.require_paths = ["lib"]
16
+
17
+ spec.add_development_dependency "minitest", "~> 5.8"
18
+ spec.add_development_dependency "minitest-hooks"
19
+ spec.add_development_dependency "minispec-metadata"
20
+ spec.add_development_dependency "mini_magick", ">= 4.3.5"
21
+ spec.add_development_dependency "phashion"
22
+ end
@@ -0,0 +1,179 @@
1
+ require "image_processing/version"
2
+ require "mini_magick"
3
+ require "tempfile"
4
+
5
+ if MiniMagick.version < Gem::Version.new("4.3.5")
6
+ raise "image_processing requires mini_magick version >= 4.3.5"
7
+ end
8
+
9
+ module ImageProcessing
10
+ module MiniMagick
11
+ def self.nondestructive_alias(name, original)
12
+ define_method(name) do |image, *args, &block|
13
+ send(original, _copy_to_tempfile(image), *args, &block)
14
+ end
15
+ end
16
+
17
+ module_function
18
+
19
+ # Changes the image encoding format to the given format
20
+ #
21
+ # @see http://www.imagemagick.org/script/command-line-options.php#format
22
+ # @param [MiniMagick::Image] image the image to convert
23
+ # @param [String] format the format to convert to
24
+ # @yield [MiniMagick::Tool::Mogrify, MiniMagick::Tool::Convert]
25
+ # @return [File, Tempfile]
26
+ def convert!(image, format, &block)
27
+ _with_minimagick(image) do |img|
28
+ img.format(format.downcase, nil, &block)
29
+ end
30
+ end
31
+ nondestructive_alias :convert, :convert!
32
+
33
+ # Resize the image to fit within the specified dimensions while retaining
34
+ # the original aspect ratio. Will only resize the image if it is larger
35
+ # than the specified dimensions. The resulting image may be shorter or
36
+ # narrower than specified in either dimension but will not be larger than
37
+ # the specified values.
38
+ #
39
+ # @param [MiniMagick::Image] image the image to convert
40
+ # @param [#to_s] width the maximum width
41
+ # @param [#to_s] height the maximum height
42
+ # @yield [MiniMagick::Tool::Mogrify, MiniMagick::Tool::Convert]
43
+ # @return [File, Tempfile]
44
+ def resize_to_limit!(image, width, height)
45
+ _with_minimagick(image) do |img|
46
+ img.combine_options do |cmd|
47
+ yield cmd if block_given?
48
+ cmd.resize "#{width}x#{height}>"
49
+ end
50
+ end
51
+ end
52
+ nondestructive_alias :resize_to_limit, :resize_to_limit!
53
+
54
+ # Resize the image to fit within the specified dimensions while retaining
55
+ # the original aspect ratio. The image may be shorter or narrower than
56
+ # specified in the smaller dimension but will not be larger than the
57
+ # specified values.
58
+ #
59
+ # @param [MiniMagick::Image] image the image to convert
60
+ # @param [#to_s] width the width to fit into
61
+ # @param [#to_s] height the height to fit into
62
+ # @yield [MiniMagick::Tool::Mogrify, MiniMagick::Tool::Convert]
63
+ # @return [File, Tempfile]
64
+ def resize_to_fit!(image, width, height)
65
+ _with_minimagick(image) do |img|
66
+ img.combine_options do |cmd|
67
+ yield cmd if block_given?
68
+ cmd.resize "#{width}x#{height}"
69
+ end
70
+ end
71
+ end
72
+ nondestructive_alias :resize_to_fit, :resize_to_fit!
73
+
74
+ # Resize the image so that it is at least as large in both dimensions as
75
+ # specified, then crops any excess outside the specified dimensions.
76
+ #
77
+ # The resulting image will always be exactly as large as the specified
78
+ # dimensions.
79
+ #
80
+ # By default, the center part of the image is kept, and the remainder
81
+ # cropped off, but this can be changed via the `gravity` option.
82
+ #
83
+ # @param [MiniMagick::Image] image the image to convert
84
+ # @param [#to_s] width the width to fill out
85
+ # @param [#to_s] height the height to fill out
86
+ # @param [String] gravity which part of the image to focus on
87
+ # @yield [MiniMagick::Tool::Mogrify, MiniMagick::Tool::Convert]
88
+ # @return [File, Tempfile]
89
+ # @see http://www.imagemagick.org/script/command-line-options.php#gravity
90
+ def resize_to_fill!(image, width, height, gravity: "Center")
91
+ _with_minimagick(image) do |img|
92
+ img.combine_options do |cmd|
93
+ yield cmd if block_given?
94
+ cmd.resize "#{width}x#{height}^"
95
+ cmd.gravity gravity
96
+ cmd.extent "#{width}x#{height}"
97
+ end
98
+ end
99
+ end
100
+ nondestructive_alias :resize_to_fill, :resize_to_fill!
101
+
102
+ # Resize the image to fit within the specified dimensions while retaining
103
+ # the original aspect ratio in the same way as {#fill}. Unlike {#fill} it
104
+ # will, if necessary, pad the remaining area with the given color, which
105
+ # defaults to transparent where supported by the image format and white
106
+ # otherwise.
107
+ #
108
+ # The resulting image will always be exactly as large as the specified
109
+ # dimensions.
110
+ #
111
+ # By default, the image will be placed in the center but this can be
112
+ # changed via the `gravity` option.
113
+ #
114
+ # @param [MiniMagick::image] image the image to convert
115
+ # @param [#to_s] width the width to fill out
116
+ # @param [#to_s] height the height to fill out
117
+ # @param [string] background the color to use as a background
118
+ # @param [string] gravity which part of the image to focus on
119
+ # @yield [MiniMagick::Tool::Mogrify, MiniMagick::Tool::Convert]
120
+ # @return [File, Tempfile]
121
+ # @see http://www.imagemagick.org/script/color.php
122
+ # @see http://www.imagemagick.org/script/command-line-options.php#gravity
123
+ def resize_and_pad!(image, width, height, background: "transparent", gravity: "Center")
124
+ _with_minimagick(image) do |img|
125
+ img.combine_options do |cmd|
126
+ yield cmd if block_given?
127
+ cmd.resize "#{width}x#{height}"
128
+ if background == "transparent"
129
+ cmd.background "rgba(255, 255, 255, 0.0)"
130
+ else
131
+ cmd.background background
132
+ end
133
+ cmd.gravity gravity
134
+ cmd.extent "#{width}x#{height}"
135
+ end
136
+ end
137
+ end
138
+ nondestructive_alias :resize_and_pad, :resize_and_pad!
139
+
140
+ # Resample the image to fit within the specified resolution while retaining
141
+ # the original image size.
142
+ #
143
+ # The resulting image will always be the same pixel size as the source with
144
+ # an adjusted resolution dimensions.
145
+ #
146
+ # @param [MiniMagick::Image] img the image to convert
147
+ # @param [#to_s] width the dpi width
148
+ # @param [#to_s] height the dpi height
149
+ # @yield [MiniMagick::Tool::Mogrify, MiniMagick::Tool::Convert]
150
+ # @return [File, Tempfile]
151
+ # @see http://www.imagemagick.org/script/command-line-options.php#resample
152
+ def resample!(image, width, height)
153
+ _with_minimagick(image) do |img|
154
+ img.combine_options do |cmd|
155
+ yield cmd if block_given?
156
+ cmd.resample "#{width}x#{height}"
157
+ end
158
+ end
159
+ end
160
+ nondestructive_alias :resample, :resample!
161
+
162
+ # Convert an image into a MiniMagick::Image for the duration of the block,
163
+ # and at the end return a File object.
164
+ def _with_minimagick(image)
165
+ image = ::MiniMagick::Image.new(image.path, image)
166
+ yield image
167
+ image.instance_variable_get("@tempfile")
168
+ end
169
+
170
+ # Creates a copy of the file and stores it into a Tempfile. Works for any
171
+ # IO object that responds to `#read(length = nil, outbuf = nil)`.
172
+ def _copy_to_tempfile(file)
173
+ args = [File.basename(file.path, ".*"), File.extname(file.path)] if file.respond_to?(:path)
174
+ tempfile = Tempfile.new(args || "image", binmode: true)
175
+ IO.copy_stream(file, tempfile.path)
176
+ tempfile
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,3 @@
1
+ module ImageProcessing
2
+ VERSION = "0.2.1"
3
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: image_processing
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Janko Marohnić
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest-hooks
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minispec-metadata
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
+ - !ruby/object:Gem::Dependency
56
+ name: mini_magick
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 4.3.5
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 4.3.5
69
+ - !ruby/object:Gem::Dependency
70
+ name: phashion
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Set of higher-level helper methods for image processing.
84
+ email:
85
+ - janko.marohnic@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - LICENSE.txt
91
+ - README.md
92
+ - image_processing.gemspec
93
+ - lib/image_processing/mini_magick.rb
94
+ - lib/image_processing/version.rb
95
+ homepage: https://github.com/janko-m/image_processing
96
+ licenses:
97
+ - MIT
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 2.4.5
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: Set of higher-level helper methods for image processing.
119
+ test_files: []
120
+ has_rdoc: