Lies ein Bild Pixel für Pixel in Ruby

8

Ich versuche, eine Bilddatei zu öffnen und eine Liste von Pixeln nach Farbe in einer Variablen / einem Array zu speichern, damit ich sie einzeln ausgeben kann.

Bildtyp: Könnte BMP, JPG, GIF oder PNG sein. Jeder von ihnen ist in Ordnung und nur einer muss unterstützt werden. Farbausgabe: RGB oder Hex.

Ich habe mir ein paar Bibliotheken angeschaut (RMagick, Quick_Magick, Mini_Magick, etc) und sie scheinen alle übertrieben zu sein. Heroku hat auch einige Schwierigkeiten mit ImageMagick und meine Tests laufen nicht. Meine Bewerbung ist in Sinatra.

Irgendwelche Vorschläge?

    
Anders H 03.12.2010, 03:05
quelle

3 Antworten

13

Sie können dafür die Methode Rmagick von each_pixel verwenden. each_pixel erhält einen Block. Für jedes Pixel wird dem Block das Pixel, die Spaltennummer und die Zeilennummer des Pixels übergeben. Es iteriert über die Pixel von links nach rechts und von oben nach unten.

So etwas wie:

%Vor%     
Alex 03.12.2010, 03:21
quelle
14

Ich denke, Chunky PNG sollte es für dich tun. Es ist purer Rubin, relativ leicht, speichereffizient und bietet Zugriff auf Pixeldaten sowie Bildmetadaten.

    
Phrogz 03.12.2010 05:05
quelle
1

Wenn Sie die Datei nur öffnen, um die Bytes anzuzeigen, und sie nicht als Bild bearbeiten müssen, ist es ein einfacher Prozess, die Datei wie jede andere zu öffnen, X Bytes zu lesen und dann über sie zu iterieren . Etwas wie:

%Vor%

Das wird nur Bytes als Dezimalzahl ausgeben. Sie sollten sich die Byte-Werte ansehen und RGB-Werte erstellen, um die Farben zu bestimmen. Vielleicht hilft also each_slice(3) und das Lesen von Vielfachen von 3 Bytes.

Verschiedene Bildformate enthalten unterschiedliche Header- und Trailing-Blöcke, die abhängig vom Typ Informationen über das Bild, das Datenformat und EXIF-Informationen für das Erfassungsgerät speichern. Es wäre gut, wenn Sie mit einer unkomprimierten Datei arbeiten würden, wenn Sie eine Datei lesen und die Bytes direkt ausgeben möchten, z. B. unkomprimiertes TIFF. Sobald Sie sich dazu entschieden haben, können Sie in die Datei springen, um Header zu überspringen, wenn Sie möchten, oder einfach nur diese lesen, um zu sehen oder zu erfahren, was in ihnen steckt. Die Bilddateiformate Seite von Wikipedia ist ein guter Ausgangspunkt, um mehr über die verschiedenen verfügbaren Formate zu erfahren.

Wenn Sie nur die Bilddaten sehen möchten, hilft eine der High-Level-Bibliotheken, da sie über Schnittstellen verfügen, um bestimmte Bereiche des Bildes zu erfassen. Aber tatsächlich ist der Zugriff auf die Bytes nicht schwer, noch ist es ein Sprung.

Wenn Sie mehr über den EXIF-Block erfahren möchten, mit dem viele verschiedene JPEG- und TIFF-Formate beschrieben werden ExifTool kann nützlich sein. Es ist in Perl geschrieben, damit Sie sehen können, wie der Code funktioniert. Die Dokumente zeigen die Header-Blöcke und -Felder ansprechend, und Sie können Werte mit der App lesen / schreiben.

Ich bin dabei, einen neuen Router zu testen, also hatte ich noch keine Gelegenheit, diesen Code zu testen, aber er sollte in der Nähe sein. Ich werde es ein wenig überprüfen und die Antwort aktualisieren, wenn das nicht funktioniert.

    
the Tin Man 03.12.2010 03:28
quelle

Tags und Links