ruby-vips 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +15 -0
- data/Gemfile.lock +31 -0
- data/LICENSE +20 -0
- data/README.md +96 -0
- data/TODO +18 -0
- data/ext/extconf.rb +10 -0
- data/ext/header.c +440 -0
- data/ext/header.h +8 -0
- data/ext/image.c +639 -0
- data/ext/image.h +71 -0
- data/ext/image_arithmetic.c +940 -0
- data/ext/image_arithmetic.h +38 -0
- data/ext/image_boolean.c +302 -0
- data/ext/image_boolean.h +8 -0
- data/ext/image_colour.c +593 -0
- data/ext/image_colour.h +36 -0
- data/ext/image_conversion.c +863 -0
- data/ext/image_conversion.h +37 -0
- data/ext/image_convolution.c +371 -0
- data/ext/image_convolution.h +13 -0
- data/ext/image_freq_filt.c +742 -0
- data/ext/image_freq_filt.h +27 -0
- data/ext/image_histograms_lut.c +646 -0
- data/ext/image_histograms_lut.h +28 -0
- data/ext/image_morphology.c +330 -0
- data/ext/image_morphology.h +13 -0
- data/ext/image_mosaicing.c +556 -0
- data/ext/image_mosaicing.h +14 -0
- data/ext/image_relational.c +386 -0
- data/ext/image_relational.h +8 -0
- data/ext/image_resample.c +253 -0
- data/ext/image_resample.h +9 -0
- data/ext/interpolator.c +106 -0
- data/ext/interpolator.h +6 -0
- data/ext/mask.c +349 -0
- data/ext/mask.h +17 -0
- data/ext/reader.c +315 -0
- data/ext/ruby_vips.c +131 -0
- data/ext/ruby_vips.h +26 -0
- data/ext/writer.c +346 -0
- data/lib/vips.rb +7 -0
- data/lib/vips/reader.rb +183 -0
- data/lib/vips/version.rb +3 -0
- data/lib/vips/writer.rb +275 -0
- data/ruby-vips.gemspec +93 -0
- metadata +163 -0
data/lib/vips/version.rb
ADDED
data/lib/vips/writer.rb
ADDED
@@ -0,0 +1,275 @@
|
|
1
|
+
module VIPS
|
2
|
+
class Writer
|
3
|
+
def write(path)
|
4
|
+
write_internal path
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class CSVWriter < Writer
|
9
|
+
attr_accessor :separator
|
10
|
+
|
11
|
+
def initialize(image, options={})
|
12
|
+
super image
|
13
|
+
@separator = "\t"
|
14
|
+
|
15
|
+
self.separator = options[:separator] if options.has_key?(:separator)
|
16
|
+
end
|
17
|
+
|
18
|
+
def write(path)
|
19
|
+
write_internal "#{path}:sep:#{@separator}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class JPEGWriter < Writer
|
24
|
+
attr_reader :quality
|
25
|
+
|
26
|
+
def initialize(image, options={})
|
27
|
+
super image
|
28
|
+
|
29
|
+
@quality = 75
|
30
|
+
|
31
|
+
self.quality = options[:quality] if options.has_key?(:quality)
|
32
|
+
end
|
33
|
+
|
34
|
+
def write(path)
|
35
|
+
write_internal "#{path}:#{@quality}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_memory
|
39
|
+
buf_internal @quality
|
40
|
+
end
|
41
|
+
|
42
|
+
def quality=(quality_v)
|
43
|
+
unless (0..100).include?(quality_v)
|
44
|
+
raise ArgumentError, 'quality must be a numeric value between 0 and 100'
|
45
|
+
end
|
46
|
+
|
47
|
+
@quality = quality_v
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class PNGWriter < Writer
|
52
|
+
attr_reader :compression
|
53
|
+
attr_accessor :interlace
|
54
|
+
|
55
|
+
def initialize(image, options={})
|
56
|
+
super image
|
57
|
+
|
58
|
+
@compression = 6
|
59
|
+
@interlace = false
|
60
|
+
|
61
|
+
self.compression = options[:compression] if options.has_key?(:compression)
|
62
|
+
self.interlace = options[:interlace] if options.has_key?(:interlace)
|
63
|
+
end
|
64
|
+
|
65
|
+
def write(path)
|
66
|
+
write_internal "#{path}:#{@compression},#{@interlace ? 1 : 0}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_memory
|
70
|
+
buf_internal @compression, (@interlace ? 1 : 0)
|
71
|
+
end
|
72
|
+
|
73
|
+
def compression=(compression_v)
|
74
|
+
unless (0..9).include?(compression_v)
|
75
|
+
raise ArgumentError, 'compression must be a numeric value between 0 and 9'
|
76
|
+
end
|
77
|
+
|
78
|
+
@compression = compression_v
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class PPMWriter < Writer
|
83
|
+
attr_reader :format
|
84
|
+
|
85
|
+
FORMAT = [:binary, :ascii]
|
86
|
+
|
87
|
+
def initialize(image, options={})
|
88
|
+
super image
|
89
|
+
|
90
|
+
@format = :binary
|
91
|
+
|
92
|
+
self.format = options[:format] if options.has_key?(:format)
|
93
|
+
end
|
94
|
+
|
95
|
+
def write(path)
|
96
|
+
write_internal "#{path}:#{@format}"
|
97
|
+
end
|
98
|
+
|
99
|
+
def format=(format_v)
|
100
|
+
unless FORMAT.include?(format_v)
|
101
|
+
raise ArgumentError, "format must be one of #{FORMAT.join(', ')}"
|
102
|
+
end
|
103
|
+
|
104
|
+
@format = format_v
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
class TIFFWriter < Writer
|
109
|
+
attr_reader :compression, :layout, :multi_res, :format, :resolution_units,
|
110
|
+
:resolution, :predictor, :quality, :tile_size
|
111
|
+
|
112
|
+
COMPRESSION = [:none, :jpeg, :deflate, :packbits, :ccittfax4, :lzw]
|
113
|
+
PREDICTOR = [:none, :horizontal_differencing, :floating_point]
|
114
|
+
LAYOUT = [:strip, :tile]
|
115
|
+
MULTI_RES = [:flat, :pyramid]
|
116
|
+
FORMAT = [:manybit, :onebit]
|
117
|
+
RESOLUTION_UNITS = [:cm, :inch]
|
118
|
+
|
119
|
+
def initialize(image, options={})
|
120
|
+
super image
|
121
|
+
|
122
|
+
@compression = :none
|
123
|
+
@quality = 75
|
124
|
+
@predictor = :none
|
125
|
+
@layout = :strip
|
126
|
+
@tile_size = [128, 128]
|
127
|
+
@multi_res = :flat
|
128
|
+
@format = :manybit
|
129
|
+
@resolution_units = :cm
|
130
|
+
|
131
|
+
[ :compression, :layout, :multi_res, :format, :resolution_units,
|
132
|
+
:resolution, :predictor, :quality, :tile_size ].each do |att|
|
133
|
+
self.send "#{att}=".to_sym, options[att] if options.has_key?(att)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def write(path)
|
138
|
+
opts = [compression_str, layout_str, @multi_res, @format, resolution_str].join ','
|
139
|
+
write_internal "#{path}:#{opts}"
|
140
|
+
end
|
141
|
+
|
142
|
+
def compression_str
|
143
|
+
case @compression
|
144
|
+
when :jpeg then "#{@compression}:#{@quality}"
|
145
|
+
when :lzw, :deflate then "#{@compression}:#{@predictor}"
|
146
|
+
else @compression
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def layout_str
|
151
|
+
s = @layout
|
152
|
+
s << ":#{@tile_size.join 'x'}" if @layout == :tile
|
153
|
+
s
|
154
|
+
end
|
155
|
+
|
156
|
+
def resolution_str
|
157
|
+
s = "res_#{@resolution_units}"
|
158
|
+
s << ":#{@resolution.join 'x'}" if @resolution
|
159
|
+
s
|
160
|
+
end
|
161
|
+
|
162
|
+
def compression=(compression_v)
|
163
|
+
unless COMPRESSION.include?(compression_v)
|
164
|
+
raise ArgumentError, "compression must be one of #{COMPRESSION.join(', ')}"
|
165
|
+
end
|
166
|
+
|
167
|
+
@compression = compression_v
|
168
|
+
end
|
169
|
+
|
170
|
+
def quality=(quality_v)
|
171
|
+
unless (0..100).include?(quality_v)
|
172
|
+
raise ArgumentError, 'quality must be a numeric value between 0 and 100'
|
173
|
+
end
|
174
|
+
|
175
|
+
@quality = quality_v
|
176
|
+
end
|
177
|
+
|
178
|
+
def predictor=(predictor_v)
|
179
|
+
unless PREDICTOR.include?(predictor_v)
|
180
|
+
raise ArgumentError, "predictor must be one of #{PREDICTOR.join(', ')}"
|
181
|
+
end
|
182
|
+
|
183
|
+
@predictor = predictor_v
|
184
|
+
end
|
185
|
+
|
186
|
+
def layout=(layout_v)
|
187
|
+
unless LAYOUT.include?(layout_v)
|
188
|
+
raise ArgumentError, "layout must be one of #{LAYOUT.join(', ')}"
|
189
|
+
end
|
190
|
+
|
191
|
+
@layout = layout_v
|
192
|
+
end
|
193
|
+
|
194
|
+
def tile_size=(tile_size_v)
|
195
|
+
unless tile_size_v[0] > 1 && tile_size_v[1] > 1
|
196
|
+
raise ArgumentError, "tile sizes must be larger than 1"
|
197
|
+
end
|
198
|
+
|
199
|
+
@tile_size = tile_size_v
|
200
|
+
end
|
201
|
+
|
202
|
+
def multi_res=(multi_res_v)
|
203
|
+
unless MULTI_RES.include?(multi_res_v)
|
204
|
+
raise ArgumentError, "multi res must be one of #{MULTI_RES.join(', ')}"
|
205
|
+
end
|
206
|
+
|
207
|
+
@multi_res = multi_res_v
|
208
|
+
end
|
209
|
+
|
210
|
+
def format=(format_v)
|
211
|
+
unless FORMAT.include?(format_v)
|
212
|
+
raise ArgumentError, "format must be one of #{FORMAT.join(', ')}"
|
213
|
+
end
|
214
|
+
|
215
|
+
@format = format_v
|
216
|
+
end
|
217
|
+
|
218
|
+
def resolution_units=(resolution_units_v)
|
219
|
+
unless RESOLUTION_UNITS.include?(resolution_units_v)
|
220
|
+
raise ArgumentError, "Resolution units must be one of #{RESOLUTION_UNITS.join(', ')}"
|
221
|
+
end
|
222
|
+
|
223
|
+
@resolution_units = resolution_units_v
|
224
|
+
end
|
225
|
+
|
226
|
+
def resolution=(resolution_v)
|
227
|
+
unless resolution_v[0] > 0 && resolution_v[1] > 0
|
228
|
+
raise ArgumentError, "Resolution must have a height and width larger than 0"
|
229
|
+
end
|
230
|
+
|
231
|
+
@resolution = resolution_v
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
class Image
|
236
|
+
def csv(*args)
|
237
|
+
invoke_writer CSVWriter, *args
|
238
|
+
end
|
239
|
+
|
240
|
+
def jpeg(*args)
|
241
|
+
invoke_writer JPEGWriter, *args
|
242
|
+
end
|
243
|
+
|
244
|
+
def png(*args)
|
245
|
+
invoke_writer PNGWriter, *args
|
246
|
+
end
|
247
|
+
|
248
|
+
def ppm(*args)
|
249
|
+
invoke_writer PPMWriter, *args
|
250
|
+
end
|
251
|
+
|
252
|
+
def tiff(*args)
|
253
|
+
invoke_writer TIFFWriter, *args
|
254
|
+
end
|
255
|
+
|
256
|
+
def vips(*args)
|
257
|
+
invoke_writer VIPSWriter, *args
|
258
|
+
end
|
259
|
+
|
260
|
+
def write(*args)
|
261
|
+
invoke_writer Writer, *args
|
262
|
+
end
|
263
|
+
|
264
|
+
private
|
265
|
+
|
266
|
+
def invoke_writer(writer_class, path=nil, options={})
|
267
|
+
w = writer_class.new self, options
|
268
|
+
if path
|
269
|
+
w.write path
|
270
|
+
else
|
271
|
+
w
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
data/ruby-vips.gemspec
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "ruby-vips"
|
8
|
+
s.version = "0.1.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Timothy Elliott", "John Cupitt"]
|
12
|
+
s.date = "2012-06-21"
|
13
|
+
s.description = "Ruby extension for the vips image processing library."
|
14
|
+
s.email = "jcupitt@gmail.com"
|
15
|
+
s.extensions = ["ext/extconf.rb"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE",
|
18
|
+
"README.md",
|
19
|
+
"TODO"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
"CHANGELOG.md",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"README.md",
|
25
|
+
"ext/extconf.rb",
|
26
|
+
"ext/header.c",
|
27
|
+
"ext/header.h",
|
28
|
+
"ext/image.c",
|
29
|
+
"ext/image.h",
|
30
|
+
"ext/image_arithmetic.c",
|
31
|
+
"ext/image_arithmetic.h",
|
32
|
+
"ext/image_boolean.c",
|
33
|
+
"ext/image_boolean.h",
|
34
|
+
"ext/image_colour.c",
|
35
|
+
"ext/image_colour.h",
|
36
|
+
"ext/image_conversion.c",
|
37
|
+
"ext/image_conversion.h",
|
38
|
+
"ext/image_convolution.c",
|
39
|
+
"ext/image_convolution.h",
|
40
|
+
"ext/image_freq_filt.c",
|
41
|
+
"ext/image_freq_filt.h",
|
42
|
+
"ext/image_histograms_lut.c",
|
43
|
+
"ext/image_histograms_lut.h",
|
44
|
+
"ext/image_morphology.c",
|
45
|
+
"ext/image_morphology.h",
|
46
|
+
"ext/image_mosaicing.c",
|
47
|
+
"ext/image_mosaicing.h",
|
48
|
+
"ext/image_relational.c",
|
49
|
+
"ext/image_relational.h",
|
50
|
+
"ext/image_resample.c",
|
51
|
+
"ext/image_resample.h",
|
52
|
+
"ext/interpolator.c",
|
53
|
+
"ext/interpolator.h",
|
54
|
+
"ext/mask.c",
|
55
|
+
"ext/mask.h",
|
56
|
+
"ext/reader.c",
|
57
|
+
"ext/ruby_vips.c",
|
58
|
+
"ext/ruby_vips.h",
|
59
|
+
"ext/writer.c",
|
60
|
+
"lib/vips.rb",
|
61
|
+
"lib/vips/reader.rb",
|
62
|
+
"lib/vips/version.rb",
|
63
|
+
"lib/vips/writer.rb",
|
64
|
+
"ruby-vips.gemspec"
|
65
|
+
]
|
66
|
+
s.homepage = "http://github.com/jcupitt/ruby-vips"
|
67
|
+
s.licenses = ["MIT"]
|
68
|
+
s.require_paths = ["lib"]
|
69
|
+
s.rubygems_version = "1.8.19"
|
70
|
+
s.summary = "ruby-vips is a ruby extension for vips. It is extremely fast and it can process huge images without requiring the entire image to be loaded into memory."
|
71
|
+
|
72
|
+
if s.respond_to? :specification_version then
|
73
|
+
s.specification_version = 3
|
74
|
+
|
75
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
76
|
+
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
77
|
+
s.add_development_dependency(%q<bundler>, [">= 0"])
|
78
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
|
79
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
80
|
+
else
|
81
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
82
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
83
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
|
84
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
85
|
+
end
|
86
|
+
else
|
87
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
88
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
89
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
|
90
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
metadata
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-vips
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Timothy Elliott
|
9
|
+
- John Cupitt
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-06-21 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rdoc
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.12'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '3.12'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: bundler
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: jeweler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.8.3
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 1.8.3
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rspec
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
description: Ruby extension for the vips image processing library.
|
80
|
+
email: jcupitt@gmail.com
|
81
|
+
executables: []
|
82
|
+
extensions:
|
83
|
+
- ext/extconf.rb
|
84
|
+
extra_rdoc_files:
|
85
|
+
- LICENSE
|
86
|
+
- README.md
|
87
|
+
- TODO
|
88
|
+
files:
|
89
|
+
- CHANGELOG.md
|
90
|
+
- Gemfile.lock
|
91
|
+
- README.md
|
92
|
+
- ext/extconf.rb
|
93
|
+
- ext/header.c
|
94
|
+
- ext/header.h
|
95
|
+
- ext/image.c
|
96
|
+
- ext/image.h
|
97
|
+
- ext/image_arithmetic.c
|
98
|
+
- ext/image_arithmetic.h
|
99
|
+
- ext/image_boolean.c
|
100
|
+
- ext/image_boolean.h
|
101
|
+
- ext/image_colour.c
|
102
|
+
- ext/image_colour.h
|
103
|
+
- ext/image_conversion.c
|
104
|
+
- ext/image_conversion.h
|
105
|
+
- ext/image_convolution.c
|
106
|
+
- ext/image_convolution.h
|
107
|
+
- ext/image_freq_filt.c
|
108
|
+
- ext/image_freq_filt.h
|
109
|
+
- ext/image_histograms_lut.c
|
110
|
+
- ext/image_histograms_lut.h
|
111
|
+
- ext/image_morphology.c
|
112
|
+
- ext/image_morphology.h
|
113
|
+
- ext/image_mosaicing.c
|
114
|
+
- ext/image_mosaicing.h
|
115
|
+
- ext/image_relational.c
|
116
|
+
- ext/image_relational.h
|
117
|
+
- ext/image_resample.c
|
118
|
+
- ext/image_resample.h
|
119
|
+
- ext/interpolator.c
|
120
|
+
- ext/interpolator.h
|
121
|
+
- ext/mask.c
|
122
|
+
- ext/mask.h
|
123
|
+
- ext/reader.c
|
124
|
+
- ext/ruby_vips.c
|
125
|
+
- ext/ruby_vips.h
|
126
|
+
- ext/writer.c
|
127
|
+
- lib/vips.rb
|
128
|
+
- lib/vips/reader.rb
|
129
|
+
- lib/vips/version.rb
|
130
|
+
- lib/vips/writer.rb
|
131
|
+
- ruby-vips.gemspec
|
132
|
+
- LICENSE
|
133
|
+
- TODO
|
134
|
+
homepage: http://github.com/jcupitt/ruby-vips
|
135
|
+
licenses:
|
136
|
+
- MIT
|
137
|
+
post_install_message:
|
138
|
+
rdoc_options: []
|
139
|
+
require_paths:
|
140
|
+
- lib
|
141
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
+
none: false
|
143
|
+
requirements:
|
144
|
+
- - ! '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
segments:
|
148
|
+
- 0
|
149
|
+
hash: -88150975
|
150
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
+
none: false
|
152
|
+
requirements:
|
153
|
+
- - ! '>='
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '0'
|
156
|
+
requirements: []
|
157
|
+
rubyforge_project:
|
158
|
+
rubygems_version: 1.8.19
|
159
|
+
signing_key:
|
160
|
+
specification_version: 3
|
161
|
+
summary: ruby-vips is a ruby extension for vips. It is extremely fast and it can process
|
162
|
+
huge images without requiring the entire image to be loaded into memory.
|
163
|
+
test_files: []
|