dynamic_image 3.0.6 → 3.0.7
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 +4 -4
- data/README.md +0 -2
- data/lib/dynamic_image/controller.rb +11 -6
- data/lib/dynamic_image/image_processor.rb +2 -8
- data/lib/dynamic_image/image_reader.rb +10 -5
- data/lib/dynamic_image/metadata.rb +25 -17
- data/lib/dynamic_image/model/transformations.rb +1 -1
- data/lib/dynamic_image/model.rb +1 -1
- data/lib/dynamic_image/processed_image.rb +19 -5
- data/lib/dynamic_image/version.rb +1 -1
- metadata +14 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 63df20c9bb3d9e6ec0c62667a3d885086f2f17e2e5d3cf7181dcdef9d6c52057
|
|
4
|
+
data.tar.gz: f94ae92030634af73011e745b96f445091c5140824b309a23ff653bc75f2d831
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 10cda7189c6319e1e6e73c07856cf5d302d870485f5139e7389efa2c9f12fb2302e242f3fa7924d7ba4732c6525ad55e5b4e54d8e6430d88211dcb1dc0f1ce14
|
|
7
|
+
data.tar.gz: 8077111478b4900b85086bd85849c94eb6fd372533ea3529a89c035d267e4c1b97e302f9a87b6621d40f6db9d9cc17bdf9e4f39696034f7ec7e9c111c885ab94
|
data/README.md
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
[](https://rubygems.org/gems/dynamic_image)
|
|
2
2
|

|
|
3
|
-
[](https://codeclimate.com/github/elektronaut/dynamic_image)
|
|
4
|
-
[](https://codeclimate.com/github/elektronaut/dynamic_image)
|
|
5
3
|
|
|
6
4
|
# DynamicImage
|
|
7
5
|
|
|
@@ -64,11 +64,16 @@ module DynamicImage
|
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
def process_and_send(image, options)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
processed = DynamicImage::ProcessedImage.new(image, options)
|
|
68
|
+
variant = processed.variant_for(requested_size)
|
|
69
|
+
send_opts = { filename: filename(processed.format),
|
|
70
|
+
content_type: processed.format.content_type,
|
|
71
|
+
disposition: "inline" }
|
|
72
|
+
if variant
|
|
73
|
+
send_file(variant.data_file_path, **send_opts)
|
|
74
|
+
else
|
|
75
|
+
send_data(processed.cropped_and_resized(requested_size), **send_opts)
|
|
76
|
+
end
|
|
72
77
|
end
|
|
73
78
|
|
|
74
79
|
def render_image(options)
|
|
@@ -90,7 +95,7 @@ module DynamicImage
|
|
|
90
95
|
|
|
91
96
|
respond_to do |format|
|
|
92
97
|
format.any(:gif, :jpeg, :jpg, :png, :tiff, :webp) do
|
|
93
|
-
|
|
98
|
+
send_file(@record.data_file_path,
|
|
94
99
|
filename:,
|
|
95
100
|
content_type: @record.content_type,
|
|
96
101
|
disposition:)
|
|
@@ -49,14 +49,8 @@ module DynamicImage
|
|
|
49
49
|
|
|
50
50
|
# Returns the image data as a binary string.
|
|
51
51
|
def read
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
tempfile.close
|
|
55
|
-
write(tempfile.path)
|
|
56
|
-
tempfile.open
|
|
57
|
-
tempfile.read
|
|
58
|
-
ensure
|
|
59
|
-
tempfile.close
|
|
52
|
+
image.write_to_buffer(target_format.extension,
|
|
53
|
+
**target_format.save_options)
|
|
60
54
|
end
|
|
61
55
|
|
|
62
56
|
# Returns the image size as a Vector2d.
|
|
@@ -16,7 +16,8 @@ module DynamicImage
|
|
|
16
16
|
if @data.is_a?(String)
|
|
17
17
|
Vips::Image.new_from_buffer(@data, option_string)
|
|
18
18
|
else
|
|
19
|
-
|
|
19
|
+
path = @data.is_a?(Pathname) ? @data.to_s : @data.path
|
|
20
|
+
Vips::Image.new_from_file(path + option_string, access: :random)
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
|
|
@@ -35,10 +36,14 @@ module DynamicImage
|
|
|
35
36
|
end
|
|
36
37
|
|
|
37
38
|
def read_file_header
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
if @data.is_a?(Pathname)
|
|
40
|
+
File.binread(@data.to_s, 8)
|
|
41
|
+
else
|
|
42
|
+
data_stream = stream
|
|
43
|
+
header = data_stream.read(8)
|
|
44
|
+
data_stream.seek(0 - header.length, IO::SEEK_CUR) if header
|
|
45
|
+
header
|
|
46
|
+
end
|
|
42
47
|
end
|
|
43
48
|
|
|
44
49
|
def stream
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
module DynamicImage
|
|
4
4
|
# = DynamicImage Metadata
|
|
5
5
|
#
|
|
6
|
-
# Parses metadata from an image.
|
|
7
|
-
# binary string.
|
|
6
|
+
# Parses metadata from an image. Accepts a Pathname, IO, or binary string.
|
|
8
7
|
class Metadata
|
|
9
8
|
def initialize(data)
|
|
10
9
|
@data = data
|
|
@@ -60,26 +59,35 @@ module DynamicImage
|
|
|
60
59
|
@metadata ||= read_metadata
|
|
61
60
|
end
|
|
62
61
|
|
|
63
|
-
def read_image
|
|
64
|
-
yield reader.read.autorot
|
|
65
|
-
end
|
|
66
|
-
|
|
67
62
|
def reader
|
|
68
63
|
@reader ||= DynamicImage::ImageReader.new(@data)
|
|
69
64
|
end
|
|
70
65
|
|
|
71
66
|
def read_metadata
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
67
|
+
image = reader.read
|
|
68
|
+
|
|
69
|
+
width = image.get("width")
|
|
70
|
+
height = if image.get_fields.include?("page-height")
|
|
71
|
+
image.get("page-height")
|
|
72
|
+
else
|
|
73
|
+
image.get("height")
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
width, height = height, width if rotated?(image)
|
|
77
|
+
|
|
78
|
+
{ width:, height:, colorspace: image.get("interpretation") }
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def orientation(image)
|
|
82
|
+
return 1 unless image.get_fields.include?("orientation")
|
|
83
|
+
|
|
84
|
+
image.get("orientation")
|
|
85
|
+
rescue Vips::Error
|
|
86
|
+
1
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def rotated?(image)
|
|
90
|
+
orientation(image).between?(5, 8)
|
|
83
91
|
end
|
|
84
92
|
end
|
|
85
93
|
end
|
|
@@ -76,7 +76,7 @@ module DynamicImage
|
|
|
76
76
|
|
|
77
77
|
def transform_image(&block)
|
|
78
78
|
read_image_metadata if data_changed?
|
|
79
|
-
self.data = block.call(DynamicImage::ImageProcessor.new(
|
|
79
|
+
self.data = block.call(DynamicImage::ImageProcessor.new(Pathname(data_file_path))).read
|
|
80
80
|
read_image_metadata
|
|
81
81
|
self
|
|
82
82
|
end
|
data/lib/dynamic_image/model.rb
CHANGED
|
@@ -41,10 +41,24 @@ module DynamicImage
|
|
|
41
41
|
return nil unless record.persisted?
|
|
42
42
|
|
|
43
43
|
variant = record.variants.find_by(variant_params(size))
|
|
44
|
-
variant
|
|
45
|
-
|
|
46
|
-
variant.
|
|
47
|
-
|
|
44
|
+
return nil unless variant
|
|
45
|
+
|
|
46
|
+
if Dis::Storage.exists?(variant.class.dis_type, variant.content_hash)
|
|
47
|
+
variant
|
|
48
|
+
else
|
|
49
|
+
variant.destroy
|
|
50
|
+
nil
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Find or create a variant for the given size, returning the variant
|
|
55
|
+
# record (not data). Returns nil if the record is not persisted.
|
|
56
|
+
def variant_for(size)
|
|
57
|
+
return nil unless record.persisted?
|
|
58
|
+
|
|
59
|
+
find_or_create_variant(size)
|
|
60
|
+
rescue ActiveRecord::RecordNotUnique
|
|
61
|
+
find_variant(size)
|
|
48
62
|
end
|
|
49
63
|
|
|
50
64
|
def format
|
|
@@ -68,7 +82,7 @@ module DynamicImage
|
|
|
68
82
|
def normalized
|
|
69
83
|
require_valid_image!
|
|
70
84
|
|
|
71
|
-
image = DynamicImage::ImageProcessor.new(record.
|
|
85
|
+
image = DynamicImage::ImageProcessor.new(Pathname(record.data_file_path))
|
|
72
86
|
image = yield(image) if block_given?
|
|
73
87
|
image.convert(format).read
|
|
74
88
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dynamic_image
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0.
|
|
4
|
+
version: 3.0.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Inge Jørgensen
|
|
@@ -15,20 +15,14 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - "~>"
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '1.
|
|
19
|
-
- - ">="
|
|
20
|
-
- !ruby/object:Gem::Version
|
|
21
|
-
version: 1.1.11
|
|
18
|
+
version: '1.2'
|
|
22
19
|
type: :runtime
|
|
23
20
|
prerelease: false
|
|
24
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
22
|
requirements:
|
|
26
23
|
- - "~>"
|
|
27
24
|
- !ruby/object:Gem::Version
|
|
28
|
-
version: '1.
|
|
29
|
-
- - ">="
|
|
30
|
-
- !ruby/object:Gem::Version
|
|
31
|
-
version: 1.1.11
|
|
25
|
+
version: '1.2'
|
|
32
26
|
- !ruby/object:Gem::Dependency
|
|
33
27
|
name: rails
|
|
34
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -47,16 +41,22 @@ dependencies:
|
|
|
47
41
|
name: ruby-vips
|
|
48
42
|
requirement: !ruby/object:Gem::Requirement
|
|
49
43
|
requirements:
|
|
50
|
-
- - "
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '2.1'
|
|
47
|
+
- - "<"
|
|
51
48
|
- !ruby/object:Gem::Version
|
|
52
|
-
version: 2.
|
|
49
|
+
version: '2.4'
|
|
53
50
|
type: :runtime
|
|
54
51
|
prerelease: false
|
|
55
52
|
version_requirements: !ruby/object:Gem::Requirement
|
|
56
53
|
requirements:
|
|
57
|
-
- - "
|
|
54
|
+
- - ">="
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
version: '2.1'
|
|
57
|
+
- - "<"
|
|
58
58
|
- !ruby/object:Gem::Version
|
|
59
|
-
version: 2.
|
|
59
|
+
version: '2.4'
|
|
60
60
|
- !ruby/object:Gem::Dependency
|
|
61
61
|
name: vector2d
|
|
62
62
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
135
135
|
- !ruby/object:Gem::Version
|
|
136
136
|
version: '0'
|
|
137
137
|
requirements: []
|
|
138
|
-
rubygems_version:
|
|
138
|
+
rubygems_version: 4.0.3
|
|
139
139
|
specification_version: 4
|
|
140
140
|
summary: Rails plugin that simplifies image uploading and processing
|
|
141
141
|
test_files: []
|