Ruby wrapper for libwebp. What is WebP?
WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.
First of all you should have install libraries: libpng, libjpeg and libwebp (for libwebp need libpng and libjpeg).
For ubuntu, debian:
sudo apt-get install libjpeg62-dev libpng12-dev libtiff4-dev
For Mac OS:
sudo port install jpeg libpng tiff
or:
brew install libjpg libpng libtiff
Next, you should install libwebp.
Add this line to your application's Gemfile:
gem 'webp-ffi'
And then execute:
$ bundle
Or install it yourself as:
$ gem install webp-ffi
Basic info about libwebp (encoder and decoder versions):
$ irb
2.0.0p0 :001 > require 'webp_ffi'
=> true
2.0.0p0 :002 > WebP.decoder_version
=> "0.2.0"
2.0.0p0 :003 > WebP.encoder_version
=> "0.2.0"
Get size (width and height) from webp image:
filename = File.expand_path(File.join(File.dirname(__FILE__), "spec/factories/4.webp"))
WebP.webp_size(File.open(filename, "rb").read)
=> [2000, 2353]
Encode png, jpg or tiff image to webp:
filename = File.expand_path(File.join(File.dirname(__FILE__), "spec/factories/4.png"))
out_filename = File.expand_path(File.join(File.dirname(__FILE__), "tmp/4.webp"))
WebP.encode(filename, out_filename)
Encode png, jpg or tiff image to webp with options:
WebP.encode(filename, out_filename, quality: 50, resize_w: 100, resize_h: 200)
WebP.encode(filename, out_filename, quality: 75, crop_x: 0, cropt_y: 0, crop_w: 100, crop_h: 100)
Possible encode options:
- lossless (int) - Lossless encoding (0=lossy(default), 1=lossless)
- quality (float) - between 0 (smallest file) and 100 (biggest)
- method (int) - quality/speed trade-off (0=fast, 6=slower-better)
- target_size (int) - if non-zero, set the desired target size in bytes. Takes precedence over the 'compression' parameter
- target_PSNR (float) - if non-zero, specifies the minimal distortion to try to achieve. Takes precedence over target_size
- segments (int) - maximum number of segments to use, in [1..4]
- sns_strength (int) - Spatial Noise Shaping. 0=off, 100=maximum
- filter_strength (int) - range: [0 = off .. 100 = strongest]
- filter_sharpness (int) - range: [0 = off .. 7 = least sharp]
- filter_type (int) - filtering type: 0 = simple, 1 = strong (only used if filter_strength > 0 or autofilter > 0)
- autofilter (int) - Auto adjust filter's strength [0 = off, 1 = on]
- alpha_compression (int) - Algorithm for encoding the alpha plane (0 = none, 1 = compressed with WebP lossless). Default is 1
- alpha_filtering (int) - Predictive filtering method for alpha plane. 0: none, 1: fast, 2: best. Default if 1
- alpha_quality (int) - Between 0 (smallest size) and 100 (lossless). Default is 100
- pass (int) - number of entropy-analysis passes (in [1..10])
- show_compressed (int) - if true, export the compressed picture back. In-loop filtering is not applied
- preprocessing (int) - preprocessing filter (0=none, 1=segment-smooth)
- partitions (int) - log2(number of token partitions) in [0..3]. Default is set to 0 for easier progressive decoding
- partition_limit (int) - quality degradation allowed to fit the 512k limit on prediction modes coding (0: no degradation, 100: maximum possible degradation)
- width (int), height (int) - Input size (width x height) for YUV
- crop_x (int), crop_y (int), crop_w (int), crop_h (int) - crop picture with the given rectangle
- resize_w (int), resize_h (int) - resize picture (after any cropping)
Decode webp image (default format is png):
filename = File.expand_path(File.join(File.dirname(__FILE__), "spec/factories/4.webp"))
out_filename = File.expand_path(File.join(File.dirname(__FILE__), "tmp/4.png"))
WebP.decode(filename, out_filename)
Decode webp image to pam, ppm or pgm format of image:
filename = File.expand_path(File.join(File.dirname(__FILE__), "spec/factories/4.webp"))
out_filename = File.expand_path(File.join(File.dirname(__FILE__), "tmp/4.png"))
WebP.decode(filename, out_filename, output_format: :pam)
WebP.decode(filename, out_filename, output_format: :ppm)
WebP.decode(filename, out_filename, output_format: :pgm)
Decode webp image with options:
WebP.encode(filename, out_filename, resize_w: 100, resize_h: 200)
WebP.encode(filename, out_filename, crop_x: 0, cropt_y: 0, crop_w: 100, crop_h: 100)
Possible decode options:
- bypass_filtering (bool) - disable in-loop filtering
- no_fancy_upsampling (bool) - don't use the fancy YUV420 upscaler
- use_threads (bool) - use multi-threading
- crop_x (int), crop_y (int), crop_w (int), crop_h (int) - crop picture with the given rectangle
- resize_w (int), resize_h (int) - resize picture (after any cropping)
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request