2010-03-15 9 views

Répondre

2

libimage-size est une bibliothèque Ruby pour calculer la taille d'image pour une grande variété de formats graphiques. Un bijou est disponible, ou vous pouvez télécharger l'archive tar source et extraire le fichier image_size.rb.

+1

Je ne pense pas que cela fonctionne avec ruby ​​1.9 – Jonathan

26

Vous pouvez essayer ces (non testé):

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 
+3

Ooo, doux, après les octets directement! Vieille école! –

+0

Ruby 1.9 a cassé la classe JPEG que vous citez ici; J'ai soumis une réponse supplémentaire avec ma modification de cette classe pour travailler à la fois sous Ruby 1.8.7 et Ruby 1.9. – matt

+0

@matt: merci de commenter, vous avez mon upvote! – ChristopheD

14

Il y a une méthode pratique dans la gemme paperclip:

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

Cela ne fonctionne que si identify est installé. Dans le cas contraire, si PHP est installé, vous pouvez faire quelque chose comme ceci:

system(%{php -r '$w = getimagesize("#{path}"); echo("${w[0]}x${w[1]}");'}) 
# eg returns "200x100" (width x height) 
+0

C'est une excellente solution, mais elle repose sur l'outil 'identify' d'ImageMagick à installer –

+0

Bon point, mis à jour avec une méthode alternative. – Zubin

7

J'ai enfin trouvé une belle façon rapide pour obtenir les dimensions d'une image. Vous devez utiliser 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] 
+5

Qui utilise ImageMagick, que l'affiche a demandé de ne pas utiliser. – jcalvert

+0

Au moins, il m'a aidé en 2018 <3 –

26

Il y a aussi un nouveau (Juillet 2011) bibliothèque qui était pas là à l'époque a été posé la question: la Dimensions rubygem (qui semble être écrit par le même Sam Stephenson responsable de l'octet de manipulation techniques ont également suggéré ici.)

Ci-dessous exemple de code de README de projet

require 'dimensions' 

Dimensions.dimensions("upload_bird.jpg") # => [300, 225] 
Dimensions.width("upload_bird.jpg")  # => 300 
Dimensions.height("upload_bird.jpg")  # => 225 
+0

Ce bijou s'est très bien passé pour moi. En surface, ça ne fait pas grand-chose mais les classes internes sont très flexibles et bien écrites. – bloudermilk

41

en Juin 2012, FastImage qui « trouve la taille ou le type d'une image donnée ses uri en allant chercher aussi peu que nécessaire » est une bonne option. Cela fonctionne avec les images locales et celles sur les serveurs distants.

Un exemple IRB du readme:

require 'fastimage' 

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

affectation de tableau standard dans un script:

require 'fastimage' 

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

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

Ou, en utilisant de multiples affectations dans un script:

require 'fastimage' 

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

puts "Width: #{width}" 
puts "Height: #{height}" 
+1

Je pense que c'est une bonne solution – seapy

+1

Cela fonctionne bien. – Matt

3

est ici un version de la classe JPEG de la réponse de ChristopheD qui fonctionne à la fois dans Ruby 1.8.7 et Ruby 1.9. Cela vous permet d'obtenir la largeur et la hauteur d'un fichier image JPEG (.jpg) en regardant directement les bits. (Vous pouvez également utiliser la gemme Dimensions, comme suggéré dans une autre réponse.

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