ImageflowEx
Elixir bindings for Imageflow, a safe and blazing fast image workflow library.
Installation
Add the package to your mix.exs
:
def deps do
[
{:imageflow_ex, "~> 0.1.0"}
]
end
Usage
Querying an image
alias Imageflow.Job
# create a job
{:ok, job} = Job.create()
# add an input file, with id `0`
:ok = Job.add_input_file(job, 0, "input.jpg")
# you could also add input buffers directly from memory
:ok = Job.add_input_buffer(job, 1, <<0x89, 0x50, 0x4E, 0x47, 0x0D, ... >>)
# call `get_image_info` on buffer with id 0
{:ok, resp} = Job.message("v0.1/get_image_info", %{io_id: 0})
IO.inspect(resp)
%{
"code" => 200,
"data" => %{
"image_info" => %{
"frame_decodes_into" => "bgr_32",
"image_height" => 273,
"image_width" => 185,
"preferred_extension" => "jpg",
"preferred_mime_type" => "image/jpeg"
}
},
"message" => "OK",
"success" => true
}
Transforming an image
alias Imageflow.Job
{:ok, job} = Job.create()
:ok = Job.add_input_file(job, 0, "input.jpg")
# allocate an output buffer before manipulating the image
:ok = Job.add_output_buffer(job, 2)
# define a JSON task to transform your image (more details below)
task = %{ ... }
# run
{:ok, response} = Job.message(job, "v0.1/execute", task)
# save the output buffer to a file
:ok = Job.save_output_to_file(job, 1, "output.jpg")
Defining tasks
Imageflow accepts JSON task definitions. Since this package is only a binding to imageflow, the most reliable documentation on the JSON api available is from the here, in the crate docs
Here's a simple example, which defines a task that takes buffer 0
as input,
constrains the image to 50px of width, and saves the output to buffer 1
:
task = %{
framewise: %{
steps: [
# first step is to decode buffer 0
%{
decode: %{
io_id: 0
}
},
# then constrain with to 50px
%{
constrain: %{
mode: "within",
w: 50
}
},
# and encode current result to buffer 1
%{
encode: %{
io_id: 1,
preset: %{
pngquant: %{"quality" => 80}
}
}
}
]
}
}
More complex use cases
As you can probably guess from the API so far, imageflow isn't constrained to a single input/output per job. A common use case for web development would be to generate multiple sizes of an image for a responsive frontend. More details on details can be found in the imageflow repo
Contributing
Feel free to contribute. Either by opening an issue, a Pull Request, or contacting the team directly
If you found a bug, please open an issue. You can also open a PR for bugs or new features. PRs will be reviewed and subject to our style guide and linters.
About
This project was developed by Miguel Palhas, and is published under the ISC license.