2010-03-15 20 views

Antwort

2

libimage-size ist eine Ruby-Bibliothek für Bildgrößen für eine Vielzahl von grafischen Formaten zu berechnen. Ein Edelstein ist verfügbar, oder Sie können den Quell-Tarball herunterladen und die Datei image_size.rb extrahieren.

+1

Ich glaube nicht, dass dies mit Rubin funktioniert 1.9 – Jonathan

26

Sie könnten diese (ungetestet) versuchen:

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, Süße, geh nach den Bytes direkt! Alte Schule! –

+0

Ruby 1.9 hat die hier angegebene JPEG-Klasse durchbrochen; Ich habe eine zusätzliche Antwort mit meiner Modifikation dieser Klasse eingereicht, um sowohl unter Ruby 1.8.7 als auch Ruby 1.9 zu arbeiten. – matt

+0

@matt: danke für das kommentieren, du hast mein upvote! – ChristopheD

14

Es gibt eine praktische Methode in der Büroklammer Juwel:

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

Dies funktioniert nur, wenn identify installiert ist. Wenn dies nicht der Fall, wenn PHP installiert ist, können Sie etwas tun:

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

Dies ist eine großartige Lösung, es beruht jedoch auf ImageMagick '' identify' Tool installiert zu werden –

+0

Guter Punkt, mit alternativer Methode aktualisiert. – Zubin

7

Ich habe endlich eine schöne schnelle Art und Weise Dimensionen eines Bildes zu erhalten. Sie sollten MiniMagick verwenden.

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

Welche verwendet ImageMagick, die das Poster nicht verwenden wollte. – jcalvert

+0

Wenigstens hat es mir 2018 geholfen <3 –

26

Es gibt auch eine neue (Juli 2011) Bibliothek, die nicht in der Nähe zu der Zeit war die Frage war ursprünglich gestellt: die Dimensions rubygem (das von demselben Sam Stephenson Autor zu sein scheint, die für die Byte-Manipulation Techniken auch hier vorgeschlagen.)

Below Codebeispiel aus Readme-Projekt

require 'dimensions' 

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

Dieses Juwel hat wirklich gut für mich geklappt. Auf der Oberfläche macht es nicht viel, aber die internen Klassen sind sehr flexibel und gut geschrieben. – bloudermilk

41

ab Juni 2012 FastImage, die „die Größe oder Art eines Bildes seiner uri nach Bedarf durch Abrufen so wenig gegeben finden“ ist eine gute Option. Es funktioniert mit lokalen Images und denen auf Remote-Servern.

Ein IRB Beispiel aus der readme:

require 'fastimage' 

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

Standard-Array Zuordnung in einem Skript:

require 'fastimage' 

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

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

Oder Mehrfachzuordnung in einem Skript verwenden: a

require 'fastimage' 

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

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

Ich denke, das ist eine gute Lösung – seapy

+1

Das funktioniert gut. – Matt

3

Hier Version der JPEG-Klasse aus ChristopheDs Antwort, die sowohl in Ruby 1.8.7 als auch in Ruby 1.9 funktioniert. Dadurch können Sie die Breite und Höhe einer JPEG (.jpg) Bilddatei erhalten, indem Sie direkt auf die Bits schauen. (Alternativ können Sie auch den Dimensions-Edelstein verwenden, wie in einer anderen Antwort vorgeschlagen.)

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 
Verwandte Themen