12
votes

Lire une image Pixel de Pixel à Ruby

J'essaie d'ouvrir un fichier image et de stocker une liste de pixels par couleur dans une variable / matrice afin que je puisse leur donner un par un.

Type d'image: Pourrait être BMP, JPG, GIF ou PNG. N'importe lequel d'entre eux va bien et un seul doit être soutenu. Sortie de couleur: RVB ou HEX.

J'ai regardé quelques bibliothèques (Rmagick, Quick_Magick, Mini_magick, etc.) et ils semblent tous trop. Heroku a également une sorte de difficultés d'imagemagick et mes tests ne fonctionnent pas. Ma candidature est à Sinatra.

Toute suggestion?


0 commentaires

3 Réponses :


15
votes

Vous pouvez utiliser rmagick 's chaque_pixel méthode pour cela. chaque_pixel reçoit un bloc. Pour chaque pixel, le bloc est passé le pixel, le numéro de colonne et le numéro de ligne du pixel. Il itère sur les pixels de gauche à droite et de haut en bas.

alors quelque chose comme: xxx


7 commentaires

Juste curieux; Comment se passe la performance de Rmagick dans ce cas? Je travaille sur un moteur de jeu en tant que passe-temps qui utilise une extrémité frontale rubis et que leur classe bitmap intégrée est extrêmement lente en ce qui concerne l'accès pixel-by-pixel.


La question initiale indique que l'auteur a examiné Rmagick et l'a déterminé à être «Overkill».


@Phogz pour que tu as bowvote? Même si le PO détermine que cela soit surchargé, cela ne signifie pas que c'est. S'ils savaient vraiment ce dont ils avaient besoin, ils n'auraient pas demandé. Cette réponse est correcte et fait ce qui est demandé.


Pour de grandes images, cette méthode sera probablement gonflée. Une méthode plus rapide serait d'utiliser img.export_pixels_to_str , puis extraire des pixels individuels de la chaîne résultante.


Cela a travaillé plus facile pour moi. Je l'ai déterminé comme une excédente plus tôt en supposant que les moyens plus simples, non-ImageMagick, ont accès à tout type de pixel d'image. Rmagick L'installation est désormais beaucoup plus facile avec certains scripts automatisés (y compris ImageMagick Installer) et j'ai été en mesure d'accéder facilement aux pixels.


Juste si vous savez, l'objet Pixel de Rmagick fuit la mémoire de tous les temps et ne peut pas vraiment être nettoyé: x


Qu'y a-t-il dans l'objet IMG?



1
votes

Si vous n'ouvrez que le fichier pour afficher les octets et que vous n'avez pas besoin de le manipuler comme une image, c'est un processus simple d'ouverture du fichier comme n'importe quel autre nombre, lecture x nombre d'octets, puis itération sur eux. . Quelque chose comme: xxx

qui va simplement générer des octets comme décimal. Vous voudrez examiner les valeurs d'octet et construire des valeurs RVB pour déterminer les couleurs, donc peut-être utiliser chaque_slice (3) et lire en multiples de 3 octets aidera.

Divers formats d'image contiennent des blocs d'en-tête et de fuite différents utilisés pour stocker des informations sur l'image, le format de données et les informations EXIF ​​pour le périphérique de capture, en fonction du type. Vous allez probablement avec une chose non comprimée serait bon si vous allez lire un fichier et émis directement les octets, tels que TIFF non compressé. Une fois que vous avez décidé de sauter dans le fichier pour ignorer les en-têtes si vous le souhaitez, ou simplement lire ceux-ci aussi pour voir ou apprendre ce qui y est. Formats de fichier image est un bon point de saut pour plus d'informations sur les différents formats disponibles. < / p>

Si vous voulez seulement voir les données d'image, l'une des bibliothèques de haut niveau aidera car elles ont des interfaces pour saisir des sections particulières de l'image. Mais, en réalité, l'accès aux octets n'est pas difficile, il n'est pas non plus de sauter.

Si vous souhaitez en savoir plus sur le bloc Exif, utilisé pour décrire beaucoup de formats JPEG et TIFF de différents fournisseurs exifool peut être pratique. Il est écrit en Perl afin que vous puissiez examiner la façon dont le code fonctionne. Les documents affichent joliment les blocs d'en-tête et les champs, et vous pouvez lire / écrire des valeurs à l'aide de l'application.

Je suis en train de tester un nouveau routeur, donc je n'ai pas eu la chance de tester que code, mais il devrait être proche. Je vais vérifier dans un peu et mettre à jour la réponse si cela n'a pas fonctionné.


7 commentaires

Je devrais clarifier; Le format importe parce que l'OP ne veut pas d'informations d'en-tête et de ne plus que des données de pixel.


OP ne spécifie pas que les en-têtes doivent être ignorés. Si vous supposez peut-être que vous puissiez demander au PO de clarifier plutôt que de la bownvote.


Et je cite - "J'essaie d'ouvrir un fichier image et de stocker une liste de pixels par couleur dans une variable / tableau afin que je puisse leur donner un par un." Semble assez clair.


La baisse correspond à la manière dont vous séparez les bonnes réponses des réponses mauvaises / non utiles. Cette réponse était fausse. Il a maintenant été édité, mais cela ne répond toujours pas à la question. C'est rien de personnel.


Bien que je comprenne l'intention des descentes, cette réponse est parfaitement convaincue pour la question de l'OP. +1 Sauf clarification de la question, cette réponse est correcte.


Merci Alex, je suis d'accord. L'OP n'est pas clair. Cela pourrait être une affectation de programmation ou un défi à auto-attribué pour acquérir un accès à bas niveau à des fichiers structurés, tels que des images, car les bibliothèques de haut niveau sont «Overkill».


Je suppose que je suis d'accord avec ça. Je l'ai édité pour supprimer mon bowvote en tenant compte des informations que vous avez ajoutées avec votre édition.



14
votes

Je pense png chunky devrait le faire pour vous. C'est un pur rubis, raisonnablement léger, efficace de la mémoire et permet d'accéder aux données de pixels ainsi que de métadonnées d'image.


6 commentaires

+1, bonne bibliothèque. Cette réponse serait encore meilleure si vous avez fourni un extrait de code qui utilise chunky png pour faire ce qui est demandé. Mais, cette bibliothèque est uniquement pour les PNG. L'OP indique spécifiquement que le fichier pourrait être plus que PNG.


@Alex je pense que vous avez mal interprété l'OP. Il dit que "quelqu'un d'entre eux va bien et un seul doit être soutenu". J'interprète cela signifie que l'OP utilisera tout le format est le plus facile basé sur la bibliothèque.


Correct, supportant que PNG est bien. Il mentionne évidemment de la Rmagick, mais cela nécessite-t-il toujours un soutien d'ImageMagick?


@Andersh Si vous suivez le lien et lisez la première ligne du Readme, il est indiqué: "Cette bibliothèque peut lire et écrire des fichiers PNG. Il est écrit dans Pure Ruby pour une portabilité maximale. Permettez-moi de reformuler: il ne nécessite pas Rmagick ou toute autre bibliothèque d'images de la fuite de la mémoire. "


Le png chunky est vraiment génial - je le recommande vivement. Chaque expérience que j'ai eue avec Rmagick a finalement conduit à Segfault et à d'autres crashs étranges. Il doit être une bibliothèque de dernier recours, et je serais certainement très fatigué de celui-ci si vous devez incorporer une entrée utilisateur.


@ALEX suggère que cette réponse serait bien meilleure avec un extrait de code et je suis d'accord. Un extrait approprié peut être trouvé à: Stackoverflow.com/questions/11905978/...