Je cherche un moyen facile d'obtenir des dimensions de largeur et de hauteur pour les fichiers image dans Ruby sans avoir à utiliser ImageMagick ou ImageScience (en cours d'exécution Snow Leapard).Existe-t-il un moyen simple d'obtenir des dimensions d'image dans Ruby?
Répondre
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
.
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
Ooo, doux, après les octets directement! Vieille école! –
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
@matt: merci de commenter, vous avez mon upvote! – ChristopheD
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)
C'est une excellente solution, mais elle repose sur l'outil 'identify' d'ImageMagick à installer –
Bon point, mis à jour avec une méthode alternative. – Zubin
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]
Qui utilise ImageMagick, que l'affiche a demandé de ne pas utiliser. – jcalvert
Au moins, il m'a aidé en 2018 <3 –
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
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
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}"
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
Je ne pense pas que cela fonctionne avec ruby 1.9 – Jonathan