2010-03-15 18 views

Odpowiedz

2

libimage-size jest biblioteką Ruby do obliczania wielkości obrazu do różnych formatów graficznych. Klejnot jest dostępny lub możesz pobrać archiwum źródłowe i wyodrębnić plik image_size.rb.

+1

Nie sądzę, że to działa z rubinem 1.9 – Jonathan

26

Można spróbować tych (niesprawdzone):

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łodko, chodź po bajtach bezpośrednio! Stara szkoła! –

+0

Ruby 1.9 złamał klasę JPEG, którą tu cytujesz; Przekazałem dodatkową odpowiedź z moją modyfikacją tej klasy do pracy zarówno pod Ruby 1.8.7, jak i Ruby 1.9. – matt

+0

@matt: dzięki za komentowanie, dostałem moje uptoote! – ChristopheD

14

Jest poręczny sposób na gem spinacza:

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

Zadziała tylko, jeśli zainstalowano identify. Jeśli tak nie jest, jeśli jest zainstalowany PHP, można zrobić coś takiego:

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

To jest świetne rozwiązanie, jednak opiera się na narzędziu ImageMagick "Identyfikacja" do zainstalowania –

+0

Dobra uwaga, zaktualizowana za pomocą alternatywnej metody. – Zubin

7

I w końcu znaleźć ładne szybki sposób, aby uzyskać wymiary obrazu. Powinieneś użyć 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

Który korzysta z ImageMagick, którego plakat nie powinien używać. – jcalvert

+0

Przynajmniej pomógł mi w 2018 roku <3 –

26

Jest też nowy (lipiec 2011) biblioteki, które nie było w pobliżu w czasie kwestia została pierwotnie zapytał: Dimensions rubygem (co wydaje się być autorstwa samego Sama Stephensona odpowiedzialnej za bajtów-manipulacji techniki zasugerował również tutaj).

Poniżej próbki kodu z README projektu

require 'dimensions' 

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

Ten klejnot zadziałał bardzo dobrze dla mnie. Na pozór nie robi to wiele, ale klasy wewnętrzne są bardzo elastyczne i dobrze napisane. – bloudermilk

41

w czerwcu 2012 roku, FastImage która „odnajduje rozmiar lub typ obrazu danego jej uri pobierając tak mało jak potrzeba” jest dobra opcja. Działa z obrazami lokalnymi i zdalnymi serwerami.

IRB przykład z readme:

require 'fastimage' 

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

Standardowe przypisanie tablicy w skrypcie:

require 'fastimage' 

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

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

Lub przy wielokrotnego przypisania w skrypcie:

require 'fastimage' 

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

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

Myślę, że to jest dobre rozwiązanie – seapy

+1

To działa dobrze. – Matt

3

Oto wersja klasy JPEG z odpowiedzi ChristopheD'a, która działa zarówno w Rubim 1.8.7, jak i Rubim 1.9. Pozwala to uzyskać szerokość i wysokość pliku graficznego JPEG (.jpg), patrząc bezpośrednio na bity. (Alternatywnie, po prostu użyj klejnotu Wymiary, jak zasugerowano w innej odpowiedzi.)

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 
Powiązane problemy