Есть ли простой способ получить размеры изображения в Ruby? - PullRequest
30 голосов
/ 16 марта 2010

Я ищу простой способ получить размеры по ширине и высоте для файлов изображений в Ruby без использования ImageMagick или ImageScience (работает Snow Leapard).

Ответы [ 8 ]

45 голосов
/ 22 июня 2012

По состоянию на июнь 2012 года, FastImage , который "находит размер или тип изображения с учетом его uri, выбирая столько, сколько нужно", является хорошим вариантом. Он работает с локальными образами и изображениями на удаленных серверах.

Пример IRB из файла readme:

require 'fastimage'

FastImage.size("http://stephensykes.com/images/ss.com_x.gif")
=> [266, 56]  # width, height

Стандартное присвоение массива в скрипте:

require 'fastimage'

size_array = FastImage.size("http://stephensykes.com/images/ss.com_x.gif")

puts "Width: #{size_array[0]}"
puts "Height: #{size_array[1]}"

Или, используя несколько назначений в скрипте:

require 'fastimage'

width, height = FastImage.size("http://stephensykes.com/images/ss.com_x.gif")

puts "Width: #{width}"
puts "Height: #{height}"
31 голосов
/ 16 марта 2010

Вы можете попробовать это (не проверено):

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
30 голосов
/ 02 ноября 2011

Существует также новая (июль 2011) библиотека, которой не было в то время, когда был задан вопрос: Размеры rubygem (который, кажется, создан тем же Сэмом Стивенсоном, ответственным за байт методы манипуляции также предложены здесь.)

Ниже пример кода из README проекта

require 'dimensions'

Dimensions.dimensions("upload_bird.jpg")  # => [300, 225]
Dimensions.width("upload_bird.jpg")       # => 300
Dimensions.height("upload_bird.jpg")      # => 225
14 голосов
/ 15 июля 2010

В скрепке есть удобный метод:

>> Paperclip::Geometry.from_file("/path/to/image.jpg")
=> 180x180

Это работает, только если установлена ​​identify. Если это не так, если PHP установлен, вы можете сделать что-то вроде этого:

system(%{php -r '$w = getimagesize("#{path}"); echo("${w[0]}x${w[1]}");'})
# eg returns "200x100" (width x height)
8 голосов
/ 03 мая 2011

Я наконец-то нашел хороший быстрый способ получить размеры изображения. Вы должны использовать MiniMagick .

require 'mini_magick'

image = MiniMagick::Image.open('http://www.thetvdb.com/banners/fanart/original/81189-43.jpg')
assert_equal 1920, image[:width]
assert_equal 1080, image[:height]
4 голосов
/ 16 марта 2010

libimage-size - это библиотека Ruby для расчета размеров изображений для широкого спектра графических форматов. Gem доступен, или вы можете скачать исходный архив и извлечь файл image_size.rb.

3 голосов
/ 13 сентября 2012

Вот версия класса JPEG из ответа ChristopheD, которая работает как в Ruby 1.8.7, так и в Ruby 1.9. Это позволяет вам получить ширину и высоту файла изображения JPEG (.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)
    if RUBY_VERSION >= "1.9"
      class << io
        def getc; super.bytes.first; end
        def readchar; super.bytes.first; end
      end
    end
    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
    raise 'malformed JPEG' unless io.getc == 0xFF && io.getc == 0xD8 # SOI
    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
        # colons not allowed in 1.9, change to "then"
        when 0xD9, 0xDA then  break # EOI, SOS
        when 0xFE then        @comment = io.readframe # COM
        when 0xE1 then        io.readframe # APP1, contains EXIF tag
        else                  io.readframe # ignore frame
      end
    end
  end
end
0 голосов
/ 23 ноября 2018

Для PNG я получил эту модифицированную версию метода ChristopeD.

File.binread(path, 64)[0x10..0x18].unpack('NN')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...