easyimg_utils 0.4.2 → 0.6.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe594098cdc2268dc048152629e5a0481dc834829ca04fa80a9e37c24f52083c
4
- data.tar.gz: ca30a483fad43ea836b7684cf76629e21f0ea0463517a50a4f06188343b69592
3
+ metadata.gz: 747675b404e492bb0c25b254a1e3ec332de6a9d52bd85f32b19849388e579b34
4
+ data.tar.gz: eabc7fd2465441173854d524071d38d295eb390d9b1fe8b0032c93aaec67095e
5
5
  SHA512:
6
- metadata.gz: 5801d345fafb31662b4632ec1729643e232bf0dc66397fe9fc863855b3d6a42dd8f7f9bd13a6c47f2eee7ea70d4104839af5858f3d447cdccfc18df55f5c0e4b
7
- data.tar.gz: 18916137f05c3adc244d2b13a04d350863c6fc837569a059ded6c5b50a6bea0e3f31751979c4bbccc87bfaeaaaf103c212d158445def11233a75f05963e0298c
6
+ metadata.gz: 8c02de630ce978236b4e8461be3f980f85960447579961db87f2e74b85304f9861def010c03e42d9049e759cf9ad752a40d58c6fa40ca1f8f701f92a57a8bb8f
7
+ data.tar.gz: 856e1609c06583611f9a5cb98e31de21395b8d67586cf20f6439fe9ed603849f3a3808c5d0bf4e9d8f7f0ebd3396fddbc93598d97e26562cd111c3efe96d7f95
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -3,9 +3,10 @@
3
3
  # file: easyimg_utils.rb
4
4
 
5
5
  require 'c32'
6
- require 'rxfhelper'
6
+ require 'x4ss'
7
7
  require 'rmagick'
8
8
  require 'webp_ffi'
9
+ require 'rxfhelper'
9
10
 
10
11
  # requirements:
11
12
  #
@@ -51,6 +52,7 @@ class EasyImgUtils
51
52
  * add rectangle # usage: add_rectangle(color: 'green', x1: 12, y1: 12, x2: 24, y2: 24)
52
53
  * add_svg # adds an SVG transparency overlay. usage: add_svg('/tmp/image1.svg')
53
54
  * add_text # e.g. add_text('some text')
55
+ * animate Creates an animated gif e.g. animate('/tmp/a%d.png', '/tmp/b.gif')
54
56
  * blur # e.g. blur(x: 231, y: 123, w: 85, h: 85)
55
57
  * capture_screen # takes a screenshot of the desktop
56
58
  * center_crop # crops from the centre of an image. Usage center_crop(width, height)
@@ -62,11 +64,13 @@ class EasyImgUtils
62
64
  * greyscale # Reduces the image to 256 shades of grey
63
65
  * info # returns the dimension of the image in a Hash object
64
66
  * make_thumbnail # similar to resize but faster for sizes less than 10% of original image
65
- * resize # set the maximum geomertry of the image for resizing e.g. resize('320x240')
67
+ * resize # set the maximum geomertry of the image for resizing e.g. resize('320x240') see also scale
66
68
  * rotate
67
69
  * rotate_180
68
70
  * rotate_left
69
71
  * rotate_right
72
+ * scale # Scales an image by the given factor e.g. 0.75 is 75%. see also resize
73
+ * screencast # records a screencast and saves it as animated gif. e.g. (out: '/tmp/fun.gif').screencast
70
74
  * sketch # renders an artistic sketch, ideal with simplistic photos
71
75
  * view # view the output
72
76
  * vignette # Feathers the edge of an image in a circular path
@@ -85,14 +89,15 @@ class EasyImgUtils
85
89
  x1: 0, y1: 0, x2: 0, y2: 0)
86
90
 
87
91
  x1, y1, x2, y2 = *a if a
88
- img = read()
89
- gc = Magick::Draw.new
90
- gc.stroke('green')
91
- gc.stroke_width(5)
92
- gc.fill('transparent')
93
- gc.rectangle(x1, y1, x2, y2)
94
- gc.draw(img)
95
- write img, quality
92
+ read() do |img|
93
+ gc = Magick::Draw.new
94
+ gc.stroke('green')
95
+ gc.stroke_width(5)
96
+ gc.fill('transparent')
97
+ gc.rectangle(x1, y1, x2, y2)
98
+ gc.draw(img)
99
+ write img, quality
100
+ end
96
101
 
