rszr 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +53 -7
- data/ext/rszr/image.c +141 -5
- data/lib/rszr/image.rb +76 -20
- data/lib/rszr/image_processing.rb +82 -0
- data/lib/rszr/version.rb +1 -1
- metadata +59 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7322db19722cd5afc93e887fabe4031fa3a3064949956dc3bac562299918f10
|
4
|
+
data.tar.gz: 8c03c8922f29d3f7989f427018e7baeb6f09c4c9f561fef1b6a92a80f4042ec8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82b7c3ea10061666bacd712c39319ef36f19b2aecce3fa89556c591c0ef6f2cedf10b0fb1ed4ee6ac8613cfb40904b7e42306cd08d247d2653ca3135450244ba
|
7
|
+
data.tar.gz: 52cac4fe43b0feb24e6fb837fdbed69bb4c91e53807ef5d5821c5ab1793d41a698632e1b342e8b14fed0219db080d05179d37eeb6fcef91e8052b66205c2ab07
|
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
[![Gem Version](https://badge.fury.io/rb/rszr.svg)](http://badge.fury.io/rb/rszr) [![Build Status](https://travis-ci.org/mtgrosser/rszr.svg)](https://travis-ci.org/mtgrosser/rszr)
|
2
2
|
# Rszr - fast image resizer for Ruby
|
3
3
|
|
4
|
-
Rszr is an image resizer for Ruby based on the Imlib2 library.
|
4
|
+
Rszr is an image resizer for Ruby based on the Imlib2 library.
|
5
|
+
It is faster and consumes less memory than MiniMagick, GD2 and VIPS, and comes with an optional drop-in interface for Rails ActiveStorage image processing.
|
5
6
|
|
6
7
|
## Installation
|
7
8
|
|
@@ -47,7 +48,15 @@ image.save('resized.jpg')
|
|
47
48
|
|
48
49
|
# save it as PNG
|
49
50
|
image.save('resized.png')
|
51
|
+
```
|
52
|
+
|
53
|
+
### Transformations
|
54
|
+
|
55
|
+
For each transformation, there is a bang! and non-bang method.
|
56
|
+
The bang method changes the image in place, while the non-bang method
|
57
|
+
creates a copy of the image in memory.
|
50
58
|
|
59
|
+
```ruby
|
51
60
|
# auto height
|
52
61
|
image.resize(400, :auto)
|
53
62
|
|
@@ -66,30 +75,67 @@ image.turn!(3)
|
|
66
75
|
# rotate one time 90 deg counterclockwise
|
67
76
|
image.turn!(-1)
|
68
77
|
|
78
|
+
# rotate by arbitrary angle
|
79
|
+
image.rotate(45)
|
80
|
+
|
81
|
+
# sharpen image by pixel radius
|
82
|
+
image.sharpen!(1)
|
83
|
+
|
84
|
+
# blur image by pixel radius
|
85
|
+
image.blur!(1)
|
86
|
+
|
69
87
|
# initialize copy
|
70
88
|
image.dup
|
71
89
|
|
72
90
|
# save memory, do not duplicate instance
|
73
91
|
image.resize!(400, :auto)
|
92
|
+
```
|
74
93
|
|
75
|
-
|
94
|
+
### Image info
|
95
|
+
```ruby
|
76
96
|
image.width => 400
|
77
97
|
image.height => 300
|
78
98
|
image.dimensions => [400, 300]
|
79
99
|
image.format => "jpeg"
|
80
100
|
```
|
81
101
|
|
102
|
+
## Rails / ActiveStorage interface
|
103
|
+
|
104
|
+
Rszr provides a drop-in interface to the `image_resizing` gem.
|
105
|
+
It is faster than both `mini_magick` and `vips` and way easier to install than the latter.
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
# Gemfile
|
109
|
+
gem 'image_resizing'
|
110
|
+
gem 'rszr'
|
111
|
+
|
112
|
+
# config/initializers/rszr.rb
|
113
|
+
require 'rszr/image_processing'
|
114
|
+
|
115
|
+
# config/application.rb
|
116
|
+
config.active_storage.variant_processor = :rszr
|
117
|
+
```
|
118
|
+
|
119
|
+
When creating image variants, you can use all of Rszr's transformation methods:
|
120
|
+
|
121
|
+
```erb
|
122
|
+
<%= image_tag user.avatar.variant(resize_to_fit: [300, 200]) %>
|
123
|
+
```
|
124
|
+
|
82
125
|
## Thread safety
|
83
126
|
|
84
|
-
As of version 0.
|
127
|
+
As of version 0.5.0, Rszr is thread safe through Ruby's global VM lock.
|
85
128
|
Use of any previous versions in a threaded environment is discouraged.
|
86
129
|
|
87
130
|
## Speed
|
88
131
|
|
89
|
-
Resizing
|
132
|
+
Resizing a 1500x997 JPEG image to 800x532, 500 times:
|
133
|
+
![Speed](https://github.com/mtgrosser/rszr/blob/master/benchmark/speed.png)
|
134
|
+
|
90
135
|
|
91
136
|
Library | Time
|
92
137
|
----------------|-----------
|
93
|
-
MiniMagick |
|
94
|
-
GD2 |
|
95
|
-
|
138
|
+
MiniMagick | 27.0 s
|
139
|
+
GD2 | 28.2 s
|
140
|
+
VIPS | 13.6 s
|
141
|
+
Rszr | 7.9 s
|
data/ext/rszr/image.c
CHANGED
@@ -75,7 +75,7 @@ static VALUE rszr_image_s__load(VALUE klass, VALUE rb_path)
|
|
75
75
|
}
|
76
76
|
|
77
77
|
|
78
|
-
static VALUE
|
78
|
+
static VALUE rszr_image_format_get(VALUE self)
|
79
79
|
{
|
80
80
|
rszr_image_handle * handle;
|
81
81
|
char * format;
|
@@ -93,6 +93,20 @@ static VALUE rszr_image_format(VALUE self)
|
|
93
93
|
}
|
94
94
|
|
95
95
|
|
96
|
+
static VALUE rszr_image__format_set(VALUE self, VALUE rb_format)
|
97
|
+
{
|
98
|
+
rszr_image_handle * handle;
|
99
|
+
char * format = StringValueCStr(rb_format);
|
100
|
+
|
101
|
+
Data_Get_Struct(self, rszr_image_handle, handle);
|
102
|
+
|
103
|
+
imlib_context_set_image(handle->image);
|
104
|
+
imlib_image_set_format(format);
|
105
|
+
|
106
|
+
return self;
|
107
|
+
}
|
108
|
+
|
109
|
+
|
96
110
|
static VALUE rszr_image_width(VALUE self)
|
97
111
|
{
|
98
112
|
rszr_image_handle * handle;
|
@@ -120,6 +134,44 @@ static VALUE rszr_image_height(VALUE self)
|
|
120
134
|
return INT2NUM(height);
|
121
135
|
}
|
122
136
|
|
137
|
+
/*
|
138
|
+
static VALUE rszr_image_get_quality(VALUE self)
|
139
|
+
{
|
140
|
+
rszr_image_handle * handle;
|
141
|
+
int quality;
|
142
|
+
|
143
|
+
Data_Get_Struct(self, rszr_image_handle, handle);
|
144
|
+
|
145
|
+
imlib_context_set_image(handle->image);
|
146
|
+
quality = imlib_image_get_attached_value("quality");
|
147
|
+
|
148
|
+
if (quality) {
|
149
|
+
return INT2NUM(quality);
|
150
|
+
} else {
|
151
|
+
return Qnil;
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
155
|
+
static VALUE rszr_image_set_quality(VALUE self, VALUE rb_quality)
|
156
|
+
{
|
157
|
+
rszr_image_handle * handle;
|
158
|
+
int quality;
|
159
|
+
|
160
|
+
Check_Type(rb_quality, T_FIXNUM);
|
161
|
+
quality = FIX2INT(rb_quality);
|
162
|
+
if (quality <= 0) {
|
163
|
+
rb_raise(rb_eArgError, "quality must be >= 0");
|
164
|
+
return Qnil;
|
165
|
+
}
|
166
|
+
|
167
|
+
Data_Get_Struct(self, rszr_image_handle, handle);
|
168
|
+
|
169
|
+
imlib_context_set_image(handle->image);
|
170
|
+
imlib_image_attach_data_value("quality", NULL, quality, NULL);
|
171
|
+
|
172
|
+
return INT2NUM(quality);
|
173
|
+
}
|
174
|
+
*/
|
123
175
|
|
124
176
|
static VALUE rszr_image_dup(VALUE self)
|
125
177
|
{
|
@@ -159,6 +211,77 @@ static VALUE rszr_image__turn_bang(VALUE self, VALUE orientation)
|
|
159
211
|
}
|
160
212
|
|
161
213
|
|
214
|
+
static VALUE rszr_image__rotate(VALUE self, VALUE bang, VALUE rb_angle)
|
215
|
+
{
|
216
|
+
rszr_image_handle * handle;
|
217
|
+
rszr_image_handle * rotated_handle;
|
218
|
+
Imlib_Image rotated_image;
|
219
|
+
VALUE oRotatedImage;
|
220
|
+
double angle;
|
221
|
+
|
222
|
+
angle = NUM2DBL(rb_angle);
|
223
|
+
|
224
|
+
Data_Get_Struct(self, rszr_image_handle, handle);
|
225
|
+
|
226
|
+
imlib_context_set_image(handle->image);
|
227
|
+
rotated_image = imlib_create_rotated_image(angle);
|
228
|
+
|
229
|
+
if (!rotated_image) {
|
230
|
+
rb_raise(eRszrTransformationError, "error rotating image");
|
231
|
+
return Qnil;
|
232
|
+
}
|
233
|
+
|
234
|
+
if (RTEST(bang)) {
|
235
|
+
rszr_free_image(handle->image);
|
236
|
+
handle->image = rotated_image;
|
237
|
+
|
238
|
+
return self;
|
239
|
+
}
|
240
|
+
else {
|
241
|
+
oRotatedImage = rszr_image_s_allocate(cImage);
|
242
|
+
Data_Get_Struct(oRotatedImage, rszr_image_handle, rotated_handle);
|
243
|
+
rotated_handle->image = rotated_image;
|
244
|
+
|
245
|
+
return oRotatedImage;
|
246
|
+
}
|
247
|
+
}
|
248
|
+
|
249
|
+
/*
|
250
|
+
static VALUE rszr_image__brighten_bang(VALUE self, VALUE rb_brightness)
|
251
|
+
{
|
252
|
+
rszr_image_handle * handle;
|
253
|
+
double brightness;
|
254
|
+
|
255
|
+
brightness = NUM2DBL(rb_brightness);
|
256
|
+
|
257
|
+
imlib_context_set_image(handle->image);
|
258
|
+
imlib_modify_color_modifier_brightness(brightness);
|
259
|
+
|
260
|
+
return self;
|
261
|
+
}
|
262
|
+
*/
|
263
|
+
|
264
|
+
static VALUE rszr_image__sharpen_bang(VALUE self, VALUE rb_radius)
|
265
|
+
{
|
266
|
+
rszr_image_handle * handle;
|
267
|
+
int radius;
|
268
|
+
|
269
|
+
radius = NUM2INT(rb_radius);
|
270
|
+
|
271
|
+
Data_Get_Struct(self, rszr_image_handle, handle);
|
272
|
+
|
273
|
+
imlib_context_set_image(handle->image);
|
274
|
+
|
275
|
+
if (radius >= 0) {
|
276
|
+
imlib_image_sharpen(radius);
|
277
|
+
} else {
|
278
|
+
imlib_image_blur(radius);
|
279
|
+
}
|
280
|
+
|
281
|
+
return self;
|
282
|
+
}
|
283
|
+
|
284
|
+
|
162
285
|
static Imlib_Image rszr_create_cropped_scaled_image(const Imlib_Image image, VALUE rb_src_x, VALUE rb_src_y, VALUE rb_src_w, VALUE rb_src_h, VALUE rb_dst_w, VALUE rb_dst_h)
|
163
286
|
{
|
164
287
|
Imlib_Image resized_image;
|
@@ -262,20 +385,24 @@ static VALUE rszr_image__crop(VALUE self, VALUE bang, VALUE rb_x, VALUE rb_y, VA
|
|
262
385
|
}
|
263
386
|
|
264
387
|
|
265
|
-
static VALUE rszr_image__save(VALUE self, VALUE rb_path, VALUE rb_format)
|
388
|
+
static VALUE rszr_image__save(VALUE self, VALUE rb_path, VALUE rb_format, VALUE rb_quality)
|
266
389
|
{
|
267
390
|
rszr_image_handle * handle;
|
268
391
|
char * path;
|
269
392
|
char * format;
|
393
|
+
int quality;
|
270
394
|
Imlib_Load_Error save_error;
|
271
395
|
|
272
396
|
path = StringValueCStr(rb_path);
|
273
397
|
format = StringValueCStr(rb_format);
|
274
|
-
|
398
|
+
quality = (NIL_P(rb_quality)) ? 0 : FIX2INT(rb_quality);
|
399
|
+
|
275
400
|
Data_Get_Struct(self, rszr_image_handle, handle);
|
276
401
|
|
277
402
|
imlib_context_set_image(handle->image);
|
278
403
|
imlib_image_set_format(format);
|
404
|
+
if (quality)
|
405
|
+
imlib_image_attach_data_value("quality", NULL, quality, NULL);
|
279
406
|
imlib_save_image_with_error_return(path, &save_error);
|
280
407
|
|
281
408
|
if (save_error) {
|
@@ -298,12 +425,21 @@ void Init_rszr_image()
|
|
298
425
|
rb_define_method(cImage, "initialize", rszr_image_initialize, 2);
|
299
426
|
rb_define_method(cImage, "width", rszr_image_width, 0);
|
300
427
|
rb_define_method(cImage, "height", rszr_image_height, 0);
|
301
|
-
rb_define_method(cImage, "format",
|
428
|
+
rb_define_method(cImage, "format", rszr_image_format_get, 0);
|
302
429
|
rb_define_method(cImage, "dup", rszr_image_dup, 0);
|
430
|
+
// rb_define_method(cImage, "quality", rszr_image_get_quality, 0);
|
431
|
+
// rb_define_method(cImage, "quality=", rszr_image_set_quality, 1);
|
432
|
+
|
433
|
+
rb_define_protected_method(cImage, "_format=", rszr_image__format_set, 1);
|
434
|
+
|
303
435
|
rb_define_private_method(cImage, "_resize", rszr_image__resize, 7);
|
304
436
|
rb_define_private_method(cImage, "_crop", rszr_image__crop, 5);
|
305
437
|
rb_define_private_method(cImage, "_turn!", rszr_image__turn_bang, 1);
|
306
|
-
rb_define_private_method(cImage, "
|
438
|
+
rb_define_private_method(cImage, "_rotate", rszr_image__rotate, 2);
|
439
|
+
rb_define_private_method(cImage, "_sharpen!", rszr_image__sharpen_bang, 1);
|
440
|
+
/* rb_define_private_method(cImage, "_brighten!", rszr_image__brighten_bang, 1); */
|
441
|
+
|
442
|
+
rb_define_private_method(cImage, "_save", rszr_image__save, 3);
|
307
443
|
}
|
308
444
|
|
309
445
|
#endif
|
data/lib/rszr/image.rb
CHANGED
@@ -3,7 +3,7 @@ module Rszr
|
|
3
3
|
|
4
4
|
class << self
|
5
5
|
|
6
|
-
def load(path,
|
6
|
+
def load(path, **opts)
|
7
7
|
path = path.to_s
|
8
8
|
raise FileNotFound unless File.exist?(path)
|
9
9
|
_load(path)
|
@@ -15,6 +15,11 @@ module Rszr
|
|
15
15
|
def dimensions
|
16
16
|
[width, height]
|
17
17
|
end
|
18
|
+
|
19
|
+
def format=(fmt)
|
20
|
+
fmt = fmt.to_s if fmt.is_a?(Symbol)
|
21
|
+
self._format = fmt
|
22
|
+
end
|
18
23
|
|
19
24
|
def inspect
|
20
25
|
fmt = format
|
@@ -22,30 +27,72 @@ module Rszr
|
|
22
27
|
"#<#{self.class.name}:0x#{object_id.to_s(16)} #{width}x#{height}#{fmt}>"
|
23
28
|
end
|
24
29
|
|
25
|
-
|
26
|
-
|
27
|
-
|
30
|
+
module Transformations
|
31
|
+
def resize(*args)
|
32
|
+
_resize(false, *calculate_size(*args))
|
33
|
+
end
|
28
34
|
|
29
|
-
|
30
|
-
|
31
|
-
|
35
|
+
def resize!(*args)
|
36
|
+
_resize(true, *calculate_size(*args))
|
37
|
+
end
|
32
38
|
|
33
|
-
|
34
|
-
|
35
|
-
|
39
|
+
def crop(x, y, width, height)
|
40
|
+
_crop(false, x, y, width, height)
|
41
|
+
end
|
36
42
|
|
37
|
-
|
38
|
-
|
39
|
-
|
43
|
+
def crop!(x, y, width, height)
|
44
|
+
_crop(true, x, y, width, height)
|
45
|
+
end
|
46
|
+
|
47
|
+
def turn(orientation)
|
48
|
+
dup.turn!(orientation)
|
49
|
+
end
|
40
50
|
|
41
|
-
|
42
|
-
|
43
|
-
|
51
|
+
def turn!(orientation)
|
52
|
+
orientation = orientation.abs + 2 if orientation.negative?
|
53
|
+
_turn!(orientation % 4)
|
54
|
+
end
|
55
|
+
|
56
|
+
def rotate(deg)
|
57
|
+
_rotate(false, deg.to_f * Math::PI / 180.0)
|
58
|
+
end
|
59
|
+
|
60
|
+
def rotate!(deg)
|
61
|
+
_rotate(true, deg.to_f * Math::PI / 180.0)
|
62
|
+
end
|
63
|
+
|
64
|
+
def sharpen(radius)
|
65
|
+
dup.sharpen!(radius)
|
66
|
+
end
|
67
|
+
|
68
|
+
def sharpen!(radius)
|
69
|
+
raise ArgumentError, 'illegal radius' if radius < 0
|
70
|
+
_sharpen!(radius)
|
71
|
+
end
|
72
|
+
|
73
|
+
def blur(radius)
|
74
|
+
dup.blur!(radius)
|
75
|
+
end
|
76
|
+
|
77
|
+
def blur!(radius)
|
78
|
+
raise ArgumentError, 'illegal radius' if radius < 0
|
79
|
+
_sharpen!(-radius)
|
80
|
+
end
|
81
|
+
|
82
|
+
# TODO
|
83
|
+
#def brighten!(brightness)
|
84
|
+
# raise ArgumentError, 'illegal brightness' if brightness > 1 || brightness < -1
|
85
|
+
# _brighten!(brightness)
|
86
|
+
#end
|
44
87
|
end
|
88
|
+
|
89
|
+
include Transformations
|
45
90
|
|
46
|
-
def save(path, format
|
47
|
-
format ||= format_from_filename(path) || 'jpg'
|
48
|
-
|
91
|
+
def save(path, format: nil, quality: nil)
|
92
|
+
format ||= format_from_filename(path) || self.format || 'jpg'
|
93
|
+
raise ArgumentError, "invalid quality #{quality.inspect}" if quality && !(0..100).cover?(quality)
|
94
|
+
ensure_path_is_writable(path)
|
95
|
+
_save(path.to_s, format.to_s, quality)
|
49
96
|
end
|
50
97
|
|
51
98
|
private
|
@@ -56,7 +103,7 @@ module Rszr
|
|
56
103
|
# :auto, 300 auto width, fit height
|
57
104
|
# 400, 300, crop: :center_middle
|
58
105
|
# 400, 300, background: rgba
|
59
|
-
# 400, 300,
|
106
|
+
# 400, 300, skew: true
|
60
107
|
|
61
108
|
def calculate_size(*args)
|
62
109
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
@@ -104,6 +151,15 @@ module Rszr
|
|
104
151
|
def format_from_filename(path)
|
105
152
|
File.extname(path)[1..-1]
|
106
153
|
end
|
154
|
+
|
155
|
+
def ensure_path_is_writable(path)
|
156
|
+
path = Pathname.new(path)
|
157
|
+
path.dirname.realpath.writable?
|
158
|
+
rescue Errno::ENOENT => e
|
159
|
+
raise SaveError, 'Non-existant path component'
|
160
|
+
rescue SystemCallError => e
|
161
|
+
raise SaveError, e.message
|
162
|
+
end
|
107
163
|
|
108
164
|
def assert_valid_keys(hsh, *valid_keys)
|
109
165
|
if unknown_key = (hsh.keys - valid_keys).first
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'rszr'
|
2
|
+
require 'image_processing'
|
3
|
+
|
4
|
+
module ImageProcessing
|
5
|
+
module Rszr
|
6
|
+
extend Chainable
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
# Returns whether the given image file is processable.
|
11
|
+
def valid_image?(file)
|
12
|
+
::Rszr::Image.load(file).width
|
13
|
+
true
|
14
|
+
rescue ::Rszr::Error
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
class Processor < ImageProcessing::Processor
|
21
|
+
accumulator :image, ::Rszr::Image
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
# Loads the image on disk into a Rszr::Image object
|
26
|
+
def load_image(path_or_image, **options)
|
27
|
+
if path_or_image.is_a?(::Rszr::Image)
|
28
|
+
path_or_image
|
29
|
+
else
|
30
|
+
::Rszr::Image.load(path_or_image)
|
31
|
+
end
|
32
|
+
# TODO: image = image.autorot if autorot && !options.key?(:autorotate)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Writes the image object to disk.
|
36
|
+
# Accepts additional options (quality, format).
|
37
|
+
def save_image(image, destination_path, **options)
|
38
|
+
image.save(destination_path, **options)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Calls the operation to perform the processing. If the operation is
|
42
|
+
# defined on the processor (macro), calls it. Otherwise calls the
|
43
|
+
# bang variant of the method directly on the Rszr image object.
|
44
|
+
def apply_operation(accumulator, (name, args, block))
|
45
|
+
return super if method_defined?(name)
|
46
|
+
accumulator.send("#{name}!", *args, &block)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
# Resizes the image to not be larger than the specified dimensions.
|
52
|
+
def resize_to_limit(width, height, **options)
|
53
|
+
width, height = default_dimensions(width, height)
|
54
|
+
thumbnail(width, height, **options)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Resizes the image to fit within the specified dimensions.
|
58
|
+
def resize_to_fit(width, height, **options)
|
59
|
+
width, height = default_dimensions(width, height)
|
60
|
+
thumbnail(width, height, **options)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Resizes the image to fill the specified dimensions, applying any
|
64
|
+
# necessary cropping.
|
65
|
+
def resize_to_fill(width, height, **options)
|
66
|
+
thumbnail(width, height, crop: :center, **options)
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def thumbnail(width, height, **options)
|
72
|
+
image.resize!(width, height, **options)
|
73
|
+
end
|
74
|
+
|
75
|
+
def default_dimensions(width, height)
|
76
|
+
raise Error, 'either width or height must be specified' unless width || height
|
77
|
+
[width || :auto, height || :auto]
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/lib/rszr/version.rb
CHANGED
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rszr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthias Grosser
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 12.3.3
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 12.3.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake-compiler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: simplecov
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +108,20 @@ dependencies:
|
|
94
108
|
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: image_processing
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: gd2-ffij
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +150,20 @@ dependencies:
|
|
122
150
|
- - ">="
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: ruby-vips
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
125
167
|
- !ruby/object:Gem::Dependency
|
126
168
|
name: memory_profiler
|
127
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,12 +198,13 @@ files:
|
|
156
198
|
- ext/rszr/rszr.h
|
157
199
|
- lib/rszr.rb
|
158
200
|
- lib/rszr/image.rb
|
201
|
+
- lib/rszr/image_processing.rb
|
159
202
|
- lib/rszr/version.rb
|
160
203
|
homepage: https://github.com/mtgrosser/rszr
|
161
204
|
licenses:
|
162
205
|
- MIT
|
163
206
|
metadata: {}
|
164
|
-
post_install_message:
|
207
|
+
post_install_message:
|
165
208
|
rdoc_options: []
|
166
209
|
require_paths:
|
167
210
|
- lib
|
@@ -176,9 +219,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
176
219
|
- - ">="
|
177
220
|
- !ruby/object:Gem::Version
|
178
221
|
version: '0'
|
179
|
-
requirements:
|
180
|
-
|
181
|
-
|
222
|
+
requirements:
|
223
|
+
- Imlib2
|
224
|
+
rubygems_version: 3.1.4
|
225
|
+
signing_key:
|
182
226
|
specification_version: 4
|
183
227
|
summary: Fast image resizer
|
184
228
|
test_files: []
|