dynamic_image 3.0.7 → 3.0.8
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/lib/dynamic_image/format.rb +11 -8
- data/lib/dynamic_image/image_reader.rb +4 -2
- data/lib/dynamic_image/metadata.rb +8 -4
- data/lib/dynamic_image/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f8c80c235c367dfba5f1f1dd4090306163154f3405137e1a4c75686b8320f678
|
|
4
|
+
data.tar.gz: ec04c685222c9653f058da65e72d07bfaaabba61015427c7f694868e85dc7ffb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c41a23304affdb4b95892ca12ba3039d2b205d7f4bb6f77f7a2ff72c38dbacd10b90bb9982ff4365608ce946a3204b7af8706f8b05143b85e35457a5710722bb
|
|
7
|
+
data.tar.gz: 75657ccd66682799dc73545bc48ddd35b1ebd703e82979404f4161b7e83a5c4d7bc487d97e791a7858ee648e0cd29f66c392a43d24115882500b810fa7bcfc23
|
data/lib/dynamic_image/format.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module DynamicImage
|
|
4
4
|
class Format
|
|
5
5
|
attr_reader :name, :animated, :content_types, :extensions, :magic_bytes,
|
|
6
|
-
:save_options
|
|
6
|
+
:save_options, :signature
|
|
7
7
|
|
|
8
8
|
def initialize(name, options)
|
|
9
9
|
options = default_options.merge(options)
|
|
@@ -15,6 +15,7 @@ module DynamicImage
|
|
|
15
15
|
@magic_bytes = options[:magic_bytes].map do |s|
|
|
16
16
|
s.dup.force_encoding("binary")
|
|
17
17
|
end
|
|
18
|
+
@signature = options[:signature]
|
|
18
19
|
@save_options = options[:save_options]
|
|
19
20
|
end
|
|
20
21
|
|
|
@@ -22,6 +23,12 @@ module DynamicImage
|
|
|
22
23
|
animated
|
|
23
24
|
end
|
|
24
25
|
|
|
26
|
+
def matches?(bytes)
|
|
27
|
+
return false unless magic_bytes.any? { |b| bytes.start_with?(b) }
|
|
28
|
+
|
|
29
|
+
signature.nil? || signature.call(bytes)
|
|
30
|
+
end
|
|
31
|
+
|
|
25
32
|
def content_type
|
|
26
33
|
content_types.first
|
|
27
34
|
end
|
|
@@ -56,12 +63,7 @@ module DynamicImage
|
|
|
56
63
|
def sniff(bytes)
|
|
57
64
|
return unless bytes
|
|
58
65
|
|
|
59
|
-
formats.
|
|
60
|
-
format.magic_bytes.each do |b|
|
|
61
|
-
return format if bytes.start_with?(b)
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
nil
|
|
66
|
+
formats.find { |format| format.matches?(bytes) }
|
|
65
67
|
end
|
|
66
68
|
|
|
67
69
|
private
|
|
@@ -73,7 +75,7 @@ module DynamicImage
|
|
|
73
75
|
|
|
74
76
|
def default_options
|
|
75
77
|
{ animated: false, content_type: [], extension: [], magic_bytes: [],
|
|
76
|
-
save_options: {} }
|
|
78
|
+
signature: nil, save_options: {} }
|
|
77
79
|
end
|
|
78
80
|
|
|
79
81
|
register(
|
|
@@ -119,6 +121,7 @@ module DynamicImage
|
|
|
119
121
|
content_type: %w[image/webp],
|
|
120
122
|
extension: %w[.webp],
|
|
121
123
|
magic_bytes: ["\x52\x49\x46\x46"],
|
|
124
|
+
signature: ->(bytes) { bytes.bytesize >= 12 && bytes[8, 4] == "WEBP" },
|
|
122
125
|
save_options: { Q: 90, strip: true }
|
|
123
126
|
)
|
|
124
127
|
end
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
module DynamicImage
|
|
4
4
|
class ImageReader
|
|
5
|
+
HEADER_BYTES = 12
|
|
6
|
+
|
|
5
7
|
def initialize(data)
|
|
6
8
|
@data = data
|
|
7
9
|
end
|
|
@@ -37,10 +39,10 @@ module DynamicImage
|
|
|
37
39
|
|
|
38
40
|
def read_file_header
|
|
39
41
|
if @data.is_a?(Pathname)
|
|
40
|
-
File.binread(@data.to_s,
|
|
42
|
+
File.binread(@data.to_s, HEADER_BYTES)
|
|
41
43
|
else
|
|
42
44
|
data_stream = stream
|
|
43
|
-
header = data_stream.read(
|
|
45
|
+
header = data_stream.read(HEADER_BYTES)
|
|
44
46
|
data_stream.seek(0 - header.length, IO::SEEK_CUR) if header
|
|
45
47
|
header
|
|
46
48
|
end
|
|
@@ -65,17 +65,21 @@ module DynamicImage
|
|
|
65
65
|
|
|
66
66
|
def read_metadata
|
|
67
67
|
image = reader.read
|
|
68
|
+
width, height = dimensions_from(image)
|
|
69
|
+
width, height = height, width if rotated?(image)
|
|
70
|
+
{ width:, height:, colorspace: image.get("interpretation") }
|
|
71
|
+
rescue Vips::Error
|
|
72
|
+
:invalid
|
|
73
|
+
end
|
|
68
74
|
|
|
75
|
+
def dimensions_from(image)
|
|
69
76
|
width = image.get("width")
|
|
70
77
|
height = if image.get_fields.include?("page-height")
|
|
71
78
|
image.get("page-height")
|
|
72
79
|
else
|
|
73
80
|
image.get("height")
|
|
74
81
|
end
|
|
75
|
-
|
|
76
|
-
width, height = height, width if rotated?(image)
|
|
77
|
-
|
|
78
|
-
{ width:, height:, colorspace: image.get("interpretation") }
|
|
82
|
+
[width, height]
|
|
79
83
|
end
|
|
80
84
|
|
|
81
85
|
def orientation(image)
|
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.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Inge Jørgensen
|
|
@@ -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: 4.0.
|
|
138
|
+
rubygems_version: 4.0.10
|
|
139
139
|
specification_version: 4
|
|
140
140
|
summary: Rails plugin that simplifies image uploading and processing
|
|
141
141
|
test_files: []
|