97
102
  end
98
103
 
@@ -112,38 +117,56 @@ class EasyImgUtils
112
117
 
113
118
  def add_text(s='your text goes here', quality: nil)
114
119
 
115
- img = read()
120
+ read() do |img|
116
121
 
117
- d = Draw.new
118
- img.annotate(d, 0,0,0,0, s) do
119
- d.gravity = Magick::SouthGravity
120
- d.pointsize = 26
121
- d.stroke = '#000000'
122
- d.fill = '#ffffff'
123
- d.font_weight = Magick::BoldWeight
122
+ d = Draw.new
123
+ img.annotate(d, 0,0,0,0, s) do
124
+ d.gravity = Magick::SouthGravity
125
+ d.pointsize = 26
126
+ d.stroke = '#000000'
127
+ d.fill = '#ffffff'
128
+ d.font_weight = Magick::BoldWeight
129
+ end
130
+
131
+ write img, quality
132
+
124
133
  end
125
134
 
126
- write img, quality
127
-
128
135
  end
129
136
 
137
+ def animate()
138
+
139
+ anim = Magick::ImageList.new
140
+
141
+ read() {|img| anim << img }
142
+ anim.ticks_per_second = 100
143
+ anim.delay = 20
144
+
145
+ @file_out ? anim.write(@file_out) : anim.animate
146
+
147
+ end
130
148
 
131
149
  def blur(x: 0, y: 0, w: 80, h: 80, strength: 8, quality: nil)
132
150
 
133
151
  width, height = w, h
134
- img = read()
135
- region = img.dispatch(x, y, width, height, 'RGB')
136
- face_img = Magick::Image.constitute(width, height, "RGB", region)
137
- img.composite!(face_img.gaussian_blur(0, strength), x, y,
138
- Magick::OverCompositeOp)
139
- write img, quality
152
+
153
+ read() do |img|
154
+
155
+ region = img.dispatch(x, y, width, height, 'RGB')
156
+ face_img = Magick::Image.constitute(width, height, "RGB", region)
157
+ img.composite!(face_img.gaussian_blur(0, strength), x, y,
158
+ Magick::OverCompositeOp)
159
+ write img, quality
160
+
161
+ end
140
162
 
141
163
  end
142
164
 
143
165
  def brightness(quality: nil)
144
- img = read()
145
- img2 = imglevel(-Magick::QuantumRange * 0.25, Magick::QuantumRange * 1.25, 1.0)
146
- write img2, quality
166
+ read() do |img|
167
+ img2 = imglevel(-Magick::QuantumRange * 0.25, Magick::QuantumRange * 1.25, 1.0)
168
+ write img2, quality
169
+ end
147
170
  end
148
171
 
149
172
  def capture_screen(quality: nil)
@@ -162,9 +185,10 @@ class EasyImgUtils
162
185
 
163
186
  return unless w
164
187
 
165
- img = read()
166
- img.crop!(CenterGravity, width, height)
167
- write img, quality
188
+ read() do |img|
189
+ img.crop!(CenterGravity, width, height)
190
+ write img, quality
191
+ end
168
192
 
169
193
  end
170
194
 
@@ -172,18 +196,19 @@ class EasyImgUtils
172
196
 
173
197
  return unless filex
174
198
 
175
- img = read()
199
+ read() do |img|
176
200
 
177
- imgx = Magick::ImageList.new(filex)
201
+ imgx = Magick::ImageList.new(filex)
178
202
 
179
- # Change the white pixels in the sign to transparent.
180
- imgx = imgx.matte_replace(0,0)
203
+ # Change the white pixels in the sign to transparent.
204
+ imgx = imgx.matte_replace(0,0)
181
205
 
