Voor een schoolopdracht (photoviewer) heb ik rails als backend gebruikt en omdat ik die mooie polaroid achtige afbeeldingen wilde hebben ben ik op zoek gegaan naar een oplossing in rails. Ik wist dat het mogelijk was met Rmagick, maar ik maakte ook al gebruik van FileColumn. Tijd om die twee te combineren.

Filecolumn had al de mogelijkheid om imagemagick aan te roepen door middel van dit soort code:

class Entry < ActiveRecord::Base
        file_column :image, :magick => { 
          :versions => { "thumb" => "50x50", "medium" => "640x480>"}
        }
end

Maar dit is niet genoeg, ik wil polaroids.

Op de site van rmagick staat een voorbeeld hoe je polaroids kunt maken in Rails. Dit voorbeeld heb ik gecombineerd met Filecolumn en hieronder staat het resultaat:

class Image < ActiveRecord::Base
  rnd = rand(10) - 5
  
  file_column :url, :magick => { 
      :versions => { 
        "polaroid_thumb" => {
            :transformation => Proc.new { |image|
              image.border!(18, 18, "#f0f0ff")

              # Bend the image
              image.background_color = "#2c2b2b"
              amplitude = image.columns * 0.01        
              wavelength = image.rows  * 2
              
              image.rotate!(90)
              image = image.wave(amplitude, wavelength)
              image.rotate!(-90)
              
              # Make the shadow
              shadow = image.flop
              shadow = shadow.colorize(1, 1, 1, "black")     
              shadow.background_color = "#2c2b2b"       
              shadow.border!(10, 10, "#2c2b2b")
              shadow = shadow.blur_image(0, 3)       
              
              # Composite image over shadow. 
              # The y-axis adjustment can vary according to taste.
              image = shadow.composite(
              image, -amplitude/2, 5, Magick::OverCompositeOp)
              
              image.rotate!(- rnd)                       
              image.change_geometry!('800x600>') { 
               |cols, rows, img| img.resize!(cols, rows) 
              }
             }
        },
       }
    }
end

De rnd zorgt ervoor dat elke foto net iets anders geroteerd wordt. Hierdoor ziet het geheel er iets speelser uit.

voorbeeld

Het belangrijkste uit het bovenstaande stuk code is de volgende regel:

:transformation => Proc.new { |image|

Na die regel kun je alle “normale” image magick codes gebruiken.

De magick code kun je nalezen op de Rmagick site, daar wordt ook uitgelegd wat het precies doet.

Een voorbeeld is te vinden op: Kairou.matsimitsu.nl