Sha256: 7174454354cc96454b8ae3ec030e39d5a5de4a8811fc3018ab62b7b5101aeee8

Contents?: true

Size: 732 Bytes

Versions: 6

Compression:

Stored size: 732 Bytes

Contents

require 'dimscan/base_scanner'

module Dimscan
  # Scans dimensions from a JPEG image
  class JPEGScanner < BaseScanner
    SOF0 = [0xFF, 0xC0, 0x00, 0x11, 0x08]

    protected

    def scan(bytes)
      # Dimensions are in bytes 4-8 after SOF0
      last_slice = nil
      bytes.each_cons(SOF0.size + 4) do |slice|
        yield slice.first.chr
        last_slice = slice
        if slice.first(SOF0.size) == SOF0
          return extract_dimensions(slice.last(4))
        end
      end
      yield last_slice[1..-1].map(&:chr).join
      nil
    end

    def extract_dimensions(bytes)
      # height is before width in jpeg header
      byte_string = bytes.map(&:chr).join
      byte_string.unpack('nn').reverse
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
dimscan-0.2.3 lib/dimscan/jpeg_scanner.rb
dimscan-0.2.2 lib/dimscan/jpeg_scanner.rb
dimscan-0.2.1 lib/dimscan/jpeg_scanner.rb
dimscan-0.2.0 lib/dimscan/jpeg_scanner.rb
dimscan-0.1.1 lib/dimscan/jpeg_scanner.rb
dimscan-0.1.0 lib/dimscan/jpeg_scanner.rb