fastimage 2.3.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +64 -20
- data/lib/fastimage/fastimage.rb +471 -0
- data/lib/fastimage/fastimage_parsing/avif.rb +12 -0
- data/lib/fastimage/fastimage_parsing/bmp.rb +17 -0
- data/lib/fastimage/fastimage_parsing/exif.rb +76 -0
- data/lib/fastimage/fastimage_parsing/fiber_stream.rb +58 -0
- data/lib/fastimage/fastimage_parsing/gif.rb +63 -0
- data/lib/fastimage/fastimage_parsing/heic.rb +8 -0
- data/lib/fastimage/fastimage_parsing/ico.rb +9 -0
- data/lib/fastimage/fastimage_parsing/image_base.rb +17 -0
- data/lib/fastimage/fastimage_parsing/iso_bmff.rb +176 -0
- data/lib/fastimage/fastimage_parsing/jpeg.rb +52 -0
- data/lib/fastimage/fastimage_parsing/jxl.rb +13 -0
- data/lib/fastimage/fastimage_parsing/jxlc.rb +75 -0
- data/lib/fastimage/fastimage_parsing/png.rb +26 -0
- data/lib/fastimage/fastimage_parsing/psd.rb +7 -0
- data/lib/fastimage/fastimage_parsing/stream_util.rb +19 -0
- data/lib/fastimage/fastimage_parsing/svg.rb +69 -0
- data/lib/fastimage/fastimage_parsing/tiff.rb +16 -0
- data/lib/fastimage/fastimage_parsing/type_parser.rb +69 -0
- data/lib/fastimage/fastimage_parsing/webp.rb +60 -0
- data/lib/fastimage/version.rb +1 -1
- data/lib/fastimage.rb +3 -1072
- metadata +23 -6
@@ -0,0 +1,69 @@
|
|
1
|
+
module FastImageParsing
|
2
|
+
class TypeParser
|
3
|
+
def initialize(stream)
|
4
|
+
@stream = stream
|
5
|
+
end
|
6
|
+
|
7
|
+
# type will use peek to get enough bytes to determing the type of the image
|
8
|
+
def type
|
9
|
+
parsed_type = case @stream.peek(2)
|
10
|
+
when "BM"
|
11
|
+
:bmp
|
12
|
+
when "GI"
|
13
|
+
:gif
|
14
|
+
when 0xff.chr + 0xd8.chr
|
15
|
+
:jpeg
|
16
|
+
when 0x89.chr + "P"
|
17
|
+
:png
|
18
|
+
when "II", "MM"
|
19
|
+
case @stream.peek(11)[8..10]
|
20
|
+
when "APC", "CR\002"
|
21
|
+
nil # do not recognise CRW or CR2 as tiff
|
22
|
+
else
|
23
|
+
:tiff
|
24
|
+
end
|
25
|
+
when '8B'
|
26
|
+
:psd
|
27
|
+
when "\xFF\x0A".b
|
28
|
+
:jxl
|
29
|
+
when "\0\0"
|
30
|
+
case @stream.peek(3).bytes.to_a.last
|
31
|
+
when 0
|
32
|
+
# http://www.ftyps.com/what.html
|
33
|
+
case @stream.peek(12)[4..-1]
|
34
|
+
when "ftypavif"
|
35
|
+
:avif
|
36
|
+
when "ftypavis"
|
37
|
+
:avif
|
38
|
+
when "ftypheic"
|
39
|
+
:heic
|
40
|
+
when "ftypmif1"
|
41
|
+
:heif
|
42
|
+
else
|
43
|
+
if @stream.peek(7)[4..-1] == 'JXL'
|
44
|
+
:jxl
|
45
|
+
end
|
46
|
+
end
|
47
|
+
# ico has either a 1 (for ico format) or 2 (for cursor) at offset 3
|
48
|
+
when 1 then :ico
|
49
|
+
when 2 then :cur
|
50
|
+
end
|
51
|
+
when "RI"
|
52
|
+
:webp if @stream.peek(12)[8..11] == "WEBP"
|
53
|
+
when "<s"
|
54
|
+
:svg if @stream.peek(4) == "<svg"
|
55
|
+
when /\s\s|\s<|<[?!]/, 0xef.chr + 0xbb.chr
|
56
|
+
# Peek 10 more chars each time, and if end of file is reached just raise
|
57
|
+
# unknown. We assume the <svg tag cannot be within 10 chars of the end of
|
58
|
+
# the file, and is within the first 1000 chars.
|
59
|
+
begin
|
60
|
+
:svg if (1..100).detect {|n| @stream.peek(10 * n).include?("<svg")}
|
61
|
+
rescue FiberError, FastImage::CannotParseImage
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
parsed_type or raise FastImage::UnknownImageType
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module FastImageParsing
|
2
|
+
class Webp < ImageBase # :nodoc:
|
3
|
+
def dimensions
|
4
|
+
vp8 = @stream.read(16)[12..15]
|
5
|
+
_len = @stream.read(4).unpack("V")
|
6
|
+
case vp8
|
7
|
+
when "VP8 "
|
8
|
+
parse_size_vp8
|
9
|
+
when "VP8L"
|
10
|
+
parse_size_vp8l
|
11
|
+
when "VP8X"
|
12
|
+
parse_size_vp8x
|
13
|
+
else
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def animated?
|
19
|
+
vp8 = @stream.read(16)[12..15]
|
20
|
+
_len = @stream.read(4).unpack("V")
|
21
|
+
case vp8
|
22
|
+
when "VP8 "
|
23
|
+
false
|
24
|
+
when "VP8L"
|
25
|
+
false
|
26
|
+
when "VP8X"
|
27
|
+
flags = @stream.read(4).unpack("C")[0]
|
28
|
+
flags & 2 > 0
|
29
|
+
else
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def parse_size_vp8
|
37
|
+
w, h = @stream.read(10).unpack("@6vv")
|
38
|
+
[w & 0x3fff, h & 0x3fff]
|
39
|
+
end
|
40
|
+
|
41
|
+
def parse_size_vp8l
|
42
|
+
@stream.skip(1) # 0x2f
|
43
|
+
b1, b2, b3, b4 = @stream.read(4).bytes.to_a
|
44
|
+
[1 + (((b2 & 0x3f) << 8) | b1), 1 + (((b4 & 0xF) << 10) | (b3 << 2) | ((b2 & 0xC0) >> 6))]
|
45
|
+
end
|
46
|
+
|
47
|
+
def parse_size_vp8x
|
48
|
+
flags = @stream.read(4).unpack("C")[0]
|
49
|
+
b1, b2, b3, b4, b5, b6 = @stream.read(6).unpack("CCCCCC")
|
50
|
+
width, height = 1 + b1 + (b2 << 8) + (b3 << 16), 1 + b4 + (b5 << 8) + (b6 << 16)
|
51
|
+
|
52
|
+
if flags & 8 > 0 # exif
|
53
|
+
# parse exif for orientation
|
54
|
+
# TODO: find or create test images for this
|
55
|
+
end
|
56
|
+
|
57
|
+
[width, height]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/fastimage/version.rb
CHANGED