Ich bin auf der Suche nach einem einfachen Weg, um Breite und Höhe für Bilddateien in Ruby zu erhalten, ohne ImageMagick oder ImageScience (mit Snow Leapard) zu verwenden.Gibt es eine einfache Möglichkeit, Bildabmessungen in Ruby zu erhalten?
Antwort
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.
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
Ooo, Süße, geh nach den Bytes direkt! Alte Schule! –
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
@matt: danke für das kommentieren, du hast mein upvote! – ChristopheD
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)
Dies ist eine großartige Lösung, es beruht jedoch auf ImageMagick '' identify' Tool installiert zu werden –
Guter Punkt, mit alternativer Methode aktualisiert. – Zubin
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]
Welche verwendet ImageMagick, die das Poster nicht verwenden wollte. – jcalvert
Wenigstens hat es mir 2018 geholfen <3 –
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
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
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}"
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
- 1. Gibt es eine einfache Möglichkeit, das Alphabet programmatisch zu erhalten?
- 2. Gibt es eine einfache Möglichkeit, alle gängigen Modulerweiterungen zu erhalten?
- 3. Gibt es eine einfache Möglichkeit, Benutzer von Facebook zu erhalten?
- 4. Gibt es eine einfache Möglichkeit, Routing in JSF zu implementieren?
- 5. Gibt es eine einfache Möglichkeit, Kriterien in HQL zu konvertieren?
- 6. Gibt es eine einfache Möglichkeit, JavaScript in WebStorm zu bewerten?
- 7. Gibt es eine einfache Möglichkeit, InternalsVisibleToAttribute zu verwenden?
- 8. Gibt es eine einfache Möglichkeit, TypeScript-Definitionen zu installieren?
- 9. Gibt es eine einfache Möglichkeit, ein ASP.NET-Formular zu löschen?
- 10. Gibt es eine einfache Möglichkeit, jshint mit Netbeans zu integrieren?
- 11. Gibt es eine einfache Möglichkeit, Bilder schräg zu stellen?
- 12. Gibt es eine einfache Möglichkeit, einen Code TextBox zu erstellen?
- 13. Gibt es eine einfache Möglichkeit, mit Basscss zu beginnen?
- 14. Gibt es eine einfache Möglichkeit, Hoptoad mit CakePHP zu verwenden?
- 15. Gibt es eine einfache Möglichkeit, den Flex Preloader zu verstecken?
- 16. Gibt es eine einfache Möglichkeit, Openshift Autoscaling zu testen?
- 17. Gibt es eine einfache Möglichkeit, Gulture mit Django zu verwenden?
- 18. Gibt es eine einfache Möglichkeit, zwei System.Drawing.Color-Werte zu mischen?
- 19. Gibt es eine einfache Möglichkeit, mit Open MPI zu klingeln?
- 20. Gibt es eine einfache Möglichkeit, eine Tabelle in Prozedur umzubenennen?
- 21. Gibt es eine einfache Möglichkeit, alle "magischen Variablen" wie $ 1, $ usw. zu lokalisieren (zu erhalten)?
- 22. Gibt es eine einfache Möglichkeit, die JavaScript-Ausgabe in Java (mit Eclipse) zu erhalten?
- 23. Gibt es eine einfache Möglichkeit, nach mehreren Kriterien zu sortieren, die Bindungen in R erhalten?
- 24. Gibt es eine einfache Möglichkeit, Punkte mit schwarzem Umriss in gnuplot zu erhalten?
- 25. Gibt es eine einfache Möglichkeit, die Datensatznummer N in einer Abfrage zu erhalten?
- 26. Gibt es eine einfache Möglichkeit, den Servernamen in Symfony zu erhalten?
- 27. Gibt es eine Möglichkeit, Publishing Queue in Sitecore zu erhalten?
- 28. Gibt es eine Möglichkeit, Quartalstermine in MS SQL zu erhalten?
- 29. Gibt es eine Möglichkeit, eine Cookie-Antwort schnell zu erhalten?
- 30. Gibt es eine einfache Histogrammfunktion?
Ich glaube nicht, dass dies mit Rubin funktioniert 1.9 – Jonathan