Sha256: a31e76452d21a61e901842c9a470f1329c46d3aebd33f1395636a498b0cdc5c5

Contents?: true

Size: 1.8 KB

Versions: 2

Compression:

Stored size: 1.8 KB

Contents

# Copyright (c) 2006 - R.W. van 't Veer

require 'rational'

module EXIFR
  # = JPEG decoder
  #
  # == Examples
  #   EXIFR::JPEG.new('IMG_3422.JPG').width         # -> 2272
  #   EXIFR::JPEG.new('IMG_3422.JPG').exif.model    # -> "Canon PowerShot G3"
  class JPEG
    # image height
    attr_reader :height
    # image width
    attr_reader :width
    # number of bits per ???
    attr_reader :bits
    # image comment
    attr_reader :comment
    # hash of exif data if available
    attr_reader :exif

    # +file+ is a filename or an IO object
    def initialize(file)
      if file.kind_of? IO
        examine(file)
      else
        File.open(file, 'rb') { |io| examine(io) }
      end
    end

    # returns +true+ when EXIF data is available
    def exif?
      !exif.nil?
    end

  private
    def examine(io)
      raise 'malformed JPEG' unless io.getc == 0xFF && io.getc == 0xD8 # SOI

      class << io
        def readint; (readchar << 8) + readchar; end
        def readframe; read(readint - 2); end
        def readsof; [readint, readchar, readint, readint, readchar]; end
        def next
          c = readchar while c != 0xFF
          c = readchar while c == 0xFF
          c
        end
      end

      while marker = io.next
        case marker
          when 0xC0..0xC3, 0xC5..0xC7, 0xC9..0xCB, 0xCD..0xCF # SOF markers
            length, @bits, @height, @width, components = io.readsof
            raise 'malformed JPEG' unless length == 8 + components * 3
          when 0xD9, 0xDA:  break # EOI, SOS
          when 0xFE:        @comment = io.readframe # COM
          when 0xE1:        app1 = io.readframe # APP1, contains EXIF tag
          else              io.readframe # ignore frame
        end
      end

      if app1 && EXIF
        @exif = EXIF.new(app1[6..-1]) # rescue nil
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
exifr-0.9 lib/jpeg.rb
exifr-0.9.1 lib/jpeg.rb