2010-09-23 7 views
1

Je suis à la recherche d'un moyen de charger une image png existante, et de faire une manipulation pixel par pixel des valeurs. Idéalement, quelque chose commeManipulation d'image en Ruby

image = Image.open('my.png') 
image = image.map_each_rgb do |r, g, b| 
    [r-12, g+2, b+30] 
end 
image.save('my.png') 

Je l'ai regardé dans rmagick, mais n'a pas pu trouver un moyen d'y parvenir.

Y a-t-il des alternatives qui permettraient une telle retouche d'image?

Répondre

3

Que diriez-vous de la méthode each_pixel de RMagick?

http://studio.imagemagick.org/RMagick/doc/image2.html#each_pixel

img.each_pixel {|pixel, c, r| block } 
+0

Quelqu'un m'a dit, que RMagick a des fuites de mémoire. – Nakilon

+1

Intéressant. Plus de détails à ce sujet [ici] (http://stackoverflow.com/questions/958681/how-to-deal-with-memory-leaks-in-rmagick-in-ruby), [ici] (http: // www .ruby-forum.com/topic/109102), [ici] (http://www.salas.com/2009/06/19/geeky-rmagick-and-memory-leaks/), et [ici] (http : //rubyforge.org/forum/forum.php? thread_id = 1374 & forum_id = 1618) – jrdioko

2

Voici comment faire ce que vous voulez en rubis-vips:

require 'vips' 
include VIPS 

im = Image.new('/home/john/pics/shark.png') 

# y = x.lin(a, b) calculates (y = x * a + b), ie. a linear transform 
# you can pass a single constant for a and b, or an array of constants, in 
# which case one element of the array is used for each channel 

# see http://rubydoc.info/gems/ruby-vips/0.3.0/VIPS/Image#lin-instance_method 

# subtract 12 from red, add 2 to green, add 30 to blue 
im = im.lin [1, 1, 1], [-12, 2, 30] 

im.write('out.png') 

Il est beaucoup plus rapide que rmagick, utilise beaucoup moins de mémoire, et n'a pas (pour autant que je savoir) fuit. Voir:

http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use

+0

Ruby n'a plus besoin de 'require 'rubygems'' pour utiliser les gems. –

+0

mis à jour, merci – user894763

0

Ajouter bijou rmagick pour le rubis ou rmagick4j pour JRuby dans votre fichier de pierres précieuses. En utilisant paperclip convert_options, nous pouvons donner des options pour background-color, border-color, qualité, re-size, shadow etc., Image recadrée: Est implémentée en utilisant paperclip et jcrop Nous pouvons directement appeler jcrop en utilisant id/class. Ensuite, nous pouvons obtenir la nouvelle hauteur et la largeur.

$ (function() {$ ('# cropbox'). Jcrop();}); Pour la taille de recadrage par défaut $ (function() {$ ('# cropbox'). Jcrop (onChange: update_crop, onSelect: update_crop, setSelect: [0, 0, 500, 500], aspectRatio: 1});)

la mise à jour Taille des cultures

fonction update_crop (coords) {$ (« # crop_x ») val (coords.x). $ ('# crop_y'). Val (coords.y); $ ('# Crop_w'). Val (coords.w); $ ('# crop_h'). Val (coords.h); }

Lire l'article complet ici: http://www.railscarma.com/blog/technical-articles/image-manipulation/