Szukam łatwego sposobu na uzyskanie wymiarów szerokości i wysokości dla plików graficznych w Ruby bez konieczności korzystania z ImageMagick lub ImageScience (z systemem Snow Leapard).Czy istnieje prosty sposób na uzyskanie wymiarów obrazu w Ruby?
Odpowiedz
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
.
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
Ooo, słodko, chodź po bajtach bezpośrednio! Stara szkoła! –
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
@matt: dzięki za komentowanie, dostałem moje uptoote! – ChristopheD
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)
To jest świetne rozwiązanie, jednak opiera się na narzędziu ImageMagick "Identyfikacja" do zainstalowania –
Dobra uwaga, zaktualizowana za pomocą alternatywnej metody. – Zubin
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]
Który korzysta z ImageMagick, którego plakat nie powinien używać. – jcalvert
Przynajmniej pomógł mi w 2018 roku <3 –
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
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
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}"
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
- 1. Czy istnieje prosty sposób na uzyskanie rozmiaru obiektu java?
- 2. Czy istnieje prosty sposób na wykonywanie wielowierszowych ciągów w Ruby?
- 3. Szybki sposób uzyskiwania wymiarów obrazu (bez formatowania)
- 4. Czy istnieje prosty sposób na uzyskanie ID folderu na podstawie danej ścieżki?
- 5. Czy istnieje prosty sposób na uzyskanie danych użytkownika AuthComponent z widoku w CakePHP?
- 6. Czy istnieje prosty sposób na uzyskanie parametrów ciągu zapytania z identyfikatora URI w systemie Windows Phone?
- 7. Czy istnieje sposób na uzyskanie narzędzia javadoc do dokumentowania adnotacji?
- 8. Prosty sposób na uzyskanie elementu według identyfikatora w znaczniku div?
- 9. Czy istnieje prosty sposób instalowania biblioteki Lisp, na przykład ruby gem (Ruby) lub easy_install (Python)?
- 10. Czy istnieje sprytny sposób na uzyskanie sortable target w jQueryUI
- 11. Czy istnieje sposób na uzyskanie obwiedni (w pikselach) elementu DOM?
- 12. Czy istnieje sposób na uzyskanie wszystkich wartości w NSUserDefaults?
- 13. Czy istnieje łatwy sposób na uzyskanie nazwy ServerName w Symfony?
- 14. Czy istnieje sposób na uzyskanie REPL w pydev?
- 15. Czy istnieje sposób na uzyskanie identyfikatora pakietu w czasie wykonywania?
- 16. Czy istnieje sposób na uzyskanie wyjątku w Haskell?
- 17. Czy istnieje sposób na uzyskanie ograniczeń tabeli w SQLite?
- 18. Czy istnieje sposób na uzyskanie ruchów obiektów całkowitych w vim?
- 19. Czy istnieje sposób na uzyskanie pi w arkuszu kalkulacyjnym CSS?
- 20. Czy istnieje sposób na uzyskanie CSS XSS w nowoczesnych przeglądarkach?
- 21. Czy istnieje prosty sposób na otwarcie Uri i uzyskanie czegokolwiek, co wskazuje? (C#)
- 22. Czy istnieje prosty sposób na ocenę JavaScript w WebStorm?
- 23. Czy istnieje prosty sposób na autouzupełnianie bloków zmiennych w Xcode?
- 24. SCSS - Uzyskiwanie wymiarów obrazu
- 25. Czy istnieje lepszy sposób na uzyskanie wartości z bloku w Ruby?
- 26. Czy istnieje szybki sposób na znalezienie brakujących końców w Ruby?
- 27. Czy istnieje prosty sposób porównywania wystąpień BufferedImage?
- 28. Czy istnieje sposób na uzyskanie IEqualityComparer od programu IComparer?
- 29. Czy istnieje prosty sposób logowania się do metod, które są wywoływane na obiekcie w Ruby?
- 30. Czy istnieje sposób na uzyskanie SQL utworzony przez kwerendę LINQ?
Nie sądzę, że to działa z rubinem 1.9 – Jonathan