g1nn13-image_science 1.2.6 → 1.2.7
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/Manifest.txt +5 -0
- data/lib/image_science.rb +63 -85
- data/test/bearry.png +0 -0
- data/test/biggie.png +0 -0
- data/test/godzilla.png +0 -0
- data/test/landscape.png +0 -0
- data/test/portrait.png +0 -0
- metadata +38 -89
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -5
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
data/lib/image_science.rb
CHANGED
@@ -13,7 +13,7 @@ require 'inline'
|
|
13
13
|
# Based on ImageScience 1.2.1
|
14
14
|
|
15
15
|
class ImageScience
|
16
|
-
VERSION = '1.2.
|
16
|
+
VERSION = '1.2.7'
|
17
17
|
|
18
18
|
##
|
19
19
|
# The top-level image loader opens +path+ and then yields the image.
|
@@ -57,79 +57,6 @@ class ImageScience
|
|
57
57
|
def buffer(extension) # :yields: image
|
58
58
|
end
|
59
59
|
|
60
|
-
|
61
|
-
##
|
62
|
-
# Resizes an image to the specified size without stretching or
|
63
|
-
# compressing the original. If the aspect ratio of the new height/width
|
64
|
-
# does not match the aspect ratio of the original (as when converting
|
65
|
-
# portrait to landscape or landscape to portrait), the resulting
|
66
|
-
# image will be cropped. Cropping preserves the center of the image,
|
67
|
-
# with content trimmed evenly from the top and bottom and/or left and
|
68
|
-
# right edges of the image. This can cause some less than ideal
|
69
|
-
# conversions. For example, converting a portrait to a landscape can
|
70
|
-
# result in the portrait's head being cut off.
|
71
|
-
|
72
|
-
def resize_with_crop(width, height, &block)
|
73
|
-
|
74
|
-
# ---------------------------------------------------------------
|
75
|
-
# We want to adjust both height and width by the same ratio,
|
76
|
-
# so the image is not stretched. Adjust everything by the
|
77
|
-
# larger ratio, so that portrait to landscape and landscape
|
78
|
-
# to portrait transformations come out right.
|
79
|
-
# ---------------------------------------------------------------
|
80
|
-
src2target_height_ratio = height.to_f / self.height
|
81
|
-
src2target_width_ratio = width.to_f / self.width
|
82
|
-
height_ratio_is_larger = src2target_height_ratio > src2target_width_ratio
|
83
|
-
if height_ratio_is_larger
|
84
|
-
target_height = (self.height * src2target_height_ratio).round
|
85
|
-
target_width = (self.width * src2target_height_ratio).round
|
86
|
-
else
|
87
|
-
target_height = (self.height * src2target_width_ratio).round
|
88
|
-
target_width = (self.width * src2target_width_ratio).round
|
89
|
-
end
|
90
|
-
|
91
|
-
# ---------------------------------------------------------------
|
92
|
-
# Create a version of this image whose longest
|
93
|
-
# side is equal to max_dimension. We'll add two
|
94
|
-
# to this value, since floating point arithmetic
|
95
|
-
# often produces values 1-2 pixels short of what we want.
|
96
|
-
# ---------------------------------------------------------------
|
97
|
-
max_dimension = (target_height > target_width ?
|
98
|
-
target_height : target_width)
|
99
|
-
|
100
|
-
self.thumbnail(max_dimension + 2) do |img1|
|
101
|
-
top, left = 0, 0
|
102
|
-
top = (img1.height - height) / 2 unless img1.height < height
|
103
|
-
left = (img1.width - width) / 2 unless img1.width < width
|
104
|
-
right = width + left
|
105
|
-
bottom = height + top
|
106
|
-
|
107
|
-
# ---------------------------------------------------------------
|
108
|
-
# Crop the resized image evenly at top/bottom, left/right,
|
109
|
-
# so that we preserve the center.
|
110
|
-
# ---------------------------------------------------------------
|
111
|
-
result = img1.with_crop(left, top, right, bottom) do |img2|
|
112
|
-
if block_given?
|
113
|
-
yield img2
|
114
|
-
else
|
115
|
-
return img2
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
if result.nil?
|
120
|
-
message = "Crop/resize failed... is some dimension is out of bounds?"
|
121
|
-
message += "Original Height = #{self.height}, Width = #{self.width}"
|
122
|
-
message += "Target Height = #{height}, Width = #{width}"
|
123
|
-
message += "Actual Height = #{self.height}, Width = #{self.width}"
|
124
|
-
message += "Left=#{left}, Top=#{top}, Right=#{right}, Bottom=#{bottom}"
|
125
|
-
raise message
|
126
|
-
end
|
127
|
-
|
128
|
-
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
|
133
60
|
##
|
134
61
|
# Resizes the image to +width+ and +height+ using a cubic-bspline
|
135
62
|
# filter and yields the new image.
|
@@ -197,20 +124,71 @@ class ImageScience
|
|
197
124
|
end
|
198
125
|
|
199
126
|
##
|
200
|
-
#
|
201
|
-
#
|
202
|
-
#
|
127
|
+
# Resizes an image to the specified size without stretching or
|
128
|
+
# compressing the original. If the aspect ratio of the new height/width
|
129
|
+
# does not match the aspect ratio of the original (as when converting
|
130
|
+
# portrait to landscape or landscape to portrait), the resulting
|
131
|
+
# image will be cropped. Cropping preserves the center of the image,
|
132
|
+
# with content trimmed evenly from the top and bottom and/or left and
|
133
|
+
# right edges of the image. This can cause some less than ideal
|
134
|
+
# conversions. For example, converting a portrait to a landscape can
|
135
|
+
# result in the portrait's head being cut off.
|
203
136
|
|
204
|
-
def
|
205
|
-
w, h = width, height
|
206
|
-
l, t, r, b, half = 0, 0, w, h, (w - h).abs / 2
|
137
|
+
def resize_with_crop(width, height, &block)
|
207
138
|
|
208
|
-
|
209
|
-
|
139
|
+
# ---------------------------------------------------------------
|
140
|
+
# We want to adjust both height and width by the same ratio,
|
141
|
+
# so the image is not stretched. Adjust everything by the
|
142
|
+
# larger ratio, so that portrait to landscape and landscape
|
143
|
+
# to portrait transformations come out right.
|
144
|
+
# ---------------------------------------------------------------
|
145
|
+
src2target_height_ratio = height.to_f / self.height
|
146
|
+
src2target_width_ratio = width.to_f / self.width
|
147
|
+
height_ratio_is_larger = src2target_height_ratio > src2target_width_ratio
|
148
|
+
|
149
|
+
if height_ratio_is_larger
|
150
|
+
target_height = (self.height * src2target_height_ratio).round
|
151
|
+
target_width = (self.width * src2target_height_ratio).round
|
152
|
+
else
|
153
|
+
target_height = (self.height * src2target_width_ratio).round
|
154
|
+
target_width = (self.width * src2target_width_ratio).round
|
155
|
+
end
|
210
156
|
|
211
|
-
|
212
|
-
|
213
|
-
|
157
|
+
# ---------------------------------------------------------------
|
158
|
+
# Create a version of this image whose longest
|
159
|
+
# side is equal to max_dimension. We'll add two
|
160
|
+
# to this value, since floating point arithmetic
|
161
|
+
# often produces values 1-2 pixels short of what we want.
|
162
|
+
# ---------------------------------------------------------------
|
163
|
+
max_dimension = (target_height > target_width ?
|
164
|
+
target_height : target_width)
|
165
|
+
|
166
|
+
self.thumbnail(max_dimension + 2) do |img1|
|
167
|
+
top, left = 0, 0
|
168
|
+
top = (img1.height - height) / 2 unless img1.height < height
|
169
|
+
left = (img1.width - width) / 2 unless img1.width < width
|
170
|
+
right = width + left
|
171
|
+
bottom = height + top
|
172
|
+
|
173
|
+
# ---------------------------------------------------------------
|
174
|
+
# Crop the resized image evenly at top/bottom, left/right,
|
175
|
+
# so that we preserve the center.
|
176
|
+
# ---------------------------------------------------------------
|
177
|
+
result = img1.with_crop(left, top, right, bottom) do |img2|
|
178
|
+
if block_given?
|
179
|
+
yield img2
|
180
|
+
else
|
181
|
+
return img2
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
if result.nil?
|
186
|
+
message = "Crop/resize failed... is some dimension is out of bounds?"
|
187
|
+
message += "Original Height = #{self.height}, Width = #{self.width}"
|
188
|
+
message += "Target Height = #{height}, Width = #{width}"
|
189
|
+
message += "Actual Height = #{self.height}, Width = #{self.width}"
|
190
|
+
message += "Left=#{left}, Top=#{top}, Right=#{right}, Bottom=#{bottom}"
|
191
|
+
raise message
|
214
192
|
end
|
215
193
|
end
|
216
194
|
end
|
data/test/bearry.png
ADDED
Binary file
|
data/test/biggie.png
ADDED
Binary file
|
data/test/godzilla.png
ADDED
Binary file
|
data/test/landscape.png
ADDED
Binary file
|
data/test/portrait.png
ADDED
Binary file
|
metadata
CHANGED
@@ -1,141 +1,87 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: g1nn13-image_science
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 1
|
7
|
-
- 2
|
8
|
-
- 6
|
9
|
-
version: 1.2.6
|
4
|
+
version: 1.2.7
|
10
5
|
platform: ruby
|
11
6
|
authors:
|
12
7
|
- jim nist
|
13
8
|
autorequire:
|
14
9
|
bindir: bin
|
15
|
-
cert_chain:
|
16
|
-
- |
|
17
|
-
-----BEGIN CERTIFICATE-----
|
18
|
-
MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMQwwCgYDVQQDDANqaW0x
|
19
|
-
HDAaBgoJkiaJk/IsZAEZFgxob3RlbGljb3B0ZXIxEzARBgoJkiaJk/IsZAEZFgNj
|
20
|
-
b20wHhcNMTAwNTI2MTYwNTM5WhcNMTEwNTI2MTYwNTM5WjBBMQwwCgYDVQQDDANq
|
21
|
-
aW0xHDAaBgoJkiaJk/IsZAEZFgxob3RlbGljb3B0ZXIxEzARBgoJkiaJk/IsZAEZ
|
22
|
-
FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzbudw4TyxDTEj
|
23
|
-
/UMsEt2LFWmDiEKmyKHnHiPdjINn/wY8yYw1oujRj2c2iXlaon68u8G+1qacfyd0
|
24
|
-
gpHPFQfqBFKLDtPgPffzAkY8fvW4MgjRYFcymdpiVGpHCoTgvhO9Efsrd/d8Ja4n
|
25
|
-
oeEPNHdXr/bHwLhgIAup6JYQAZSL1DY77co3rbvY1xqovbc6tg/M7cbXPp1lmONS
|
26
|
-
XwIHPWjsl3mL1IWEQPt2dmPy6ZLYliKowdGlDUblupXuVlO9cS67yf3MlJp874mY
|
27
|
-
yH1qAwSK/Toe2L39TTi/Hyx6HMFECTmkLUT/4X2z6zWUlK0e5Hr8ViBCzh2BTOyO
|
28
|
-
jojoYo7tAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
29
|
-
BBQ1LMdE7DCtf+7x6tJAqGRMKMtVXDANBgkqhkiG9w0BAQUFAAOCAQEAIu7ygDoV
|
30
|
-
g5wdi3wWR//1yK86vQe36luyolo3GL+Z0FmIIA+tdAPZtMAlnFasOSfLVDdkxb3O
|
31
|
-
J2MLyH5KHY5asc27J+Y/zUofGWj5JgQZIg+gAGcDuq94kr4NXgFTL4khE3zhI4uH
|
32
|
-
65+zkHrnetmZPilpTbFjzvM1SfuzrU9t+ugEu7R1vmAQdhdcgSwXr0MYPy5oZWgQ
|
33
|
-
eayeSBRjd6tzceXRmaZYWDH2wra509l63UgJw6dsNgWzQH1XQ1XzqJXX/J8FRgDI
|
34
|
-
n3ugwImcS/YB+ZQ3TQ3uKX8E5Ikos7YH0Pc/WRQnMzcjBmNtx7GsV9MC9Qx/i+YC
|
35
|
-
UHHftgnvI+YPGw==
|
36
|
-
-----END CERTIFICATE-----
|
10
|
+
cert_chain: []
|
37
11
|
|
38
12
|
date: 2010-05-26 00:00:00 -04:00
|
39
13
|
default_executable:
|
40
14
|
dependencies:
|
41
15
|
- !ruby/object:Gem::Dependency
|
42
16
|
name: hoe
|
43
|
-
|
44
|
-
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
20
|
requirements:
|
46
21
|
- - ">="
|
47
22
|
- !ruby/object:Gem::Version
|
48
|
-
segments:
|
49
|
-
- 2
|
50
|
-
- 5
|
51
|
-
- 0
|
52
23
|
version: 2.5.0
|
53
|
-
|
54
|
-
version_requirements: *id001
|
24
|
+
version:
|
55
25
|
- !ruby/object:Gem::Dependency
|
56
26
|
name: gemcutter
|
57
|
-
|
58
|
-
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
30
|
requirements:
|
60
31
|
- - ">="
|
61
32
|
- !ruby/object:Gem::Version
|
62
|
-
segments:
|
63
|
-
- 0
|
64
|
-
- 3
|
65
|
-
- 0
|
66
33
|
version: 0.3.0
|
67
|
-
|
68
|
-
version_requirements: *id002
|
34
|
+
version:
|
69
35
|
- !ruby/object:Gem::Dependency
|
70
36
|
name: hoe-doofus
|
71
|
-
|
72
|
-
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
40
|
requirements:
|
74
41
|
- - ">="
|
75
42
|
- !ruby/object:Gem::Version
|
76
|
-
segments:
|
77
|
-
- 1
|
78
|
-
- 0
|
79
|
-
- 0
|
80
43
|
version: 1.0.0
|
81
|
-
|
82
|
-
version_requirements: *id003
|
44
|
+
version:
|
83
45
|
- !ruby/object:Gem::Dependency
|
84
46
|
name: hoe-git
|
85
|
-
|
86
|
-
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
50
|
requirements:
|
88
51
|
- - ">="
|
89
52
|
- !ruby/object:Gem::Version
|
90
|
-
segments:
|
91
|
-
- 1
|
92
|
-
- 3
|
93
|
-
- 0
|
94
53
|
version: 1.3.0
|
95
|
-
|
96
|
-
version_requirements: *id004
|
54
|
+
version:
|
97
55
|
- !ruby/object:Gem::Dependency
|
98
56
|
name: hoe-telicopter
|
99
|
-
|
100
|
-
|
57
|
+
type: :development
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
101
60
|
requirements:
|
102
61
|
- - ">="
|
103
62
|
- !ruby/object:Gem::Version
|
104
|
-
segments:
|
105
|
-
- 1
|
106
|
-
- 0
|
107
|
-
- 0
|
108
63
|
version: 1.0.0
|
109
|
-
|
110
|
-
version_requirements: *id005
|
64
|
+
version:
|
111
65
|
- !ruby/object:Gem::Dependency
|
112
66
|
name: minitest
|
113
|
-
|
114
|
-
|
67
|
+
type: :development
|
68
|
+
version_requirement:
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
115
70
|
requirements:
|
116
71
|
- - ">="
|
117
72
|
- !ruby/object:Gem::Version
|
118
|
-
segments:
|
119
|
-
- 1
|
120
|
-
- 5
|
121
|
-
- 0
|
122
73
|
version: 1.5.0
|
123
|
-
|
124
|
-
version_requirements: *id006
|
74
|
+
version:
|
125
75
|
- !ruby/object:Gem::Dependency
|
126
76
|
name: hoe
|
127
|
-
|
128
|
-
|
77
|
+
type: :development
|
78
|
+
version_requirement:
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
129
80
|
requirements:
|
130
81
|
- - ">="
|
131
82
|
- !ruby/object:Gem::Version
|
132
|
-
segments:
|
133
|
-
- 2
|
134
|
-
- 6
|
135
|
-
- 0
|
136
83
|
version: 2.6.0
|
137
|
-
|
138
|
-
version_requirements: *id007
|
84
|
+
version:
|
139
85
|
description: |-
|
140
86
|
g1nn13 fork changes:
|
141
87
|
|
@@ -171,7 +117,12 @@ files:
|
|
171
117
|
- bench.rb
|
172
118
|
- bin/image_science_thumb
|
173
119
|
- lib/image_science.rb
|
120
|
+
- test/bearry.png
|
121
|
+
- test/biggie.png
|
122
|
+
- test/godzilla.png
|
123
|
+
- test/landscape.png
|
174
124
|
- test/pix.png
|
125
|
+
- test/portrait.png
|
175
126
|
- test/test_image_science.rb
|
176
127
|
has_rdoc: true
|
177
128
|
homepage: http://github.com/g1nn13/image_science
|
@@ -187,20 +138,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
187
138
|
requirements:
|
188
139
|
- - ">="
|
189
140
|
- !ruby/object:Gem::Version
|
190
|
-
segments:
|
191
|
-
- 0
|
192
141
|
version: "0"
|
142
|
+
version:
|
193
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
194
144
|
requirements:
|
195
145
|
- - ">="
|
196
146
|
- !ruby/object:Gem::Version
|
197
|
-
segments:
|
198
|
-
- 0
|
199
147
|
version: "0"
|
148
|
+
version:
|
200
149
|
requirements: []
|
201
150
|
|
202
151
|
rubyforge_project: g1nn13-image_science
|
203
|
-
rubygems_version: 1.3.
|
152
|
+
rubygems_version: 1.3.5
|
204
153
|
signing_key:
|
205
154
|
specification_version: 3
|
206
155
|
summary: "g1nn13 fork changes: * added buffer() method to get image buffer for writing (to Amazon S3) * added fit_within() method to resize an image to fit within a specified height and width without changing the image's aspect ratio * added resize_with_crop() to resize and crop images where the target aspect ratio differs from the original aspect ratio"
|
data.tar.gz.sig
DELETED
Binary file
|