182
- img2 = Magick::Draw.new
183
- img2.composite(x, y, 0, 0, imgx)
184
- img2.draw(img)
185
-
186
- write img, quality
206
+ img2 = Magick::Draw.new
207
+ img2.composite(x, y, 0, 0, imgx)
208
+ img2.draw(img)
209
+
210
+ write img, quality
211
+ end
187
212
 
188
213
  end
189
214
 
@@ -199,13 +224,14 @@ class EasyImgUtils
199
224
 
200
225
  return if level == neutral
201
226
 
202
- img ||= read()
227
+ read() do |img|
203
228
 
204
- n = neutral - level
205
- sharpen = n > 0
206
- n.abs.times { img = img.contrast(sharpen) }
207
-
208
- write img, quality
229
+ n = neutral - level
230
+ sharpen = n > 0
231
+ n.abs.times { img = img.contrast(sharpen) }
232
+
233
+ write img, quality
234
+ end
209
235
 
210
236
  end
211
237
 
@@ -240,28 +266,31 @@ class EasyImgUtils
240
266
 
241
267
  return unless w
242
268
 
243
- img = read()
244
- img.crop!(x,y, width=w, height=h)
245
- write img, quality
269
+ read() do |img|
270
+ img.crop!(x,y, width=w, height=h)
271
+ write img, quality
272
+ end
246
273
 
247
274
  end
248
275
 
249
276
  def fax_effect(threshold: 0.55, quality: nil)
250
277
 
251
- img = read()
252
-
253
- # Use a threshold of 55% of MaxRGB.
254
- img = img.threshold(Magick::MaxRGB*threshold)
278
+ read() do |img|
255
279
 
256
- write img, quality
280
+ # Use a threshold of 55% of MaxRGB.
281
+ img = img.threshold(Magick::MaxRGB*threshold)
282
+ write img, quality
283
+
284
+ end
257
285
 
258
286
  end
259
287
 
260
288
  def greyscale(quality: nil)
261
289
 
262
- img = read()
263
- img2 = img.quantize(256, GRAYColorspace)
264
- write img2, quality
290
+ read() do |img|
291
+ img2 = img.quantize(256, GRAYColorspace)
292
+ write img2, quality
293
+ end
265
294
 
266
295
  end
267
296
 
@@ -281,9 +310,10 @@ class EasyImgUtils
281
310
 
282
311
  def make_thumbnail(width=125, height=125)
283
312
 
284
- img = read()
285
- img2 = img.thumbnail(width, height)
286
- write img2, quality
313
+ read() do |img|
314
+ img2 = img.thumbnail(width, height)
315
+ write img2, quality
316
+ end
287
317
 
288
318
  end
289
319
 
@@ -293,63 +323,101 @@ class EasyImgUtils
293
323
  #
294
324
  def resize(geometry='320x240', quality: nil)
295
325
 
296
- preview = read()
326
+ read() do |preview|
297
327
 
298
- preview.change_geometry!(geometry) do |cols, rows, img|
299
- img.resize!(cols, rows)
328
+ preview.change_geometry!(geometry) do |cols, rows, img|
329
+ img.resize!(cols, rows)
330
+ end
331
+
332
+ write preview, quality
300
333
  end
301
334
 
302
- write preview, quality
303
-
304
335
  end
305
336
 
306
337
  def rotate(degrees)
307
338
 
308
- img = read()
309
- img2 = img.rotate(degrees.to_i)
310
- write img2, quality
339
+ read() do |img|
340
+ img2 = img.rotate(degrees.to_i)
341
+ write img2, quality
342
+ end
311
343
 
312
344
  end
313
345
 
314
346
  def rotate_180()
315
347
 
316
- img = read()
317
- img2 = img.rotate(180)
318
- write img2, quality
348
+ read() do |img|
349
+ img2 = img.rotate(180)
350
+ write img2, quality
351
+ end
319
352
 
320
353
  end
321
354
 
322
355
  def rotate_left()
323
356
 
324
- img = read()
325
- img2 = img.rotate(-45)
326
- write img2, quality
357
+ read() do |img|
358
+ img2 = img.rotate(-45)
359
+ write img2, quality
360
+ end
327
361
 
328
362
  end
329
363
 
330
364
  def rotate_right()
331
365
 
