vips-process 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/README.md +72 -0
- data/lib/vips-process/crop.rb +80 -0
- data/lib/vips-process/quality.rb +4 -1
- data/lib/vips-process/resize.rb +12 -0
- data/lib/vips-process/shrink.rb +26 -0
- data/lib/vips-process/version.rb +1 -1
- data/lib/vips-process.rb +11 -13
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c8e1e34b16c24916ce653fbfe90b964274f682a
|
4
|
+
data.tar.gz: 73aaec174e1753e341b62d09071e1df0fdbacd16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3b161ce5417e820d6b41e69174df595119902fea500ccc7c0e18be1c07f058a2583d14b175b209ef406c96c68dca8f298f157227fbeb35239c04eb60ac9de3f
|
7
|
+
data.tar.gz: d4168159430c88bc9a7dab8ad5ff0b5bc17e876900ad5fa5bf11d7c83ddaacfcd27b8f18c203e0cdbe1d9cd313b1e19679b2795d152c5a1ec1075ca0adeb9790
|
data/README.md
CHANGED
@@ -164,6 +164,78 @@ The first argument is the `format` we'll conver the file to (jpeg or png) and
|
|
164
164
|
the second one is an optional hash of `options` to be passed to the converting function
|
165
165
|
(ie, :interlace => true for png).
|
166
166
|
|
167
|
+
### Crop
|
168
|
+
|
169
|
+
Crop an image in the desired dimentions.
|
170
|
+
|
171
|
+
Usage:
|
172
|
+
|
173
|
+
Include it in your image class `include Vips::Process::Crop` and
|
174
|
+
call it `MyImage.new('/path/to/src.jpg').crop(height: 100, top: 0.5)`.
|
175
|
+
|
176
|
+
Because it's arguments can be used in so many different ways I've decided to make them keyword
|
177
|
+
arguments with a default that would give you the same image back.
|
178
|
+
|
179
|
+
There are four possible arguments in total: `width`, `height`, `left` and `top`.
|
180
|
+
|
181
|
+
`width` and `height` do just that: they crop the resulting image in size.
|
182
|
+
|
183
|
+
`left` and `top` are slightly different as they operate in two modes: if you use an Integer it's
|
184
|
+
the just the offset. However, if a Float between 0 and 1 is passed it's used to position the cropping
|
185
|
+
mask accordingly to the `width` and or `height` respectively. This is probable best seen with an
|
186
|
+
example:
|
187
|
+
|
188
|
+
```
|
189
|
+
Given:
|
190
|
+
|
191
|
+
i=image cm=crop mask
|
192
|
+
________ ________
|
193
|
+
| | | |
|
194
|
+
| | | |
|
195
|
+
| | --------
|
196
|
+
| |
|
197
|
+
| |
|
198
|
+
________
|
199
|
+
|
200
|
+
|
201
|
+
crop height: cm.height, top: 0.0 will result in:
|
202
|
+
|
203
|
+
________
|
204
|
+
| final|
|
205
|
+
| img |
|
206
|
+
--------
|
207
|
+
| |
|
208
|
+
| x |
|
209
|
+
________
|
210
|
+
|
211
|
+
crop height: cm.height, top: 0.5 will result in:
|
212
|
+
|
213
|
+
________
|
214
|
+
| x |
|
215
|
+
--------
|
216
|
+
| final|
|
217
|
+
| img |
|
218
|
+
--------
|
219
|
+
| x |
|
220
|
+
________
|
221
|
+
|
222
|
+
crop height: cm.height, top: 1.0 will result in:
|
223
|
+
________
|
224
|
+
| |
|
225
|
+
| x |
|
226
|
+
--------
|
227
|
+
| final|
|
228
|
+
| img |
|
229
|
+
________
|
230
|
+
```
|
231
|
+
|
232
|
+
It's also very powerful when used together with resize.
|
233
|
+
E.g.: say you have an image that is 3000x2000 px.
|
234
|
+
`image.resize_to_width(300).crop(height: 150, top: 0.5).process!` will first resize it to
|
235
|
+
300x200 px and then it will crop it using a 150 height mask positioned in the middle of the
|
236
|
+
resized image. It will give you an image of full width but with height starting at 25px and
|
237
|
+
finishing at 175px. Here's a graphical example:
|
238
|
+
|
167
239
|
### Quality
|
168
240
|
|
169
241
|
Changes quality of the image (if supported by the file format)
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Vips
|
2
|
+
module Process
|
3
|
+
module Crop
|
4
|
+
##
|
5
|
+
# Crop an image in the desired dimentions.
|
6
|
+
#
|
7
|
+
# Pretty much all arguments are optional making it very flexible for you to create all
|
8
|
+
# sort of croppings.
|
9
|
+
#
|
10
|
+
# @param left Number if it's a Float between 0 and 1 it will use that to create a band
|
11
|
+
# in which it will displace the width of it.
|
12
|
+
# if it's an Integer it's the offset from the left.
|
13
|
+
# @param top Number if it's a Float between 0 and 1 it will use that to create a band
|
14
|
+
# in which it will displace the height of it.
|
15
|
+
# if it's an Integer it's the offset from the top.
|
16
|
+
# @param width Integer the width to crop to
|
17
|
+
# @param height Integer the height to crop to
|
18
|
+
#
|
19
|
+
# It's very powerful when used with resize. E.g.: say you have an image that is 3000x2000 px.
|
20
|
+
# `image.resize_to_width(300).crop(height: 150, top: 0.5).process!` will first resize it to
|
21
|
+
# 300x200 px and then it will crop it using a 150 height mask positioned in the middle of the
|
22
|
+
# resized image. It will give you an image of full width but with height starting at 25px and
|
23
|
+
# finishing at 175px. Here's a graphical example:
|
24
|
+
#
|
25
|
+
# Given:
|
26
|
+
#
|
27
|
+
# i=image cm=crop mask
|
28
|
+
# ________ ________
|
29
|
+
# | | | |
|
30
|
+
# | | | |
|
31
|
+
# | | --------
|
32
|
+
# | |
|
33
|
+
# | |
|
34
|
+
# ________
|
35
|
+
#
|
36
|
+
#
|
37
|
+
# crop height: cm.height, top: 0.0 will result in:
|
38
|
+
#
|
39
|
+
# ________
|
40
|
+
# | final|
|
41
|
+
# | img |
|
42
|
+
# --------
|
43
|
+
# | |
|
44
|
+
# | x |
|
45
|
+
# ________
|
46
|
+
#
|
47
|
+
# crop height: cm.height, top: 0.5 will result in:
|
48
|
+
#
|
49
|
+
# ________
|
50
|
+
# | x |
|
51
|
+
# --------
|
52
|
+
# | final|
|
53
|
+
# | img |
|
54
|
+
# --------
|
55
|
+
# | x |
|
56
|
+
# ________
|
57
|
+
#
|
58
|
+
# crop height: cm.height, top: 1.0 will result in:
|
59
|
+
# ________
|
60
|
+
# | |
|
61
|
+
# | x |
|
62
|
+
# --------
|
63
|
+
# | final|
|
64
|
+
# | img |
|
65
|
+
# ________
|
66
|
+
#
|
67
|
+
def crop(left: 0, top: 0, width: nil, height: nil)
|
68
|
+
manipulate! do |image|
|
69
|
+
width ||= image.x_size
|
70
|
+
height ||= image.y_size
|
71
|
+
top = top.is_a?(Float) && top.between?(0,1) ? (image.y_size - height) * top : top
|
72
|
+
left = left.is_a?(Float) && left.between?(0,1) ? (image.x_size - width) * left : left
|
73
|
+
|
74
|
+
image.extract_area left, top, width, height
|
75
|
+
end
|
76
|
+
self
|
77
|
+
end
|
78
|
+
end # Crop
|
79
|
+
end # Process
|
80
|
+
end # Vips
|
data/lib/vips-process/quality.rb
CHANGED
@@ -7,7 +7,10 @@ module Vips
|
|
7
7
|
# @param percent Integer quality from 0 to 100
|
8
8
|
def quality(percent=75)
|
9
9
|
manipulate! do |image|
|
10
|
-
|
10
|
+
if jpeg? || @_format == JPEG
|
11
|
+
@_format_opts ||= {}
|
12
|
+
@_format_opts[:quality]
|
13
|
+
end
|
11
14
|
image
|
12
15
|
end
|
13
16
|
self
|
data/lib/vips-process/resize.rb
CHANGED
@@ -76,6 +76,18 @@ module Vips
|
|
76
76
|
self
|
77
77
|
end
|
78
78
|
|
79
|
+
##
|
80
|
+
# Resize the image to a certain height. It will keep its width in relation.
|
81
|
+
#
|
82
|
+
# @param height Integer the height to scale the image to
|
83
|
+
def resize_to_height(height)
|
84
|
+
manipulate! do |image|
|
85
|
+
resize_image image, image.x_size, height
|
86
|
+
end
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
90
|
+
|
79
91
|
private def resize_image(image, width, height, min_or_max = :min)
|
80
92
|
ratio = get_ratio image, width, height, min_or_max
|
81
93
|
return image if ratio == 1
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# module Vips
|
2
|
+
# module Process
|
3
|
+
# module Shrink
|
4
|
+
# def shrink_load()
|
5
|
+
# if jpeg?
|
6
|
+
# image = VIPS::Image.jpeg @src
|
7
|
+
|
8
|
+
# largest_dimension = [image.x_size, image.y_size].max
|
9
|
+
|
10
|
+
# shrink = largest_dimension / size.to_f
|
11
|
+
# @_format_opts[:shrink_factor] = factor
|
12
|
+
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
|
16
|
+
# def shrink(factor)
|
17
|
+
# manipulate! do |image|
|
18
|
+
# if jpeg? || @_format == JPEG
|
19
|
+
# end
|
20
|
+
# image
|
21
|
+
# end
|
22
|
+
# self
|
23
|
+
# end
|
24
|
+
# end # Shrink
|
25
|
+
# end # Process
|
26
|
+
# end # Vips
|
data/lib/vips-process/version.rb
CHANGED
data/lib/vips-process.rb
CHANGED
@@ -6,26 +6,23 @@ module Vips
|
|
6
6
|
JPEG = 'jpeg'.freeze
|
7
7
|
PNG = 'png'.freeze
|
8
8
|
|
9
|
+
def sequential(val=true)
|
10
|
+
@_load_opts[:sequential] = val if jpeg? || png?
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
9
14
|
##
|
10
15
|
# Manipulate the image with Vips. Saving of the image is delayed until after
|
11
16
|
# all the process blocks have been called. Make sure you always return an
|
12
17
|
# VIPS::Image object from the block
|
13
18
|
#
|
14
19
|
# This method yields VIPS::Image for further manipulation.
|
15
|
-
#
|
16
|
-
# It also raises an Exception if the manipulation failed.
|
17
20
|
def manipulate!
|
21
|
+
@_load_opts ||= {}
|
18
22
|
@_on_process ||= []
|
19
|
-
@
|
20
|
-
|
21
|
-
|
22
|
-
VIPS::Image.png @src, sequential: true
|
23
|
-
else
|
24
|
-
VIPS::Image.new @src
|
25
|
-
end
|
26
|
-
@_vimage = yield @_vimage
|
27
|
-
rescue => e
|
28
|
-
raise Exception.new("Failed to manipulate file, maybe it is not a supported image? Original Error: #{e}")
|
23
|
+
@_type ||= jpeg? ? :jpeg : (png? ? :png : :new)
|
24
|
+
@_vimage ||= VIPS::Image.send @_type, @src, @_load_opts
|
25
|
+
@_vimage = yield @_vimage
|
29
26
|
end
|
30
27
|
|
31
28
|
def process!
|
@@ -72,8 +69,9 @@ module Vips
|
|
72
69
|
end
|
73
70
|
|
74
71
|
private def reset!
|
72
|
+
@_load_opts = {}
|
75
73
|
@_on_process = []
|
76
|
-
@_format_opts =
|
74
|
+
@_format_opts = {}
|
77
75
|
@_vimage = nil
|
78
76
|
end
|
79
77
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vips-process
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darío Javier Cravero
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-vips
|
@@ -96,9 +96,11 @@ files:
|
|
96
96
|
- lib/vips-process/auto-orient.rb
|
97
97
|
- lib/vips-process/base.rb
|
98
98
|
- lib/vips-process/convert.rb
|
99
|
+
- lib/vips-process/crop.rb
|
99
100
|
- lib/vips-process/gaussian-blur.rb
|
100
101
|
- lib/vips-process/quality.rb
|
101
102
|
- lib/vips-process/resize.rb
|
103
|
+
- lib/vips-process/shrink.rb
|
102
104
|
- lib/vips-process/strip.rb
|
103
105
|
- lib/vips-process/version.rb
|
104
106
|
- test/helpers.rb
|