akash-akya
Hi everyone,
I have been hacking on NIF bindings for vips for sometime to understand NIF, macros and C better. libvips is a demand-driven, horizontally threaded image processing library. Compared to similar libraries such as imagemagik, libvips runs quickly and uses little memory.
Binding for vips operations are generated using GObject introspection, so documentation and bindings are up-to-date with the vips version installed. It uses the dirty scheduler to avoid blocking main schedulers.
Check vix operations documentation for the list of available operations and spec.
Vix also contains a very simple implementation to interact with GObject, which might be useful for other GObject based bindings such as GStreamer. Maybe it should be moved to a separate library in the future.
Github
Example
alias Vix.Vips.Image
alias Vix.Vips.Operation
def example(path) do
{:ok, im} = Image.new_from_file(path)
# put im at position (100, 100) in a 3000 x 3000 pixel image,
# make the other pixels in the image by mirroring im up / down /
# left / right, see
# https://libvips.github.io/libvips/API/current/libvips-conversion.html#vips-embed
{:ok, im} = Operation.embed(im, 100, 100, 3000, 3000, extend: :VIPS_EXTEND_MIRROR)
# multiply the green (middle) band by 2, leave the other two alone
{:ok, im} = Operation.linear(im, [1, 2, 1], [0])
# make an image from an array constant, convolve with it
{:ok, mask} =
Image.new_matrix_from_array(3, 3,
[
[-1, -1, -1],
[-1, 16, -1],
[-1, -1, -1]
],
scale: 8
)
{:ok, im} = Operation.conv(im, mask, precision: :VIPS_PRECISION_INTEGER)
# finally, write the result back to a file on disk
:ok = Vix.Vips.Image.write_to_file(im, "out.jpg")
end
Simple unscientific comparison with mogrify (bindings for imagemagik)
For generating thumbnail
| Vix | Mogrify | |
|---|---|---|
| 1 | 298.731ms | 618.854ms |
| 2 | 29.873ms | 605.824ms |
| 3 | 34.479ms | 609.820ms |
| 4 | 31.339ms | 604.712ms |
| 5 | 32.526ms | 605.553ms |
Notice that the gain is significant for the subsequent calls to the operation since vips caches the operations.
Warning
This library is experimental, untested, and unstable. Interface might change significantly in the future versions. The code is not well tested or optimized, so you might experience crashes.
Please check project readme for more details.
Trending in Announcing
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #ai
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 6- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
vincer
Very useful library, looking forward to seeing it progress. I’m currently using the sharp library for this (GitHub - lovell/sharp: High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP, AVIF and TIFF images. Uses the libvips library. · GitHub) with Porcelain. I’ll try this out in a non-production setting.
akash-akya
Thanks, let me know if you face any issues.
Next important feature is supporting
VipsConnection, but it’s a little tricky and might take some time.akash-akya
Updating progress after a long time. With the new release, Vix is at
v0.10.0now. It has few significant additions, which I think worth sharing.v0.10.0
Vix.Vips.Image.new_from_enum/1andVix.Vips.Image.write_to_stream/2Vix.Vips.Image.new_from_binary/5andVix.Vips.Image.write_to_tensor/1See release changelog for more details.
Other changes include support for foreign operations, copying as formatted binary, updating image metadata etc. With this, almost all major libvips functionality can be accessed in Elixir (If you think something is missing, please let me know).
I like to thank @kip for his recent contributions to Vix and encouragement
Should I use Vix or Image?
Vix tries to be close to libvips interface to support a large set of use cases. Because of this, doing some basic image operation might feel unintuitive. Image by @kip is an excellent library, which builds on top of Vix and provides more elixir friendly wrapper functions for common operations along with many additional features such handling Exif, Math operators, and more. And all of this is accompanied by good documentation. So for most of the users, using
VixviaImagemight be better choice.akash-akya
Hi all, sharing update since there are major changes since the last update.
Vix now supports prebuilt NIF and libvips binaries. This should solve all the hiccups users used to face when using Vix. Issues such as installing correct libvips version, compiler tooling, libvips dependencies, compiler flags etc. With release
v0.16.0you don’t have to install anything, just add{vix, "0.16.0"}and forget about it. This should also make using Vix in Livebook or script more straight forward. Pre-built binaries are managed using cc_precompiler. This is a breaking change if you depend on an operation which is not present in the prebuilt binary, please check release docs for more details.Other major changes
Imagenow implementAccessbehavior in a manner similar Nx.Tensor. You can use it to access pixel data from in a more intuitive way.See document for more details. Thanks to @kip for this contribution.
Vix Image now implements
Kino.Renderprotocol, so we can use it livebook with image preview out of the box.Thanks to all contributors and open source libraries on which Vix is based on.
cc_precompilerby @cocoakip
Congratulations @akash-akya, a great update and definitely excited to use this especially with Livebook. Been working with
Vixfor over a year now and never had a segfault or a memory leak, just great performance, low memory usage and good fun.cjbottaro
I use Vix via @kip’s Image library. So far so good!