def initialize(file)
data = file.respond_to?(:read) ? file.read : File.open(file, 'rb') { |io| io.read }
class << data
attr_accessor :short, :long
def readshort(pos); self[pos..(pos + 1)].unpack(@short)[0]; end
def readlong(pos); self[pos..(pos + 3)].unpack(@long)[0]; end
end
case data[0..1]
when 'II'; data.short, data.long = 'v', 'V'
when 'MM'; data.short, data.long = 'n', 'N'
else; raise 'no II or MM marker found'
end
@ifds = [IFD.new(data)]
while ifd = @ifds.last.next
break if @ifds.find{|i| i.offset == ifd.offset}
@ifds << ifd
end
@jpeg_thumbnails = @ifds.map do |ifd|
if ifd.jpeg_interchange_format && ifd.jpeg_interchange_format_length
start, length = ifd.jpeg_interchange_format, ifd.jpeg_interchange_format_length
data[start..(start + length)]
end
end.compact
end