332
- img = read()
333
- img2 = img.rotate(45)
334
- write img2, quality
366
+ read() do |img|
367
+ img2 = img.rotate(45)
368
+ write img2, quality
369
+ end
335
370
 
336
371
  end
372
+
373
+ # Scales an image by the given factor e.g. 0.75 is 75%
374
+ #
375
+ def scale(factor=0.75, quality: nil)
376
+
377
+ read() do |img|
378
+
379
+ img2 = img.scale(factor)
380
+ write img2, quality
381
+
382
+ end
383
+
384
+ end
385
+
386
+ # Takes a screenshot every second to create an animated gif
387
+ #
388
+ def screencast(duration: 6, scale: 1, window: true)
389
+
390
+ fileout = @file_out.sub(/\.\w+$/,'%d.png')
391
+
392
+ puts 'fileout: ' + fileout if @debug
393
+
394
+ x4ss = X4ss.new fileout, mouse: true, window: true
395
+ mode = window ? :window : :screen
396
+ sleep 2; x4ss.record duration: duration, mode: mode
397
+ x4ss.save
398
+
399
+ fileout2 = fileout.sub(/(?=%)/,'b')
400
+ EasyImgUtils.new(fileout, fileout2).scale(scale) unless scale == 1
401
+ EasyImgUtils.new(fileout2, @file_out).animate
337
402
 
403
+ end
338
404
 
339
405
  def sketch(quality: nil)
340
406
 
341
- img = read()
407
+ read() do |img|
342
408
 
343
- # Convert to grayscale
344
- sketch = img.quantize(256, Magick::GRAYColorspace)
409
+ # Convert to grayscale
410
+ sketch = img.quantize(256, Magick::GRAYColorspace)
345
411
 
346
- # Apply histogram equalization
347
- sketch = sketch.equalize
412
+ # Apply histogram equalization
413
+ sketch = sketch.equalize
348
414
 
349
- sketch = sketch.sketch(0, 10, 135)
350
- img = img.dissolve(sketch, 0.75, 0.25)
415
+ sketch = sketch.sketch(0, 10, 135)
416
+ img = img.dissolve(sketch, 0.75, 0.25)
351
417
 
352
- write img, quality
418
+ write img, quality
419
+
420
+ end
353
421
 
354
422
  end
355
423
 
@@ -365,10 +433,12 @@ class EasyImgUtils
365
433
 
366
434
  def vignette(quality: nil)
367
435
 
368
- img = read()
369
- img2 = img.vignette
370
-
371
- write img2, quality
436
+ read() do |img|
437
+
438
+ img2 = img.vignette
439
+ write img2, quality
440
+
441
+ end
372
442
 
373
443
  end
374
444
 
@@ -377,8 +447,28 @@ class EasyImgUtils
377
447
  private
378
448
 
379
449
  def read(file=@file_in)
380
- data, type = RXFHelper.read(file)
381
- Magick::Image.from_blob(data).first
450
+
451
+ files = if file =~ /%d/ then
452
+
453
+ regfilepath = file.sub('%d','(\d+)')
454
+ globfilepath = file.sub('%d','*')
455
+
456
+ a = Dir[globfilepath]
457
+ puts 'a: ' + a.inspect if @debug
458
+ a.sort_by {|x| Regexp.new(regfilepath).match(x).captures[0].to_i }
459
+
460
+ else
461
+ [file]
462
+ end
463
+
464
+ files.each do |filex|
465
+
466
+ @filex_in = filex
467
+ data, type = RXFHelper.read(filex)
468
+ yield(Magick::Image.from_blob(data).first)
469
+
470
+ end
471
+
382
472
  end
383
473
 
384
474
  def run(command, show=false)
@@ -396,19 +486,27 @@ class EasyImgUtils
396
486
 
397
487
  return img.to_blob unless @file_out
398
488
 
