Pour un projet j’ai besoin de manipuler du format png et j’ai décidé d’utiliser la gem chunky_png pour faire ça. Comme je ne la connais pas, j’écris aujourd’hui une rapide prise en main de cette gem, histoire de me familiariser avec.

Pour l’installer, c’est comme d’habitude:

gem install chunky_png

Pour la documentation on pourra commencer par le wiki du projet.

La première chose que je veux faire c’est lire et écrire un fichier png.

require "chunky_png"

image = ChunkyPNG::Image.from_file(ARGV[0])
image.save("copy.png")

Après l’avoir lancé, ce programme crée une copie de l’image originale sous le nom “copy.png”:

[~]⇒ ruby test.rb test.png 

Super, bon début. Maintenant je voudrais accéder à la valeur RGB d’un pixel quelconque de l’image. Voici le second programme:

require "chunky_png"

image = ChunkyPNG::Image.from_file(ARGV[0])

p ChunkyPNG::Color.r(image[0, 0])
p ChunkyPNG::Color.g(image[20, 20])
p ChunkyPNG::Color.b(image[40, 40])
p ChunkyPNG::Color.to_hex(image[60, 60])
p ChunkyPNG::Color.to_truecolor_bytes(image[80, 80])

Et un exemple de sortie possible:

[~]⇒ ruby test2.rb test.png 
255
255
255
"#000000ff"
[0, 0, 0]

L’image est vue comme un tableau à 2 dimensions: image[x, y]. Les méthodes r, g et b renvoient respectivement la composante rouge, verte ou bleue du pixel. La méthode to_hex formate à la HTML et la méthode to_truecolor_bytes renvoie un tableau des trois composantes RGB.

J’aimerais maintenant dessiner un rectangle dans l’image:

require "chunky_png"

image = ChunkyPNG::Image.from_file(ARGV[0])
image.rect(0, 0, 99, 99)
image.save("copy.png")

Si vous lancez ce programme (avec ruby test3.rb test.png), vous verrez qu’il dessine bien un rectangle (x = 0, y = 0, largeur = 99, hauteur = 99). Malheureusement, seul le contour du rectangle est dessiné. Pour dessiner un rectangle rempli, il en faut un peu plus:

require "chunky_png"

my_color = ChunkyPNG::Color.rgb(10, 100, 200)

image = ChunkyPNG::Image.from_file(ARGV[0])
image.rect(0, 0, 99, 99, my_color, my_color)
image.save("copy.png")

Cette fois on a bien un rectangle rempli. Et au passage on voit comment définir une couleur au format RGB.

Pour finir, je voudrais créer une image:

require "chunky_png"

image = ChunkyPNG::Image.new(400,
                             400,
                             ChunkyPNG::Color::WHITE)

my_color = ChunkyPNG::Color.rgb(10, 100, 200)
my_color2 = ChunkyPNG::Color.rgb(110, 10, 100)

image.rect(0, 0, 199, 199, my_color, my_color)
image.rect(200, 200, 399, 399, my_color2, my_color2)

image.save("new.png")

Le programme se lance avec ruby test5.rb et crée une nouvelle image new.png. Le constructeur de Image prend tout simplement la largeur, la hauteur et la couleur de fond de l’image.

En bref, chunky_png est une gem qui a l’air simple a utiliser.

À demain.