Webp-ffi

Ruby wrapper for libwebp

View the Project on GitHub le0pard/webp-ffi

Webp-ffi

Build Status Code Climate

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.

WebP Gallery

Installation

Requirements

First of all you should have install libraries: libpng, libjpeg and libtiff.

For Ubuntu, Debian:

sudo apt-get install libjpeg-dev libpng-dev libtiff-dev libwebp-dev

For Mac OS:

brew install libjpg libpng libtiff webp

or (for MacPorts):

sudo port install jpeg libpng tiff

Next, you should install libwebp (if you didn't install it by brew in Mac OS or by apt-get in Ubuntu or Debian). Webp library version should be >= 0.3.0. This gem is not support Windows systems.

Final part

Add this line to your application's Gemfile:

gem 'webp-ffi'

And then execute:

$ bundle

Or install it yourself as:

$ gem install webp-ffi

Usage

Encoder end Decoder versions

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.3.1"
2.0.0p0 :003 > WebP.encoder_version
 => "0.3.1"

WebP size (width and height)

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 WebP image

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:

Decode WebP image

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, pgm, bmp, tiff or yuv 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)
WebP.decode(filename, out_filename, output_format: :bmp)
WebP.decode(filename, out_filename, output_format: :tiff)
WebP.decode(filename, out_filename, output_format: :yuv)

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:

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request