399
- if @file_out =~ /^dfs:/ then
489
+ file_out = if @file_out =~ /%d/ then
490
+ regpath = @file_in.sub('%d','(\d+)')
491
+ n = @filex_in[/#{regpath}/,1]
492
+ @file_out.sub('%d',n)
493
+ else
494
+ @file_out
495
+ end
496
+
497
+ if file_out =~ /^dfs:/ then
400
498
 
401
- outfile = File.join(@working_dir, File.basename(@file_out))
499
+ outfile = File.join(@working_dir, File.basename(file_out))
402
500
 
403
501
  img.write outfile do
404
502
  self.quality = quality.to_i if quality
405
503
  end
406
504
 
407
- FileX.cp outfile, @file_out
505
+ FileX.cp outfile, file_out
408
506
 
409
507
  else
410
508
 
411
- img.write @file_out do
509
+ img.write file_out do
412
510
  self.quality = quality.to_i if quality
413
511
  end
414
512
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easyimg_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -11,72 +11,72 @@ cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTkwNTA1MjEzODIwWhcN
15
- MjAwNTA0MjEzODIwWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDlJOU1
17
- WxngJclmOIuKurVqnGO5ngYusS8HkdA+Cz5iaEkcECQ316FsTZI87o2cRi0XV6cI
18
- CwzqZJi2LSZYDpu5H2tOCYgmmuQxSRwQm74TLdBnuy5gT3wu5fQuK1jLMbfmKwTs
19
- RXqNk5TOzD+xKkF2YJqKXuxx0/U/HGE5hAMYL5jI11NGO8HQCKyFzW9wM1aDmjwd
20
- q3AXnVAC/xk5ETmabDpTe6hlfgEQK8E8JUhLVcojUopcQsp/miJwZkleNpNnPJtB
21
- 6nQOaQmIzQ6mvdy6gEabwSk8A0m2OpnkWkg7XAtLbNMugsoY3CrDExMdK5730faa
22
- Q7cx1KkjvaMNxm1qudlpC0ekGv4sHH3P10Lbp3a9XSXQTiZ7dpDUgAt/55mLR2Vn
23
- G097DVu8IstolD/XF1NF8x+Kr0DOC14CeRtqKx64sym/qyl5U4tBJm+cJYRgN4/9
24
- awoHZTBRMiU0Q/WB37EEKGvfoo6qkPJeaFayrNH9szChDjTboGPHNEHOPDcCAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUJcLC8vho
26
- CMcWFSEMVQrIlWvwppowJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAwNTEyMTExNzA0WhcN
15
+ MjEwNTEyMTExNzA0WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDNnJ8h
17
+ QqFXanzUVukVQF0zYimaY+FQLO5mLMKP+PTh2NDWd+UOzngC+3OH5unRId46Pzge
18
+ bUNkK1jTeaMiyqNeubkZqHhIh0u/QzSVihhsn5DLmb5nukbe755VuoG8ISLMWYno
19
+ 2LCLOfPQTtcU/LmMBGMBkKzjQaA/U2BpM3Ao5dKlgyYzxkh9UUGXQzuQc2vp0Msp
20
+ rYOhNSz4CtVex2l3TQiBL7Hw+7dh9PPwon0BLXGnfJnJz8wT/09RLgZjJ2z/Ye/w
21
+ uMWZTE5LswUsP0EqRkRPft0UsjROu4bgAcxY9SXiv2jXCoENQugCJ82/vsjYNs6p
22
+ d7PXBY7OHBao74Ywc4vjiSjLe91ZpKwNwQVFt0yCpV6Gby0ZYcAeHVM3SuYiKrd3
23
+ IJ78q18pR4Oroih1soCyaAozDiax+kPxvtx3s5Rw9P+4LvxjTbMY5dCRGBUSW4s8
24
+ VKv1W1xo1T5ucixalTuGoaEmINv6LI0ZYzyOX6/wdv+s2MgJMOifMO5YnV0CAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUswJyQrQH
26
+ BRQmet2GwVJgUkxLihUwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
27
  c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEANTImQJnRvlqQBDXU1ok4iqW2TFRQMTixEP/zCXDd
29
- IyUz2nwaKvyiTvIVyXpdTWg2UatEvHwaJrFW0Hpghu2f7rYuRvwKpSrPFelEVYJf
30
- wyjtqZIiZfQePXjAc9rdmXzbDY7zTHQedMUcaIFocntclpefGGyFg1m7IKXlcrAK
31
- BEAaygcKB1S6NhHGm4TfRmdEqPN1sY3COMWjv49rkmQBDcz4KIDxHUa33vHieFq5
32
- F+hKSRa1747fYLZc42bpTQBvHR2ZuXRGCY1iNCipXoncu7ZY6wPYvO2HTGDGK9Uk
33
- ByawN6V7m2htGNb+q3zLFgLFP91/+60zBdLc7DfYNEiHXajhJsLKWpcSosC3AUaa
34
- 4IpXr6ATiPj+a8ktF/jAwrpUTFr3qpGa0qW/XVD3o35biL2+3gs6hTqPo3IQYusR
35
- 6PB/a3YCkvA1ipebq/pmmvF9VopoG5giimE7Rkw0QPUi/w6724YH6tVQj077N2mP
36
- WOpXPMFUK6eXTvN8BbxLtUkt
28
+ BgkqhkiG9w0BAQsFAAOCAYEASbXQwXltNOD+/xy+a6FcP6RHDLdUXWVii2QZkwR8
29
+ n9+EXLWH9/pTS1vICTLz3cqwV9J3o+JdwsRFHMGMHFOFwoItWNYC74J2bmR7q4O8
30
+ R22guVDNqYotvSUacFDH/aT/702nEkTyXnGhjA/QsrEgUnVzjYY36WYJKK3YUFjD
31
+ 1UL68GiuaphHNHIYOe/aL2lfI3r30Z0KJ5xLuvJtTtNay/HsBlBavdspUKuBDiMG
32
+ tbTr7XPHZLKpyZCy3JHrNCNmHnkypk2fCgUuz6lMTO5K9lXyXJjMFnim2Wdmpia2
33
+ BJD+IXi6klFyzJLkQyJGcHP6jCodoiV5HWWU0KDSnQMyNs8HmmBr63RshdHWFHoE
34
+ o5mCr4o4SP5vu6sUUDmtMbf9d0XtJ46j3qxdRFYvBrLiVbD5MP4v+vSPv2TkMMZE
35
+ KY48n99T12IOioQ4ghCO1L/UAg2taLOcZbMv4WpV1p9bXKhnrow81zeogZjjiNGS
36
+ OmTAjCfyGFPC/1eXnSV5Smv8
37
37
  -----END CERTIFICATE-----
38
- date: 2019-08-18 00:00:00.000000000 Z
38
+ date: 2020-07-14 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: rmagick
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 4.0.0
47
44
  - - "~>"
48
45
  - !ruby/object:Gem::Version
49
- version: '4.0'
46
+ version: '4.1'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 4.1.2
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: 4.0.0
57
54
  - - "~>"
58
55
  - !ruby/object:Gem::Version
59
- version: '4.0'
56
+ version: '4.1'
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 4.1.2
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: rxfhelper
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - "~>"
65
- - !ruby/object:Gem::Version
66
- version: '0.9'
67
64
  - - ">="
68
65
  - !ruby/object:Gem::Version
69
- version: 0.9.4
66
+ version: 1.0.0
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.0'
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: '0.9'
77
74
  - - ">="
78
75
  - !ruby/object:Gem::Version
79
- version: 0.9.4
76
+ version: 1.0.0
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '1.0'
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: webp-ffi
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -97,6 +97,26 @@ dependencies:
97
97
  - - ">="
98
98
  - !ruby/object:Gem::Version
99
99
  version: 0.2.7
100
+ - !ruby/object:Gem::Dependency
101
+ name: x4ss
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 0.2.0
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.2'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 0.2.0
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '0.2'
100
120
  description:
101
121
  email: james@jamesrobertson.eu
102
122
  executables: []
@@ -123,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
143
  - !ruby/object:Gem::Version
124
144
  version: '0'
125
145
  requirements: []
126
- rubygems_version: 3.0.1
146
+ rubygems_version: 3.0.3
127
147
  signing_key:
128
148
  specification_version: 4
129
149
  summary: Makes manipulating images from 1 line of code easier.
metadata.gz.sig CHANGED
Binary file