exifr 0.10.2 → 0.10.3
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.
- data/CHANGELOG +4 -1
- data/Rakefile +1 -1
- data/lib/jpeg.rb +1 -1
- data/lib/tiff.rb +54 -28
- data/tests/test_tiff.rb +20 -1
- metadata +3 -3
    
        data/CHANGELOG
    CHANGED
    
    | @@ -1,5 +1,8 @@ | |
| 1 | 
            +
            EXIF Reader 0.10.3
         | 
| 2 | 
            +
            * YAML friendly; can now safely (de)serialize
         | 
| 3 | 
            +
             | 
| 1 4 | 
             
            EXIF Reader 0.10.2
         | 
| 2 | 
            -
            * bug fix (thanks to Alexander Staubo for providing me  | 
| 5 | 
            +
            * bug fix (thanks to Alexander Staubo for providing me with sample data);
         | 
| 3 6 | 
             
              don't fail on out-of-range IFD offsets for Apple Aperture generated JPGs
         | 
| 4 7 |  | 
| 5 8 | 
             
            EXIF Reader 0.10.1
         | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/lib/jpeg.rb
    CHANGED
    
    | @@ -35,7 +35,7 @@ module EXIFR | |
| 35 35 | 
             
                  !exif.nil?
         | 
| 36 36 | 
             
                end
         | 
| 37 37 |  | 
| 38 | 
            -
                #  | 
| 38 | 
            +
                # Dispatch to EXIF.  When no EXIF data is available but the +method+ does exist
         | 
| 39 39 | 
             
                # for EXIF data +nil+ will be returned.
         | 
| 40 40 | 
             
                def method_missing(method, *args)
         | 
| 41 41 | 
             
                  super unless args.empty?
         | 
    
        data/lib/tiff.rb
    CHANGED
    
    | @@ -12,7 +12,7 @@ module EXIFR | |
| 12 12 | 
             
              # == Orientation
         | 
| 13 13 | 
             
              # The property <tt>:orientation</tt> describes the subject rotated and/or
         | 
| 14 14 | 
             
              # mirrored in relation to the camera.  It is translated to one of the following
         | 
| 15 | 
            -
              #  | 
| 15 | 
            +
              # instances:
         | 
| 16 16 | 
             
              # * TopLeftOrientation
         | 
| 17 17 | 
             
              # * TopRightOrientation
         | 
| 18 18 | 
             
              # * BottomRightOrientation
         | 
| @@ -22,7 +22,7 @@ module EXIFR | |
| 22 22 | 
             
              # * RightBottomOrientation
         | 
| 23 23 | 
             
              # * LeftBottomOrientation
         | 
| 24 24 | 
             
              #
         | 
| 25 | 
            -
              # These  | 
| 25 | 
            +
              # These instances of Orientation have two methods:
         | 
| 26 26 | 
             
              # * <tt>to_i</tt>; return the original integer
         | 
| 27 27 | 
             
              # * <tt>transform_rmagick(image)</tt>; transforms the given RMagick::Image
         | 
| 28 28 | 
             
              #   to a viewable version
         | 
| @@ -33,7 +33,7 @@ module EXIFR | |
| 33 33 | 
             
              #   EXIFR::TIFF.new('DSC_0218.TIF').model           # => "NIKON D1X"
         | 
| 34 34 | 
             
              #   EXIFR::TIFF.new('DSC_0218.TIF').date_time       # => Tue May 23 19:15:32 +0200 2006
         | 
| 35 35 | 
             
              #   EXIFR::TIFF.new('DSC_0218.TIF').exposure_time   # => Rational(1, 100)
         | 
| 36 | 
            -
              #   EXIFR::TIFF.new('DSC_0218.TIF').orientation     # => EXIFR::TIFF:: | 
| 36 | 
            +
              #   EXIFR::TIFF.new('DSC_0218.TIF').orientation     # => EXIFR::TIFF::Orientation
         | 
| 37 37 | 
             
              class TIFF
         | 
| 38 38 | 
             
                include Enumerable
         | 
| 39 39 |  | 
| @@ -241,28 +241,51 @@ module EXIFR | |
| 241 241 | 
             
                  end
         | 
| 242 242 | 
             
                end
         | 
| 243 243 |  | 
| 244 | 
            +
                # The orientation of the image with respect to the rows and columns.
         | 
| 245 | 
            +
                class Orientation
         | 
| 246 | 
            +
                  def initialize(value, type) # :nodoc:
         | 
| 247 | 
            +
                    @value, @type = value, type
         | 
| 248 | 
            +
                  end
         | 
| 249 | 
            +
                  
         | 
| 250 | 
            +
                  # Field value.
         | 
| 251 | 
            +
                  def to_i
         | 
| 252 | 
            +
                    @value
         | 
| 253 | 
            +
                  end
         | 
| 254 | 
            +
                  
         | 
| 255 | 
            +
                  # Rotate and/or flip for proper viewing.
         | 
| 256 | 
            +
                  def transform_rmagick(img)
         | 
| 257 | 
            +
                    case @type
         | 
| 258 | 
            +
                    when :TopRight    : img.flop
         | 
| 259 | 
            +
                    when :BottomRight : img.rotate(180)
         | 
| 260 | 
            +
                    when :BottomLeft  : img.flip
         | 
| 261 | 
            +
                    when :LeftTop     : img.rotate(90).flop
         | 
| 262 | 
            +
                    when :RightTop    : img.rotate(90)
         | 
| 263 | 
            +
                    when :RightBottom : img.rotate(270).flop
         | 
| 264 | 
            +
                    when :LeftBottom  : img.rotate(270)     
         | 
| 265 | 
            +
                    else
         | 
| 266 | 
            +
                      img
         | 
| 267 | 
            +
                    end
         | 
| 268 | 
            +
                  end
         | 
| 269 | 
            +
                  
         | 
| 270 | 
            +
                  def ==(other) # :nodoc:
         | 
| 271 | 
            +
                    Orientation === other && to_i == other.to_i
         | 
| 272 | 
            +
                  end
         | 
| 273 | 
            +
                end
         | 
| 274 | 
            +
                
         | 
| 244 275 | 
             
                ORIENTATIONS = [] # :nodoc:
         | 
| 245 276 | 
             
                [
         | 
| 246 277 | 
             
                  nil,
         | 
| 247 | 
            -
                   | 
| 248 | 
            -
                   | 
| 249 | 
            -
                   | 
| 250 | 
            -
                   | 
| 251 | 
            -
                   | 
| 252 | 
            -
                   | 
| 253 | 
            -
                   | 
| 254 | 
            -
                   | 
| 255 | 
            -
                ].each_with_index do | | 
| 256 | 
            -
                  next unless  | 
| 257 | 
            -
                   | 
| 258 | 
            -
                  
         | 
| 259 | 
            -
                  eval <<-EOS
         | 
| 260 | 
            -
                    module #{name}Orientation
         | 
| 261 | 
            -
                      def self.to_i; #{index}; end
         | 
| 262 | 
            -
                      def self.transform_rmagick(img); #{rmagic_code}; end
         | 
| 263 | 
            -
                    end
         | 
| 264 | 
            -
                    ORIENTATIONS[#{index}] = #{name}Orientation
         | 
| 265 | 
            -
                  EOS
         | 
| 278 | 
            +
                  :TopLeft,
         | 
| 279 | 
            +
                  :TopRight,
         | 
| 280 | 
            +
                  :BottomRight,
         | 
| 281 | 
            +
                  :BottomLeft,
         | 
| 282 | 
            +
                  :LeftTop,
         | 
| 283 | 
            +
                  :RightTop,
         | 
| 284 | 
            +
                  :RightBottom,
         | 
| 285 | 
            +
                  :LeftBottom,
         | 
| 286 | 
            +
                ].each_with_index do |type,index|
         | 
| 287 | 
            +
                  next unless type
         | 
| 288 | 
            +
                  const_set("#{type}Orientation", ORIENTATIONS[index] = Orientation.new(index, type))
         | 
| 266 289 | 
             
                end
         | 
| 267 290 |  | 
| 268 291 | 
             
                ADAPTERS = Hash.new { proc { |v| v } } # :nodoc:
         | 
| @@ -278,21 +301,21 @@ module EXIFR | |
| 278 301 |  | 
| 279 302 | 
             
                # +file+ is a filename or an IO object.
         | 
| 280 303 | 
             
                def initialize(file)
         | 
| 281 | 
            -
                   | 
| 304 | 
            +
                  data = file.respond_to?(:read) ? file.read : File.open(file, 'rb') { |io| io.read }
         | 
| 282 305 |  | 
| 283 | 
            -
                  class <<  | 
| 306 | 
            +
                  class << data
         | 
| 284 307 | 
             
                    attr_accessor :short, :long
         | 
| 285 308 | 
             
                    def readshort(pos); self[pos..(pos + 1)].unpack(@short)[0]; end
         | 
| 286 309 | 
             
                    def readlong(pos); self[pos..(pos + 3)].unpack(@long)[0]; end
         | 
| 287 310 | 
             
                  end
         | 
| 288 311 |  | 
| 289 | 
            -
                  case  | 
| 290 | 
            -
                  when 'II';  | 
| 291 | 
            -
                  when 'MM';  | 
| 312 | 
            +
                  case data[0..1]
         | 
| 313 | 
            +
                  when 'II'; data.short, data.long = 'v', 'V'
         | 
| 314 | 
            +
                  when 'MM'; data.short, data.long = 'n', 'N'
         | 
| 292 315 | 
             
                  else; raise 'no II or MM marker found'
         | 
| 293 316 | 
             
                  end
         | 
| 294 317 |  | 
| 295 | 
            -
                  @ifds = [IFD.new( | 
| 318 | 
            +
                  @ifds = [IFD.new(data)]
         | 
| 296 319 | 
             
                  while ifd = @ifds.last.next; @ifds << ifd; end
         | 
| 297 320 | 
             
                end
         | 
| 298 321 |  | 
| @@ -384,6 +407,9 @@ module EXIFR | |
| 384 407 | 
             
                    IFD.new(@data, @offset_next) unless @offset_next == 0 || @offset_next >= @data.size
         | 
| 385 408 | 
             
                  end
         | 
| 386 409 |  | 
| 410 | 
            +
                  def to_yaml_properties
         | 
| 411 | 
            +
                    '@fields'
         | 
| 412 | 
            +
                  end
         | 
| 387 413 | 
             
                private
         | 
| 388 414 | 
             
                  def add_field(field)
         | 
| 389 415 | 
             
                    return unless tag = TAG_MAPPING[@type][field.tag]
         | 
    
        data/tests/test_tiff.rb
    CHANGED
    
    | @@ -64,7 +64,16 @@ class TestTIFF < Test::Unit::TestCase | |
| 64 64 | 
             
                all_test_exifs.each do |fname|
         | 
| 65 65 | 
             
                  orientation = TIFF.new(fname).orientation
         | 
| 66 66 | 
             
                  if orientation
         | 
| 67 | 
            -
                     | 
| 67 | 
            +
                    assert [
         | 
| 68 | 
            +
                      TIFF::TopLeftOrientation,
         | 
| 69 | 
            +
                      TIFF::TopRightOrientation,
         | 
| 70 | 
            +
                      TIFF::BottomRightOrientation,
         | 
| 71 | 
            +
                      TIFF::BottomLeftOrientation,
         | 
| 72 | 
            +
                      TIFF::LeftTopOrientation,
         | 
| 73 | 
            +
                      TIFF::RightTopOrientation,
         | 
| 74 | 
            +
                      TIFF::RightBottomOrientation,
         | 
| 75 | 
            +
                      TIFF::LeftBottomOrientation
         | 
| 76 | 
            +
                    ].any? { |c| orientation == c }, 'not an orientation'
         | 
| 68 77 | 
             
                    assert orientation.respond_to?(:to_i)
         | 
| 69 78 | 
             
                    assert orientation.respond_to?(:transform_rmagick)
         | 
| 70 79 | 
             
                    tested += 1
         | 
| @@ -117,4 +126,14 @@ class TestTIFF < Test::Unit::TestCase | |
| 117 126 | 
             
                  assert_not_nil @t[:f_number]
         | 
| 118 127 | 
             
                end
         | 
| 119 128 | 
             
              end
         | 
| 129 | 
            +
              
         | 
| 130 | 
            +
              def test_yaml_dump_and_load
         | 
| 131 | 
            +
                require 'yaml'
         | 
| 132 | 
            +
                
         | 
| 133 | 
            +
                all_test_tiffs.each do |fname|
         | 
| 134 | 
            +
                  t = TIFF.new(fname)
         | 
| 135 | 
            +
                  y = YAML.dump(t)
         | 
| 136 | 
            +
                  assert_equal t.to_hash, YAML.load(y).to_hash
         | 
| 137 | 
            +
                end
         | 
| 138 | 
            +
              end
         | 
| 120 139 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,10 +1,10 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 | 
            -
            rubygems_version: 0.9. | 
| 2 | 
            +
            rubygems_version: 0.9.4
         | 
| 3 3 | 
             
            specification_version: 1
         | 
| 4 4 | 
             
            name: exifr
         | 
| 5 5 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 6 | 
            -
              version: 0.10. | 
| 7 | 
            -
            date: 2007- | 
| 6 | 
            +
              version: 0.10.3
         | 
| 7 | 
            +
            date: 2007-10-23 00:00:00 +02:00
         | 
| 8 8 | 
             
            summary: EXIF Reader is a module to read EXIF from JPEG images.
         | 
| 9 9 | 
             
            require_paths: 
         | 
| 10 10 | 
             
            - lib
         |