image_processing 0.4.5 → 0.9.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.

Potentially problematic release.


This version of image_processing might be problematic. Click here for more details.

@@ -0,0 +1,30 @@
1
+ module ImageProcessing
2
+ module Vips
3
+ class Pipeline
4
+ include Chainable
5
+
6
+ def initialize(options)
7
+ @default_options = options
8
+ end
9
+
10
+ def call!(save: true)
11
+ processor = Processor.new(default_options[:source])
12
+ image = processor.load_image(default_options[:loader])
13
+
14
+ default_options[:operations].each do |name, args|
15
+ if name == :custom
16
+ image = args.first.call(image)
17
+ else
18
+ image = processor.apply_operation(name, image, *args)
19
+ end
20
+ end
21
+
22
+ if save
23
+ processor.save_image(image, default_options[:format], default_options[:saver])
24
+ else
25
+ image
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,83 @@
1
+ gem "ruby-vips", "~> 2.0"
2
+ require "vips"
3
+ fail "image_processing/vips requires libvips 8.6+" unless Vips.at_least_libvips?(8, 6)
4
+
5
+ require "image_processing/vips/color"
6
+ require "tempfile"
7
+
8
+ module ImageProcessing
9
+ module Vips
10
+ class Processor
11
+ # libvips has this arbitrary number as a sanity-check upper bound on image
12
+ # size.
13
+ MAX_COORD = 10_000_000
14
+
15
+ def initialize(source)
16
+ fail Error, "source file not provided" unless source
17
+ fail Error, "source file doesn't respond to #path" unless source.respond_to?(:path) || source.is_a?(::Vips::Image)
18
+
19
+ @source = source
20
+ end
21
+
22
+ def apply_operation(name, image, *args)
23
+ if respond_to?(name)
24
+ public_send(name, image, *args)
25
+ else
26
+ result = image.send(name, *args)
27
+ result.is_a?(::Vips::Image) ? result : image
28
+ end
29
+ end
30
+
31
+ def resize_to_limit(image, width, height, **options)
32
+ width, height = default_dimensions(width, height)
33
+ image.thumbnail_image(width, height: height, size: :down, **options)
34
+ end
35
+
36
+ def resize_to_fit(image, width, height, **options)
37
+ width, height = default_dimensions(width, height)
38
+ image.thumbnail_image(width, height: height, **options)
39
+ end
40
+
41
+ def resize_to_fill(image, width, height, **options)
42
+ image.thumbnail_image(width, height: height, crop: :centre, **options)
43
+ end
44
+
45
+ def resize_and_pad(image, width, height, background: "opaque", gravity: "centre", **options)
46
+ image.thumbnail_image(width, height: height, **options)
47
+ .gravity(gravity, width, height, extend: :background, background: Color.get(background))
48
+ end
49
+
50
+ def load_image(**options)
51
+ return @source if @source.is_a?(::Vips::Image)
52
+
53
+ ::Vips::Image.new_from_file(@source.path, fail: true, **options)
54
+ end
55
+
56
+ def save_image(image, format, **options)
57
+ format ||= default_format
58
+ result = Tempfile.new(["image_processing-vips", ".#{format}"], binmode: true)
59
+
60
+ image.write_to_file(result.path, **options)
61
+ result.open # refresh content
62
+
63
+ result
64
+ end
65
+
66
+ private
67
+
68
+ def default_dimensions(width, height)
69
+ raise Error, "either width or height must be specified" unless width || height
70
+
71
+ [width || MAX_COORD, height || MAX_COORD]
72
+ end
73
+
74
+ def default_format
75
+ File.extname(original_path.to_s)[1..-1] || "jpg"
76
+ end
77
+
78
+ def original_path
79
+ @source.path if @source.respond_to?(:path)
80
+ end
81
+ end
82
+ end
83
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: image_processing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janko Marohnić
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-08 00:00:00.000000000 Z
11
+ date: 2018-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 1.4.2
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: '0'
40
+ version: 1.4.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minispec-metadata
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 4.3.5
69
+ - !ruby/object:Gem::Dependency
70
+ name: ruby-vips
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 2.0.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 2.0.0
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: phashion
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -87,12 +101,18 @@ executables: []
87
101
  extensions: []
88
102
  extra_rdoc_files: []
89
103
  files:
104
+ - CHANGELOG.md
90
105
  - LICENSE.txt
91
106
  - README.md
92
107
  - image_processing.gemspec
93
108
  - lib/image_processing.rb
94
109
  - lib/image_processing/mini_magick.rb
95
110
  - lib/image_processing/version.rb
111
+ - lib/image_processing/vips.rb
112
+ - lib/image_processing/vips/chainable.rb
113
+ - lib/image_processing/vips/color.rb
114
+ - lib/image_processing/vips/pipeline.rb
115
+ - lib/image_processing/vips/processor.rb
96
116
  homepage: https://github.com/janko-m/image_processing
97
117
  licenses:
98
118
  - MIT