Is there a simple way to get image dimensions in Ruby?

前端 未结 8 950
隐瞒了意图╮
隐瞒了意图╮ 2020-12-14 06:57

I\'m looking for an easy way to get width and height dimensions for image files in Ruby without having to use ImageMagick or ImageScience (running Snow Leapard).

8条回答
  •  半阙折子戏
    2020-12-14 07:16

    You could try these (untested):

    http://snippets.dzone.com/posts/show/805

    PNG:

    IO.read('image.png')[0x10..0x18].unpack('NN')
    => [713, 54]
    

    GIF:

    IO.read('image.gif')[6..10].unpack('SS')
    => [130, 50]
    

    BMP:

    d = IO.read('image.bmp')[14..28]
    d[0] == 40 ? d[4..-1].unpack('LL') : d[4..8].unpack('SS')
    

    JPG:

    class JPEG
      attr_reader :width, :height, :bits
    
      def initialize(file)
        if file.kind_of? IO
          examine(file)
        else
          File.open(file, 'rb') { |io| examine(io) }
        end
      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:        io.readframe # APP1, contains EXIF tag
            else              io.readframe # ignore frame
          end
        end
      end
    end
    

提交回复
热议问题