I am completely new to image processing. I know nothing about what is JPEG internally and how it works.
I wonder, if I can find somewhere piece of ruby code performing following simple operation:
- Open jpeg file.
- Iterate through each pixel and set it's color to fx green.
- Write result to another file.
I am especially interested in how this can be accomplished using ruby-vips library
https://github.com/ender672/ruby-vips
My goal - to learn how to perform basic image processing operations using ruby-vips (gamma correction, brightness, tint, ...)
Any links to working examples more complex than 'hello world'-like one on ruby-vips's github page would be highly appreciated!
If there are alternatives to ruby-vips, I would be thankful for them too.
UPDATE
Much has happened since I asked this question:
- ruby-vips is a gem: http://libvips.blogspot.co.uk/2012/06/ruby-vips-launches.html
- complete rewrite for vips8, now based on ruby-ffi
- Source code repository is here: https://github.com/jcupitt/ruby-vips/
- The examples of usage: https://github.com/jcupitt/ruby-vips/wiki/Examples
- Basic concepts of vips image processing: https://github.com/jcupitt/ruby-vips/wiki/Basic-concepts
- ruby-vips integration into CarrierWave uploader plugin for Ruby on Rails: https://github.com/eltiare/carrierwave-vips
- ruby-vips is one of the official backends for ActiveStorage in rails6
update ruby-vips has changed a bit since this answer was written. I've revised it for the current (2018) version.
I'm one of the maintainers of libvips, the image processing library that ruby-vips wraps.
Tim's ruby-vips repository hasn't been touched for a while. I have a fork here that works with current libvips:
https://github.com/jcupitt/ruby-vips
There are some examples here:
https://github.com/jcupitt/ruby-vips/tree/master/example
To set the red and blue channels to zero and just leave a green image you might multiply R and B by zero and G by 1. ruby-vips uses arrays to represent pixel constants, so you can just write:
A complete runnable example might be:
There's a trick you can use for
new_from_file
: if you know you will just be doing simple top-to-bottom operations on the image, like arithmetic or filtering or resize, you can tell ruby-vips that you only need sequential access to pixels:Now ruby-vips will stream your image. It'll run the load, the multiply and the save all in parallel and never keep more than a few scanlines of pixels in memory at any one time. This can give a really nice improvement to speed and memory use.
To change image gamma you might try something like:
Though that'll be a bit slow (it'll call pow() three times for each pixel), it'd be much faster to make a lookup table, run the pow() on that, then map the image through the table:
Any questions, please feel free to open them on the rubyvips issue tracker:
https://github.com/jcupitt/ruby-vips/issues