# `Vix.Vips.Operation`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L1)

Provides access to VIPS operations for image processing.

This module exposes VIPS operations as Elixir functions, allowing you to perform
various image processing tasks like resizing, color manipulation, filtering,
and format conversion.

## Quick Start

Here's a simple example to resize an image:

    # Load and resize an image to 500px width, maintaining aspect ratio
    {:ok, image} = Operation.thumbnail("input.jpg", 500)

## Working with Operations

Operations in Vix can be grouped into several categories:

* **Loading/Saving** - `Vix.Vips.Image`, `thumbnail/2`, and format specific functions.
* **Resizing** - `resize/2`, `thumbnail/2`, `smartcrop/3`
* **Color Management** - `colourspace/2`, `icc_transform/2`
* **Filters & Effects** - `gaussblur/2`, `sharpen/2`
* **Composition** - `composite/3`, `join/3`, `insert/4`

Most operations follow a consistent pattern:

1. Load your image
2. Apply one or more operations
3. Save the result

## Common Examples

    # Basic image resizing while preserving aspect ratio
    {:ok, image} = Vix.Vips.Image.new_from_file("input.jpg")
    # scale down by 50%
    {:ok, resized} = Operation.resize(image, scale: 0.5)
    :ok = Vix.Vips.Image.write_to_file(resized, "output.jpg")

    # Convert to grayscale and apply Gaussian blur
    {:ok, image} = Vix.Vips.Image.new_from_file("input.jpg")
    {:ok, gray} = Operation.colourspace(image, :VIPS_INTERPRETATION_B_W)
    {:ok, blurred} = Operation.gaussblur(gray, 3.0)

## Advanced Usage

### Smart Cropping for Thumbnails

    # Generate a smart-cropped thumbnail focusing on interesting areas
    {:ok, thumb} = Operation.thumbnail("input.jpg", 300,
      crop: :attention,  # Uses image analysis to find interesting areas
      height: 300,      # Force square thumbnail
    )

### Complex Image Composition

    # Create a watermarked image with transparency
    {:ok, base} = Vix.Vips.Image.new_from_file("photo.jpg")
    {:ok, watermark} = Vix.Vips.Image.new_from_file("watermark.png")
    {:ok, composed} = Operation.composite2(base, watermark,
      :VIPS_BLEND_MODE_OVER,  # Blend mode
      x: 20,         # Offset from left
      y: 20,         # Offset from top
      opacity: 0.8   # Watermark transparency
    )

### Color Management

    # Convert between color spaces with ICC profiles
    {:ok, image} = Vix.Vips.Image.new_from_file("input.jpg")
    {:ok, converted} = Operation.icc_transform(image,
      "sRGB.icc",     # Target color profile
      "input-profile": "Adobe-RGB.icc"
    )

> ## Performance Tips {: .tip}
>
> * Use `thumbnail/2` instead of `resize/2` when possible - it's optimized for common cases
> * Chain operations to avoid intermediate file I/O
> * For batch processing, reuse loaded ICC profiles and watermarks
> * Consider using sequential mode for large images

## Additional Resources

* [VIPS Documentation](https://www.libvips.org/API/current/)

<!-- TODO: Add section about memory management best practices -->
<!-- TODO: Add examples for animation handling -->
<!-- TODO: Document format-specific options for loading/saving -->
<!-- TODO: Add common recipes for web image optimization -->

# `vips_access`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_access() ::
  :VIPS_ACCESS_RANDOM
  | :VIPS_ACCESS_SEQUENTIAL
  | :VIPS_ACCESS_SEQUENTIAL_UNBUFFERED
```

# `vips_align`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_align() :: :VIPS_ALIGN_LOW | :VIPS_ALIGN_CENTRE | :VIPS_ALIGN_HIGH
```

# `vips_angle45`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_angle45() ::
  :VIPS_ANGLE45_D0
  | :VIPS_ANGLE45_D45
  | :VIPS_ANGLE45_D90
  | :VIPS_ANGLE45_D135
  | :VIPS_ANGLE45_D180
  | :VIPS_ANGLE45_D225
  | :VIPS_ANGLE45_D270
  | :VIPS_ANGLE45_D315
```

# `vips_angle`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_angle() ::
  :VIPS_ANGLE_D0 | :VIPS_ANGLE_D90 | :VIPS_ANGLE_D180 | :VIPS_ANGLE_D270
```

# `vips_band_format`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_band_format() ::
  :VIPS_FORMAT_NOTSET
  | :VIPS_FORMAT_UCHAR
  | :VIPS_FORMAT_CHAR
  | :VIPS_FORMAT_USHORT
  | :VIPS_FORMAT_SHORT
  | :VIPS_FORMAT_UINT
  | :VIPS_FORMAT_INT
  | :VIPS_FORMAT_FLOAT
  | :VIPS_FORMAT_COMPLEX
  | :VIPS_FORMAT_DOUBLE
  | :VIPS_FORMAT_DPCOMPLEX
```

# `vips_blend_mode`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_blend_mode() ::
  :VIPS_BLEND_MODE_CLEAR
  | :VIPS_BLEND_MODE_SOURCE
  | :VIPS_BLEND_MODE_OVER
  | :VIPS_BLEND_MODE_IN
  | :VIPS_BLEND_MODE_OUT
  | :VIPS_BLEND_MODE_ATOP
  | :VIPS_BLEND_MODE_DEST
  | :VIPS_BLEND_MODE_DEST_OVER
  | :VIPS_BLEND_MODE_DEST_IN
  | :VIPS_BLEND_MODE_DEST_OUT
  | :VIPS_BLEND_MODE_DEST_ATOP
  | :VIPS_BLEND_MODE_XOR
  | :VIPS_BLEND_MODE_ADD
  | :VIPS_BLEND_MODE_SATURATE
  | :VIPS_BLEND_MODE_MULTIPLY
  | :VIPS_BLEND_MODE_SCREEN
  | :VIPS_BLEND_MODE_OVERLAY
  | :VIPS_BLEND_MODE_DARKEN
  | :VIPS_BLEND_MODE_LIGHTEN
  | :VIPS_BLEND_MODE_COLOUR_DODGE
  | :VIPS_BLEND_MODE_COLOUR_BURN
  | :VIPS_BLEND_MODE_HARD_LIGHT
  | :VIPS_BLEND_MODE_SOFT_LIGHT
  | :VIPS_BLEND_MODE_DIFFERENCE
  | :VIPS_BLEND_MODE_EXCLUSION
```

# `vips_coding`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_coding() ::
  :VIPS_CODING_ERROR | :VIPS_CODING_NONE | :VIPS_CODING_LABQ | :VIPS_CODING_RAD
```

# `vips_combine`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_combine() :: :VIPS_COMBINE_MAX | :VIPS_COMBINE_SUM | :VIPS_COMBINE_MIN
```

# `vips_combine_mode`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_combine_mode() :: :VIPS_COMBINE_MODE_SET | :VIPS_COMBINE_MODE_ADD
```

# `vips_compass_direction`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_compass_direction() ::
  :VIPS_COMPASS_DIRECTION_CENTRE
  | :VIPS_COMPASS_DIRECTION_NORTH
  | :VIPS_COMPASS_DIRECTION_EAST
  | :VIPS_COMPASS_DIRECTION_SOUTH
  | :VIPS_COMPASS_DIRECTION_WEST
  | :VIPS_COMPASS_DIRECTION_NORTH_EAST
  | :VIPS_COMPASS_DIRECTION_SOUTH_EAST
  | :VIPS_COMPASS_DIRECTION_SOUTH_WEST
  | :VIPS_COMPASS_DIRECTION_NORTH_WEST
```

# `vips_demand_style`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_demand_style() ::
  :VIPS_DEMAND_STYLE_ERROR
  | :VIPS_DEMAND_STYLE_SMALLTILE
  | :VIPS_DEMAND_STYLE_FATSTRIP
  | :VIPS_DEMAND_STYLE_THINSTRIP
  | :VIPS_DEMAND_STYLE_ANY
```

# `vips_direction`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_direction() :: :VIPS_DIRECTION_HORIZONTAL | :VIPS_DIRECTION_VERTICAL
```

# `vips_extend`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_extend() ::
  :VIPS_EXTEND_BLACK
  | :VIPS_EXTEND_COPY
  | :VIPS_EXTEND_REPEAT
  | :VIPS_EXTEND_MIRROR
  | :VIPS_EXTEND_WHITE
  | :VIPS_EXTEND_BACKGROUND
```

# `vips_fail_on`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_fail_on() ::
  :VIPS_FAIL_ON_NONE
  | :VIPS_FAIL_ON_TRUNCATED
  | :VIPS_FAIL_ON_ERROR
  | :VIPS_FAIL_ON_WARNING
```

# `vips_foreign_dz_container`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_dz_container() ::
  :VIPS_FOREIGN_DZ_CONTAINER_FS
  | :VIPS_FOREIGN_DZ_CONTAINER_ZIP
  | :VIPS_FOREIGN_DZ_CONTAINER_SZI
```

# `vips_foreign_dz_depth`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_dz_depth() ::
  :VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL
  | :VIPS_FOREIGN_DZ_DEPTH_ONETILE
  | :VIPS_FOREIGN_DZ_DEPTH_ONE
```

# `vips_foreign_dz_layout`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_dz_layout() ::
  :VIPS_FOREIGN_DZ_LAYOUT_DZ
  | :VIPS_FOREIGN_DZ_LAYOUT_ZOOMIFY
  | :VIPS_FOREIGN_DZ_LAYOUT_GOOGLE
  | :VIPS_FOREIGN_DZ_LAYOUT_IIIF
  | :VIPS_FOREIGN_DZ_LAYOUT_IIIF3
```

# `vips_foreign_flags`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_flags() :: [
  :VIPS_FOREIGN_NONE
  | :VIPS_FOREIGN_PARTIAL
  | :VIPS_FOREIGN_BIGENDIAN
  | :VIPS_FOREIGN_SEQUENTIAL
  | :VIPS_FOREIGN_ALL
]
```

# `vips_foreign_heif_compression`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_heif_compression() ::
  :VIPS_FOREIGN_HEIF_COMPRESSION_HEVC
  | :VIPS_FOREIGN_HEIF_COMPRESSION_AVC
  | :VIPS_FOREIGN_HEIF_COMPRESSION_JPEG
  | :VIPS_FOREIGN_HEIF_COMPRESSION_AV1
```

# `vips_foreign_heif_encoder`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_heif_encoder() ::
  :VIPS_FOREIGN_HEIF_ENCODER_AUTO
  | :VIPS_FOREIGN_HEIF_ENCODER_AOM
  | :VIPS_FOREIGN_HEIF_ENCODER_RAV1E
  | :VIPS_FOREIGN_HEIF_ENCODER_SVT
  | :VIPS_FOREIGN_HEIF_ENCODER_X265
```

# `vips_foreign_keep`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_keep() :: [
  :VIPS_FOREIGN_KEEP_NONE
  | :VIPS_FOREIGN_KEEP_EXIF
  | :VIPS_FOREIGN_KEEP_XMP
  | :VIPS_FOREIGN_KEEP_IPTC
  | :VIPS_FOREIGN_KEEP_ICC
  | :VIPS_FOREIGN_KEEP_OTHER
  | :VIPS_FOREIGN_KEEP_ALL
]
```

# `vips_foreign_png_filter`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_png_filter() :: [
  :VIPS_FOREIGN_PNG_FILTER_NONE
  | :VIPS_FOREIGN_PNG_FILTER_SUB
  | :VIPS_FOREIGN_PNG_FILTER_UP
  | :VIPS_FOREIGN_PNG_FILTER_AVG
  | :VIPS_FOREIGN_PNG_FILTER_PAETH
  | :VIPS_FOREIGN_PNG_FILTER_ALL
]
```

# `vips_foreign_subsample`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_subsample() ::
  :VIPS_FOREIGN_SUBSAMPLE_AUTO
  | :VIPS_FOREIGN_SUBSAMPLE_ON
  | :VIPS_FOREIGN_SUBSAMPLE_OFF
```

# `vips_foreign_tiff_compression`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_tiff_compression() ::
  :VIPS_FOREIGN_TIFF_COMPRESSION_NONE
  | :VIPS_FOREIGN_TIFF_COMPRESSION_JPEG
  | :VIPS_FOREIGN_TIFF_COMPRESSION_DEFLATE
  | :VIPS_FOREIGN_TIFF_COMPRESSION_PACKBITS
  | :VIPS_FOREIGN_TIFF_COMPRESSION_CCITTFAX4
  | :VIPS_FOREIGN_TIFF_COMPRESSION_LZW
  | :VIPS_FOREIGN_TIFF_COMPRESSION_WEBP
  | :VIPS_FOREIGN_TIFF_COMPRESSION_ZSTD
  | :VIPS_FOREIGN_TIFF_COMPRESSION_JP2K
```

# `vips_foreign_tiff_predictor`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_tiff_predictor() ::
  :VIPS_FOREIGN_TIFF_PREDICTOR_NONE
  | :VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL
  | :VIPS_FOREIGN_TIFF_PREDICTOR_FLOAT
```

# `vips_foreign_tiff_resunit`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_tiff_resunit() ::
  :VIPS_FOREIGN_TIFF_RESUNIT_CM | :VIPS_FOREIGN_TIFF_RESUNIT_INCH
```

# `vips_foreign_webp_preset`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_foreign_webp_preset() ::
  :VIPS_FOREIGN_WEBP_PRESET_DEFAULT
  | :VIPS_FOREIGN_WEBP_PRESET_PICTURE
  | :VIPS_FOREIGN_WEBP_PRESET_PHOTO
  | :VIPS_FOREIGN_WEBP_PRESET_DRAWING
  | :VIPS_FOREIGN_WEBP_PRESET_ICON
  | :VIPS_FOREIGN_WEBP_PRESET_TEXT
```

# `vips_intent`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_intent() ::
  :VIPS_INTENT_PERCEPTUAL
  | :VIPS_INTENT_RELATIVE
  | :VIPS_INTENT_SATURATION
  | :VIPS_INTENT_ABSOLUTE
  | :VIPS_INTENT_AUTO
```

# `vips_interesting`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_interesting() ::
  :VIPS_INTERESTING_NONE
  | :VIPS_INTERESTING_CENTRE
  | :VIPS_INTERESTING_ENTROPY
  | :VIPS_INTERESTING_ATTENTION
  | :VIPS_INTERESTING_LOW
  | :VIPS_INTERESTING_HIGH
  | :VIPS_INTERESTING_ALL
```

# `vips_interpretation`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_interpretation() ::
  :VIPS_INTERPRETATION_ERROR
  | :VIPS_INTERPRETATION_MULTIBAND
  | :VIPS_INTERPRETATION_B_W
  | :VIPS_INTERPRETATION_HISTOGRAM
  | :VIPS_INTERPRETATION_XYZ
  | :VIPS_INTERPRETATION_LAB
  | :VIPS_INTERPRETATION_CMYK
  | :VIPS_INTERPRETATION_LABQ
  | :VIPS_INTERPRETATION_RGB
  | :VIPS_INTERPRETATION_CMC
  | :VIPS_INTERPRETATION_LCH
  | :VIPS_INTERPRETATION_LABS
  | :VIPS_INTERPRETATION_sRGB
  | :VIPS_INTERPRETATION_YXY
  | :VIPS_INTERPRETATION_FOURIER
  | :VIPS_INTERPRETATION_RGB16
  | :VIPS_INTERPRETATION_GREY16
  | :VIPS_INTERPRETATION_MATRIX
  | :VIPS_INTERPRETATION_scRGB
  | :VIPS_INTERPRETATION_HSV
```

# `vips_kernel`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_kernel() ::
  :VIPS_KERNEL_NEAREST
  | :VIPS_KERNEL_LINEAR
  | :VIPS_KERNEL_CUBIC
  | :VIPS_KERNEL_MITCHELL
  | :VIPS_KERNEL_LANCZOS2
  | :VIPS_KERNEL_LANCZOS3
  | :VIPS_KERNEL_MKS2013
  | :VIPS_KERNEL_MKS2021
```

# `vips_operation_boolean`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_operation_boolean() ::
  :VIPS_OPERATION_BOOLEAN_AND
  | :VIPS_OPERATION_BOOLEAN_OR
  | :VIPS_OPERATION_BOOLEAN_EOR
  | :VIPS_OPERATION_BOOLEAN_LSHIFT
  | :VIPS_OPERATION_BOOLEAN_RSHIFT
```

# `vips_operation_complex2`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_operation_complex2() :: :VIPS_OPERATION_COMPLEX2_CROSS_PHASE
```

# `vips_operation_complex`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_operation_complex() ::
  :VIPS_OPERATION_COMPLEX_POLAR
  | :VIPS_OPERATION_COMPLEX_RECT
  | :VIPS_OPERATION_COMPLEX_CONJ
```

# `vips_operation_complexget`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_operation_complexget() ::
  :VIPS_OPERATION_COMPLEXGET_REAL | :VIPS_OPERATION_COMPLEXGET_IMAG
```

# `vips_operation_math2`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_operation_math2() ::
  :VIPS_OPERATION_MATH2_POW
  | :VIPS_OPERATION_MATH2_WOP
  | :VIPS_OPERATION_MATH2_ATAN2
```

# `vips_operation_math`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_operation_math() ::
  :VIPS_OPERATION_MATH_SIN
  | :VIPS_OPERATION_MATH_COS
  | :VIPS_OPERATION_MATH_TAN
  | :VIPS_OPERATION_MATH_ASIN
  | :VIPS_OPERATION_MATH_ACOS
  | :VIPS_OPERATION_MATH_ATAN
  | :VIPS_OPERATION_MATH_LOG
  | :VIPS_OPERATION_MATH_LOG10
  | :VIPS_OPERATION_MATH_EXP
  | :VIPS_OPERATION_MATH_EXP10
  | :VIPS_OPERATION_MATH_SINH
  | :VIPS_OPERATION_MATH_COSH
  | :VIPS_OPERATION_MATH_TANH
  | :VIPS_OPERATION_MATH_ASINH
  | :VIPS_OPERATION_MATH_ACOSH
  | :VIPS_OPERATION_MATH_ATANH
```

# `vips_operation_morphology`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_operation_morphology() ::
  :VIPS_OPERATION_MORPHOLOGY_ERODE | :VIPS_OPERATION_MORPHOLOGY_DILATE
```

# `vips_operation_relational`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_operation_relational() ::
  :VIPS_OPERATION_RELATIONAL_EQUAL
  | :VIPS_OPERATION_RELATIONAL_NOTEQ
  | :VIPS_OPERATION_RELATIONAL_LESS
  | :VIPS_OPERATION_RELATIONAL_LESSEQ
  | :VIPS_OPERATION_RELATIONAL_MORE
  | :VIPS_OPERATION_RELATIONAL_MOREEQ
```

# `vips_operation_round`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_operation_round() ::
  :VIPS_OPERATION_ROUND_RINT
  | :VIPS_OPERATION_ROUND_CEIL
  | :VIPS_OPERATION_ROUND_FLOOR
```

# `vips_pcs`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_pcs() :: :VIPS_PCS_LAB | :VIPS_PCS_XYZ
```

# `vips_precision`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_precision() ::
  :VIPS_PRECISION_INTEGER | :VIPS_PRECISION_FLOAT | :VIPS_PRECISION_APPROXIMATE
```

# `vips_region_shrink`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_region_shrink() ::
  :VIPS_REGION_SHRINK_MEAN
  | :VIPS_REGION_SHRINK_MEDIAN
  | :VIPS_REGION_SHRINK_MODE
  | :VIPS_REGION_SHRINK_MAX
  | :VIPS_REGION_SHRINK_MIN
  | :VIPS_REGION_SHRINK_NEAREST
```

# `vips_sdf_shape`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_sdf_shape() ::
  :VIPS_SDF_SHAPE_CIRCLE
  | :VIPS_SDF_SHAPE_BOX
  | :VIPS_SDF_SHAPE_ROUNDED_BOX
  | :VIPS_SDF_SHAPE_LINE
```

# `vips_size`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_size() ::
  :VIPS_SIZE_BOTH | :VIPS_SIZE_UP | :VIPS_SIZE_DOWN | :VIPS_SIZE_FORCE
```

# `vips_text_wrap`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L0)

```elixir
@type vips_text_wrap() ::
  :VIPS_TEXT_WRAP_WORD
  | :VIPS_TEXT_WRAP_CHAR
  | :VIPS_TEXT_WRAP_WORD_CHAR
  | :VIPS_TEXT_WRAP_NONE
```

# `abs`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec abs(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Absolute value of an image

## Arguments
  * input - Input image

# `abs!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec abs!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Absolute value of an image

## Arguments
  * input - Input image

# `add`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec add(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Add two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `add!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec add!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Add two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `addalpha`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec addalpha(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Append an alpha channel

## Arguments
  * input - Input image

# `addalpha!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec addalpha!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Append an alpha channel

## Arguments
  * input - Input image

# `affine`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec affine(Vix.Vips.Image.t(), [float()],
  extend: vips_extend(),
  premultiplied: boolean(),
  background: [float()],
  idy: float(),
  idx: float(),
  ody: float(),
  odx: float(),
  oarea: [integer()],
  interpolate: Vix.Vips.Interpolate.t()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Affine transform of an image

## Arguments
  * input - Input image argument
  * matrix - Transformation matrix

## Optional
* extend - How to generate the extra pixels. Default: `:VIPS_EXTEND_BACKGROUND`
* premultiplied - Images have premultiplied alpha. Default: `false`
* background - Background value. Default: `nil`
* idy - Vertical input displacement. Default: `0.0`
* idx - Horizontal input displacement. Default: `0.0`
* ody - Vertical output displacement. Default: `0.0`
* odx - Horizontal output displacement. Default: `0.0`
* oarea - Area of output to generate. Default: `nil`
* interpolate - Interpolate pixels with this. 

# `affine!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec affine!(Vix.Vips.Image.t(), [float()],
  extend: vips_extend(),
  premultiplied: boolean(),
  background: [float()],
  idy: float(),
  idx: float(),
  ody: float(),
  odx: float(),
  oarea: [integer()],
  interpolate: Vix.Vips.Interpolate.t()
) :: Vix.Vips.Image.t() | no_return()
```

Affine transform of an image

## Arguments
  * input - Input image argument
  * matrix - Transformation matrix

## Optional
* extend - How to generate the extra pixels. Default: `:VIPS_EXTEND_BACKGROUND`
* premultiplied - Images have premultiplied alpha. Default: `false`
* background - Background value. Default: `nil`
* idy - Vertical input displacement. Default: `0.0`
* idx - Horizontal input displacement. Default: `0.0`
* ody - Vertical output displacement. Default: `0.0`
* odx - Horizontal output displacement. Default: `0.0`
* oarea - Area of output to generate. Default: `nil`
* interpolate - Interpolate pixels with this. 

# `arrayjoin`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec arrayjoin([Vix.Vips.Image.t()],
  vspacing: integer(),
  hspacing: integer(),
  valign: vips_align(),
  halign: vips_align(),
  background: [float()],
  shim: integer(),
  across: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Join an array of images

## Arguments
  * input - Array of input images

## Optional
* vspacing - Vertical spacing between images. Default: `1`
* hspacing - Horizontal spacing between images. Default: `1`
* valign - Align on the top, centre or bottom. Default: `:VIPS_ALIGN_LOW`
* halign - Align on the left, centre or right. Default: `:VIPS_ALIGN_LOW`
* background - Colour for new pixels. Default: `nil`
* shim - Pixels between images. Default: `0`
* across - Number of images across grid. Default: `1`

# `arrayjoin!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec arrayjoin!([Vix.Vips.Image.t()],
  vspacing: integer(),
  hspacing: integer(),
  valign: vips_align(),
  halign: vips_align(),
  background: [float()],
  shim: integer(),
  across: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Join an array of images

## Arguments
  * input - Array of input images

## Optional
* vspacing - Vertical spacing between images. Default: `1`
* hspacing - Horizontal spacing between images. Default: `1`
* valign - Align on the top, centre or bottom. Default: `:VIPS_ALIGN_LOW`
* halign - Align on the left, centre or right. Default: `:VIPS_ALIGN_LOW`
* background - Colour for new pixels. Default: `nil`
* shim - Pixels between images. Default: `0`
* across - Number of images across grid. Default: `1`

# `autorot`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec autorot(Vix.Vips.Image.t()) ::
  {:ok, {Vix.Vips.Image.t(), %{flip: boolean(), angle: vips_angle()}}}
  | {:error, term()}
```

Autorotate image by exif tag

## Arguments
  * input - Input image

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flip - Whether the image was flipped or not. (`boolean()`)
* angle - Angle image was rotated by. (`vips_angle`)

# `autorot!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec autorot!(Vix.Vips.Image.t()) ::
  {Vix.Vips.Image.t(), %{flip: boolean(), angle: vips_angle()}} | no_return()
```

Autorotate image by exif tag

## Arguments
  * input - Input image

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flip - Whether the image was flipped or not. (`boolean()`)
* angle - Angle image was rotated by. (`vips_angle`)

# `avg`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec avg(Vix.Vips.Image.t()) :: {:ok, float()} | {:error, term()}
```

Find image average

## Arguments
  * input - Input image

# `avg!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec avg!(Vix.Vips.Image.t()) :: float() | no_return()
```

Find image average

## Arguments
  * input - Input image

# `bandbool`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec bandbool(Vix.Vips.Image.t(), vips_operation_boolean()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Boolean operation across image bands

## Arguments
  * input - Input image argument
  * boolean - Boolean to perform

# `bandbool!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec bandbool!(Vix.Vips.Image.t(), vips_operation_boolean()) ::
  Vix.Vips.Image.t() | no_return()
```

Boolean operation across image bands

## Arguments
  * input - Input image argument
  * boolean - Boolean to perform

# `bandfold`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec bandfold(Vix.Vips.Image.t(), [{:factor, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Fold up x axis into bands

## Arguments
  * input - Input image

## Optional
* factor - Fold by this factor. Default: `0`

# `bandfold!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec bandfold!(Vix.Vips.Image.t(), [{:factor, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Fold up x axis into bands

## Arguments
  * input - Input image

## Optional
* factor - Fold by this factor. Default: `0`

# `bandjoin`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec bandjoin([Vix.Vips.Image.t()]) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Bandwise join a set of images

## Arguments
  * input - Array of input images

# `bandjoin!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec bandjoin!([Vix.Vips.Image.t()]) :: Vix.Vips.Image.t() | no_return()
```

Bandwise join a set of images

## Arguments
  * input - Array of input images

# `bandjoin_const`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec bandjoin_const(Vix.Vips.Image.t(), [float()]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Append a constant band to an image

## Arguments
  * input - Input image
  * c - Array of constants to add

# `bandjoin_const!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec bandjoin_const!(Vix.Vips.Image.t(), [float()]) ::
  Vix.Vips.Image.t() | no_return()
```

Append a constant band to an image

## Arguments
  * input - Input image
  * c - Array of constants to add

# `bandmean`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec bandmean(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Band-wise average

## Arguments
  * input - Input image argument

# `bandmean!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec bandmean!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Band-wise average

## Arguments
  * input - Input image argument

# `bandrank`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec bandrank([Vix.Vips.Image.t()], [{:index, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Band-wise rank of a set of images

## Arguments
  * input - Array of input images

## Optional
* index - Select this band element from sorted list. Default: `-1`

# `bandrank!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec bandrank!([Vix.Vips.Image.t()], [{:index, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Band-wise rank of a set of images

## Arguments
  * input - Array of input images

## Optional
* index - Select this band element from sorted list. Default: `-1`

# `bandunfold`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec bandunfold(Vix.Vips.Image.t(), [{:factor, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Unfold image bands into x axis

## Arguments
  * input - Input image

## Optional
* factor - Unfold by this factor. Default: `0`

# `bandunfold!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec bandunfold!(Vix.Vips.Image.t(), [{:factor, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Unfold image bands into x axis

## Arguments
  * input - Input image

## Optional
* factor - Unfold by this factor. Default: `0`

# `black`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec black(integer(), integer(), [{:bands, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a black image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* bands - Number of bands in image. Default: `1`

# `black!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec black!(integer(), integer(), [{:bands, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Make a black image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* bands - Number of bands in image. Default: `1`

# `boolean`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec boolean(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_boolean()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Boolean operation on two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument
  * boolean - Boolean to perform

# `boolean!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec boolean!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_boolean()) ::
  Vix.Vips.Image.t() | no_return()
```

Boolean operation on two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument
  * boolean - Boolean to perform

# `boolean_const`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec boolean_const(Vix.Vips.Image.t(), vips_operation_boolean(), [float()]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Boolean operations against a constant

## Arguments
  * input - Input image
  * boolean - Boolean to perform
  * c - Array of constants

# `boolean_const!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec boolean_const!(Vix.Vips.Image.t(), vips_operation_boolean(), [float()]) ::
  Vix.Vips.Image.t() | no_return()
```

Boolean operations against a constant

## Arguments
  * input - Input image
  * boolean - Boolean to perform
  * c - Array of constants

# `buildlut`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec buildlut(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Build a look-up table

## Arguments
  * input - Matrix of XY coordinates

# `buildlut!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec buildlut!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Build a look-up table

## Arguments
  * input - Matrix of XY coordinates

# `byteswap`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec byteswap(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Byteswap an image

## Arguments
  * input - Input image

# `byteswap!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec byteswap!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Byteswap an image

## Arguments
  * input - Input image

# `canny`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec canny(Vix.Vips.Image.t(), precision: vips_precision(), sigma: float()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Canny edge detector

## Arguments
  * input - Input image

## Optional
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_FLOAT`
* sigma - Sigma of Gaussian. Default: `1.4`

# `canny!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec canny!(Vix.Vips.Image.t(), precision: vips_precision(), sigma: float()) ::
  Vix.Vips.Image.t() | no_return()
```

Canny edge detector

## Arguments
  * input - Input image

## Optional
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_FLOAT`
* sigma - Sigma of Gaussian. Default: `1.4`

# `case`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec case(Vix.Vips.Image.t(), [Vix.Vips.Image.t()]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Use pixel values to pick cases from an array of images

## Arguments
  * index - Index image
  * cases - Array of case images

# `case!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec case!(Vix.Vips.Image.t(), [Vix.Vips.Image.t()]) ::
  Vix.Vips.Image.t() | no_return()
```

Use pixel values to pick cases from an array of images

## Arguments
  * index - Index image
  * cases - Array of case images

# `cast`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec cast(Vix.Vips.Image.t(), vips_band_format(), [{:shift, boolean()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Cast an image

## Arguments
  * input - Input image
  * format - Format to cast to

## Optional
* shift - Shift integer values up and down. Default: `false`

# `cast!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec cast!(Vix.Vips.Image.t(), vips_band_format(), [{:shift, boolean()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Cast an image

## Arguments
  * input - Input image
  * format - Format to cast to

## Optional
* shift - Shift integer values up and down. Default: `false`

# `clamp`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec clamp(Vix.Vips.Image.t(), max: float(), min: float()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Clamp values of an image

## Arguments
  * input - Input image

## Optional
* max - Maximum value. Default: `1.0`
* min - Minimum value. Default: `0.0`

# `clamp!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec clamp!(Vix.Vips.Image.t(), max: float(), min: float()) ::
  Vix.Vips.Image.t() | no_return()
```

Clamp values of an image

## Arguments
  * input - Input image

## Optional
* max - Maximum value. Default: `1.0`
* min - Minimum value. Default: `0.0`

# `cmc2lch`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec cmc2lch(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform lch to cmc

## Arguments
  * input - Input image

# `cmc2lch!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec cmc2lch!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform lch to cmc

## Arguments
  * input - Input image

# `cmyk2xyz`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec cmyk2xyz(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform cmyk to xyz

## Arguments
  * input - Input image

# `cmyk2xyz!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec cmyk2xyz!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform cmyk to xyz

## Arguments
  * input - Input image

# `colourspace`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec colourspace(Vix.Vips.Image.t(), vips_interpretation(), [
  {:&quot;source-space&quot;, vips_interpretation()}
]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Convert to a new colorspace

## Arguments
  * input - Input image
  * space - Destination color space

## Optional
* source-space - Source color space. Default: `:VIPS_INTERPRETATION_sRGB`

# `colourspace!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec colourspace!(Vix.Vips.Image.t(), vips_interpretation(), [
  {:&quot;source-space&quot;, vips_interpretation()}
]) ::
  Vix.Vips.Image.t() | no_return()
```

Convert to a new colorspace

## Arguments
  * input - Input image
  * space - Destination color space

## Optional
* source-space - Source color space. Default: `:VIPS_INTERPRETATION_sRGB`

# `compass`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec compass(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  cluster: integer(),
  layers: integer(),
  precision: vips_precision(),
  combine: vips_combine(),
  angle: vips_angle45(),
  times: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Convolve with rotating mask

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* cluster - Cluster lines closer than this in approximation. Default: `1`
* layers - Use this many layers in approximation. Default: `5`
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_FLOAT`
* combine - Combine convolution results like this. Default: `:VIPS_COMBINE_MAX`
* angle - Rotate mask by this much between convolutions. Default: `:VIPS_ANGLE45_D90`
* times - Rotate and convolve this many times. Default: `2`

# `compass!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec compass!(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  cluster: integer(),
  layers: integer(),
  precision: vips_precision(),
  combine: vips_combine(),
  angle: vips_angle45(),
  times: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Convolve with rotating mask

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* cluster - Cluster lines closer than this in approximation. Default: `1`
* layers - Use this many layers in approximation. Default: `5`
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_FLOAT`
* combine - Combine convolution results like this. Default: `:VIPS_COMBINE_MAX`
* angle - Rotate mask by this much between convolutions. Default: `:VIPS_ANGLE45_D90`
* times - Rotate and convolve this many times. Default: `2`

# `complex2`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec complex2(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_complex2()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Complex binary operations on two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument
  * cmplx - Binary complex operation to perform

# `complex2!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec complex2!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_complex2()) ::
  Vix.Vips.Image.t() | no_return()
```

Complex binary operations on two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument
  * cmplx - Binary complex operation to perform

# `complex`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec complex(Vix.Vips.Image.t(), vips_operation_complex()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Perform a complex operation on an image

## Arguments
  * input - Input image
  * cmplx - Complex to perform

# `complex!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec complex!(Vix.Vips.Image.t(), vips_operation_complex()) ::
  Vix.Vips.Image.t() | no_return()
```

Perform a complex operation on an image

## Arguments
  * input - Input image
  * cmplx - Complex to perform

# `complexform`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec complexform(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Form a complex image from two real images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `complexform!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec complexform!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Form a complex image from two real images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `complexget`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec complexget(Vix.Vips.Image.t(), vips_operation_complexget()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Get a component from a complex image

## Arguments
  * input - Input image
  * get - Complex to perform

# `complexget!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec complexget!(Vix.Vips.Image.t(), vips_operation_complexget()) ::
  Vix.Vips.Image.t() | no_return()
```

Get a component from a complex image

## Arguments
  * input - Input image
  * get - Complex to perform

# `composite2`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec composite2(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_blend_mode(),
  premultiplied: boolean(),
  &quot;compositing-space&quot;: vips_interpretation(),
  y: integer(),
  x: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Blend a pair of images with a blend mode

## Arguments
  * base - Base image
  * overlay - Overlay image
  * mode - VipsBlendMode to join with

## Optional
* premultiplied - Images have premultiplied alpha. Default: `false`
* compositing-space - Composite images in this colour space. Default: `:VIPS_INTERPRETATION_sRGB`
* y - y position of overlay. Default: `0`
* x - x position of overlay. Default: `0`

# `composite2!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec composite2!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_blend_mode(),
  premultiplied: boolean(),
  &quot;compositing-space&quot;: vips_interpretation(),
  y: integer(),
  x: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Blend a pair of images with a blend mode

## Arguments
  * base - Base image
  * overlay - Overlay image
  * mode - VipsBlendMode to join with

## Optional
* premultiplied - Images have premultiplied alpha. Default: `false`
* compositing-space - Composite images in this colour space. Default: `:VIPS_INTERPRETATION_sRGB`
* y - y position of overlay. Default: `0`
* x - x position of overlay. Default: `0`

# `composite`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec composite([Vix.Vips.Image.t()], [vips_blend_mode()],
  premultiplied: boolean(),
  &quot;compositing-space&quot;: vips_interpretation(),
  y: [integer()],
  x: [integer()]
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Blend an array of images with an array of blend modes

## Arguments
  * input - Array of input images
  * mode - Array of VipsBlendMode to join with

## Optional
* premultiplied - Images have premultiplied alpha. Default: `false`
* compositing-space - Composite images in this colour space. Default: `:VIPS_INTERPRETATION_sRGB`
* y - Array of y coordinates to join at. Default: `nil`
* x - Array of x coordinates to join at. Default: `nil`

# `composite!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec composite!([Vix.Vips.Image.t()], [vips_blend_mode()],
  premultiplied: boolean(),
  &quot;compositing-space&quot;: vips_interpretation(),
  y: [integer()],
  x: [integer()]
) :: Vix.Vips.Image.t() | no_return()
```

Blend an array of images with an array of blend modes

## Arguments
  * input - Array of input images
  * mode - Array of VipsBlendMode to join with

## Optional
* premultiplied - Images have premultiplied alpha. Default: `false`
* compositing-space - Composite images in this colour space. Default: `:VIPS_INTERPRETATION_sRGB`
* y - Array of y coordinates to join at. Default: `nil`
* x - Array of x coordinates to join at. Default: `nil`

# `conv`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec conv(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  cluster: integer(),
  layers: integer(),
  precision: vips_precision()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Convolution operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* cluster - Cluster lines closer than this in approximation. Default: `1`
* layers - Use this many layers in approximation. Default: `5`
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_FLOAT`

# `conv!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec conv!(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  cluster: integer(),
  layers: integer(),
  precision: vips_precision()
) :: Vix.Vips.Image.t() | no_return()
```

Convolution operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* cluster - Cluster lines closer than this in approximation. Default: `1`
* layers - Use this many layers in approximation. Default: `5`
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_FLOAT`

# `conva`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec conva(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  cluster: integer(),
  layers: integer()
) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Approximate integer convolution

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* cluster - Cluster lines closer than this in approximation. Default: `1`
* layers - Use this many layers in approximation. Default: `5`

# `conva!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec conva!(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  cluster: integer(),
  layers: integer()
) ::
  Vix.Vips.Image.t() | no_return()
```

Approximate integer convolution

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* cluster - Cluster lines closer than this in approximation. Default: `1`
* layers - Use this many layers in approximation. Default: `5`

# `convasep`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec convasep(Vix.Vips.Image.t(), Vix.Vips.Image.t(), [{:layers, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Approximate separable integer convolution

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* layers - Use this many layers in approximation. Default: `5`

# `convasep!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec convasep!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), [{:layers, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Approximate separable integer convolution

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* layers - Use this many layers in approximation. Default: `5`

# `convf`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec convf(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Float convolution operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image

# `convf!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec convf!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Float convolution operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image

# `convi`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec convi(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Int convolution operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image

# `convi!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec convi!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Int convolution operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image

# `convsep`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec convsep(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  cluster: integer(),
  layers: integer(),
  precision: vips_precision()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Separable convolution operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* cluster - Cluster lines closer than this in approximation. Default: `1`
* layers - Use this many layers in approximation. Default: `5`
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_FLOAT`

# `convsep!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec convsep!(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  cluster: integer(),
  layers: integer(),
  precision: vips_precision()
) :: Vix.Vips.Image.t() | no_return()
```

Separable convolution operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image

## Optional
* cluster - Cluster lines closer than this in approximation. Default: `1`
* layers - Use this many layers in approximation. Default: `5`
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_FLOAT`

# `copy`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec copy(Vix.Vips.Image.t(),
  yoffset: integer(),
  xoffset: integer(),
  yres: float(),
  xres: float(),
  interpretation: vips_interpretation(),
  coding: vips_coding(),
  format: vips_band_format(),
  bands: integer(),
  height: integer(),
  width: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Copy an image

## Arguments
  * input - Input image

## Optional
* yoffset - Vertical offset of origin. Default: `0`
* xoffset - Horizontal offset of origin. Default: `0`
* yres - Vertical resolution in pixels/mm. Default: `0.0`
* xres - Horizontal resolution in pixels/mm. Default: `0.0`
* interpretation - Pixel interpretation. Default: `:VIPS_INTERPRETATION_MULTIBAND`
* coding - Pixel coding. Default: `:VIPS_CODING_NONE`
* format - Pixel format in image. Default: `:VIPS_FORMAT_UCHAR`
* bands - Number of bands in image. Default: `0`
* height - Image height in pixels. Default: `0`
* width - Image width in pixels. Default: `0`

# `copy!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec copy!(Vix.Vips.Image.t(),
  yoffset: integer(),
  xoffset: integer(),
  yres: float(),
  xres: float(),
  interpretation: vips_interpretation(),
  coding: vips_coding(),
  format: vips_band_format(),
  bands: integer(),
  height: integer(),
  width: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Copy an image

## Arguments
  * input - Input image

## Optional
* yoffset - Vertical offset of origin. Default: `0`
* xoffset - Horizontal offset of origin. Default: `0`
* yres - Vertical resolution in pixels/mm. Default: `0.0`
* xres - Horizontal resolution in pixels/mm. Default: `0.0`
* interpretation - Pixel interpretation. Default: `:VIPS_INTERPRETATION_MULTIBAND`
* coding - Pixel coding. Default: `:VIPS_CODING_NONE`
* format - Pixel format in image. Default: `:VIPS_FORMAT_UCHAR`
* bands - Number of bands in image. Default: `0`
* height - Image height in pixels. Default: `0`
* width - Image width in pixels. Default: `0`

# `countlines`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec countlines(Vix.Vips.Image.t(), vips_direction()) ::
  {:ok, float()} | {:error, term()}
```

Count lines in an image

## Arguments
  * input - Input image argument
  * direction - Countlines left-right or up-down

# `countlines!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec countlines!(Vix.Vips.Image.t(), vips_direction()) :: float() | no_return()
```

Count lines in an image

## Arguments
  * input - Input image argument
  * direction - Countlines left-right or up-down

# `csvload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec csvload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  separator: String.t(),
  whitespace: String.t(),
  lines: integer(),
  skip: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load csv

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* separator - Set of separator characters. Default: `";,\t"`
* whitespace - Set of whitespace characters. Default: `" "`
* lines - Read this many lines from the file. Default: `-1`
* skip - Skip this many lines at the start of the file. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `csvload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec csvload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  separator: String.t(),
  whitespace: String.t(),
  lines: integer(),
  skip: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load csv

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* separator - Set of separator characters. Default: `";,\t"`
* whitespace - Set of whitespace characters. Default: `" "`
* lines - Read this many lines from the file. Default: `-1`
* skip - Skip this many lines at the start of the file. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `csvsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec csvsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  separator: String.t()
) :: :ok | {:error, term()}
```

Save image to csv

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* separator - Separator characters. Default: `"\t"`

# `csvsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec csvsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  separator: String.t()
) :: :ok | no_return()
```

Save image to csv

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* separator - Separator characters. Default: `"\t"`

# `de00`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec de00(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Calculate de00

## Arguments
  * left - Left-hand input image
  * right - Right-hand input image

# `de00!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec de00!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Calculate de00

## Arguments
  * left - Left-hand input image
  * right - Right-hand input image

# `de76`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec de76(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Calculate de76

## Arguments
  * left - Left-hand input image
  * right - Right-hand input image

# `de76!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec de76!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Calculate de76

## Arguments
  * left - Left-hand input image
  * right - Right-hand input image

# `decmc`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec decmc(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Calculate decmc

## Arguments
  * left - Left-hand input image
  * right - Right-hand input image

# `decmc!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec decmc!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Calculate decmc

## Arguments
  * left - Left-hand input image
  * right - Right-hand input image

# `deviate`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec deviate(Vix.Vips.Image.t()) :: {:ok, float()} | {:error, term()}
```

Find image standard deviation

## Arguments
  * input - Input image

# `deviate!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec deviate!(Vix.Vips.Image.t()) :: float() | no_return()
```

Find image standard deviation

## Arguments
  * input - Input image

# `divide`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec divide(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Divide two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `divide!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec divide!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Divide two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `dzsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec dzsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  Q: integer(),
  id: String.t(),
  &quot;skip-blanks&quot;: integer(),
  &quot;region-shrink&quot;: vips_region_shrink(),
  compression: integer(),
  container: vips_foreign_dz_container(),
  angle: vips_angle(),
  depth: vips_foreign_dz_depth(),
  centre: boolean(),
  &quot;tile-size&quot;: integer(),
  overlap: integer(),
  suffix: String.t(),
  layout: vips_foreign_dz_layout(),
  imagename: String.t()
) :: :ok | {:error, term()}
```

Save image to deepzoom file

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* Q - Q factor. Default: `75`
* id - Resource ID. Default: `"https://example.com/iiif"`
* skip-blanks - Skip tiles which are nearly equal to the background. Default: `-1`
* region-shrink - Method to shrink regions. Default: `:VIPS_REGION_SHRINK_MEAN`
* compression - ZIP deflate compression level. Default: `0`
* container - Pyramid container type. Default: `:VIPS_FOREIGN_DZ_CONTAINER_FS`
* angle - Rotate image during save. Default: `:VIPS_ANGLE_D0`
* depth - Pyramid depth. Default: `:VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL`
* centre - Center image in tile. Default: `false`
* tile-size - Tile size in pixels. Default: `254`
* overlap - Tile overlap in pixels. Default: `1`
* suffix - Filename suffix for tiles. Default: `".jpeg"`
* layout - Directory layout. Default: `:VIPS_FOREIGN_DZ_LAYOUT_DZ`
* imagename - Image name. Default: `nil`

# `dzsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec dzsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  Q: integer(),
  id: String.t(),
  &quot;skip-blanks&quot;: integer(),
  &quot;region-shrink&quot;: vips_region_shrink(),
  compression: integer(),
  container: vips_foreign_dz_container(),
  angle: vips_angle(),
  depth: vips_foreign_dz_depth(),
  centre: boolean(),
  &quot;tile-size&quot;: integer(),
  overlap: integer(),
  suffix: String.t(),
  layout: vips_foreign_dz_layout(),
  imagename: String.t()
) :: :ok | no_return()
```

Save image to deepzoom file

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* Q - Q factor. Default: `75`
* id - Resource ID. Default: `"https://example.com/iiif"`
* skip-blanks - Skip tiles which are nearly equal to the background. Default: `-1`
* region-shrink - Method to shrink regions. Default: `:VIPS_REGION_SHRINK_MEAN`
* compression - ZIP deflate compression level. Default: `0`
* container - Pyramid container type. Default: `:VIPS_FOREIGN_DZ_CONTAINER_FS`
* angle - Rotate image during save. Default: `:VIPS_ANGLE_D0`
* depth - Pyramid depth. Default: `:VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL`
* centre - Center image in tile. Default: `false`
* tile-size - Tile size in pixels. Default: `254`
* overlap - Tile overlap in pixels. Default: `1`
* suffix - Filename suffix for tiles. Default: `".jpeg"`
* layout - Directory layout. Default: `:VIPS_FOREIGN_DZ_LAYOUT_DZ`
* imagename - Image name. Default: `nil`

# `dzsave_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec dzsave_buffer(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  Q: integer(),
  id: String.t(),
  &quot;skip-blanks&quot;: integer(),
  &quot;region-shrink&quot;: vips_region_shrink(),
  compression: integer(),
  container: vips_foreign_dz_container(),
  angle: vips_angle(),
  depth: vips_foreign_dz_depth(),
  centre: boolean(),
  &quot;tile-size&quot;: integer(),
  overlap: integer(),
  suffix: String.t(),
  layout: vips_foreign_dz_layout(),
  imagename: String.t()
) :: {:ok, binary()} | {:error, term()}
```

Save image to dz buffer

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* Q - Q factor. Default: `75`
* id - Resource ID. Default: `"https://example.com/iiif"`
* skip-blanks - Skip tiles which are nearly equal to the background. Default: `-1`
* region-shrink - Method to shrink regions. Default: `:VIPS_REGION_SHRINK_MEAN`
* compression - ZIP deflate compression level. Default: `0`
* container - Pyramid container type. Default: `:VIPS_FOREIGN_DZ_CONTAINER_FS`
* angle - Rotate image during save. Default: `:VIPS_ANGLE_D0`
* depth - Pyramid depth. Default: `:VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL`
* centre - Center image in tile. Default: `false`
* tile-size - Tile size in pixels. Default: `254`
* overlap - Tile overlap in pixels. Default: `1`
* suffix - Filename suffix for tiles. Default: `".jpeg"`
* layout - Directory layout. Default: `:VIPS_FOREIGN_DZ_LAYOUT_DZ`
* imagename - Image name. Default: `nil`

# `dzsave_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec dzsave_buffer!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  Q: integer(),
  id: String.t(),
  &quot;skip-blanks&quot;: integer(),
  &quot;region-shrink&quot;: vips_region_shrink(),
  compression: integer(),
  container: vips_foreign_dz_container(),
  angle: vips_angle(),
  depth: vips_foreign_dz_depth(),
  centre: boolean(),
  &quot;tile-size&quot;: integer(),
  overlap: integer(),
  suffix: String.t(),
  layout: vips_foreign_dz_layout(),
  imagename: String.t()
) :: binary() | no_return()
```

Save image to dz buffer

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* Q - Q factor. Default: `75`
* id - Resource ID. Default: `"https://example.com/iiif"`
* skip-blanks - Skip tiles which are nearly equal to the background. Default: `-1`
* region-shrink - Method to shrink regions. Default: `:VIPS_REGION_SHRINK_MEAN`
* compression - ZIP deflate compression level. Default: `0`
* container - Pyramid container type. Default: `:VIPS_FOREIGN_DZ_CONTAINER_FS`
* angle - Rotate image during save. Default: `:VIPS_ANGLE_D0`
* depth - Pyramid depth. Default: `:VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL`
* centre - Center image in tile. Default: `false`
* tile-size - Tile size in pixels. Default: `254`
* overlap - Tile overlap in pixels. Default: `1`
* suffix - Filename suffix for tiles. Default: `".jpeg"`
* layout - Directory layout. Default: `:VIPS_FOREIGN_DZ_LAYOUT_DZ`
* imagename - Image name. Default: `nil`

# `embed`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec embed(Vix.Vips.Image.t(), integer(), integer(), integer(), integer(),
  background: [float()],
  extend: vips_extend()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Embed an image in a larger image

## Arguments
  * input - Input image
  * x - Left edge of input in output
  * y - Top edge of input in output
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* background - Color for background pixels. Default: `nil`
* extend - How to generate the extra pixels. Default: `:VIPS_EXTEND_BLACK`

# `embed!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec embed!(Vix.Vips.Image.t(), integer(), integer(), integer(), integer(),
  background: [float()],
  extend: vips_extend()
) :: Vix.Vips.Image.t() | no_return()
```

Embed an image in a larger image

## Arguments
  * input - Input image
  * x - Left edge of input in output
  * y - Top edge of input in output
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* background - Color for background pixels. Default: `nil`
* extend - How to generate the extra pixels. Default: `:VIPS_EXTEND_BLACK`

# `extract_area`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec extract_area(Vix.Vips.Image.t(), integer(), integer(), integer(), integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Extract an area from an image

## Arguments
  * input - Input image
  * left - Left edge of extract area
  * top - Top edge of extract area
  * width - Width of extract area
  * height - Height of extract area

# `extract_area!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec extract_area!(Vix.Vips.Image.t(), integer(), integer(), integer(), integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Extract an area from an image

## Arguments
  * input - Input image
  * left - Left edge of extract area
  * top - Top edge of extract area
  * width - Width of extract area
  * height - Height of extract area

# `extract_band`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec extract_band(Vix.Vips.Image.t(), integer(), [{:n, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Extract band from an image

## Arguments
  * input - Input image
  * band - Band to extract

## Optional
* n - Number of bands to extract. Default: `1`

# `extract_band!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec extract_band!(Vix.Vips.Image.t(), integer(), [{:n, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Extract band from an image

## Arguments
  * input - Input image
  * band - Band to extract

## Optional
* n - Number of bands to extract. Default: `1`

# `eye`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec eye(integer(), integer(), factor: float(), uchar: boolean()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make an image showing the eye's spatial response

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* factor - Maximum spatial frequency. Default: `0.5`
* uchar - Output an unsigned char image. Default: `false`

# `eye!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec eye!(integer(), integer(), factor: float(), uchar: boolean()) ::
  Vix.Vips.Image.t() | no_return()
```

Make an image showing the eye's spatial response

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* factor - Maximum spatial frequency. Default: `0.5`
* uchar - Output an unsigned char image. Default: `false`

# `falsecolour`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec falsecolour(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

False-color an image

## Arguments
  * input - Input image

# `falsecolour!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec falsecolour!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

False-color an image

## Arguments
  * input - Input image

# `fastcor`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec fastcor(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Fast correlation

## Arguments
  * input - Input image argument
  * ref - Input reference image

# `fastcor!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec fastcor!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Fast correlation

## Arguments
  * input - Input image argument
  * ref - Input reference image

# `fill_nearest`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec fill_nearest(Vix.Vips.Image.t()) ::
  {:ok, {Vix.Vips.Image.t(), %{distance: Vix.Vips.Image.t()}}}
  | {:error, term()}
```

Fill image zeros with nearest non-zero pixel

## Arguments
  * input - Input image argument

## Returns
Operation returns a tuple

* out - Value of nearest non-zero pixel. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* distance - Distance to nearest non-zero pixel. (`Vix.Vips.Image.t()`)

# `fill_nearest!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec fill_nearest!(Vix.Vips.Image.t()) ::
  {Vix.Vips.Image.t(), %{distance: Vix.Vips.Image.t()}} | no_return()
```

Fill image zeros with nearest non-zero pixel

## Arguments
  * input - Input image argument

## Returns
Operation returns a tuple

* out - Value of nearest non-zero pixel. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* distance - Distance to nearest non-zero pixel. (`Vix.Vips.Image.t()`)

# `find_trim`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec find_trim(Vix.Vips.Image.t(),
  &quot;line-art&quot;: boolean(),
  background: [float()],
  threshold: float()
) ::
  {:ok, {integer(), integer(), integer(), integer()}} | {:error, term()}
```

Search an image for non-edge areas

## Arguments
  * input - Image to find_trim

## Optional
* line-art - Enable line art mode. Default: `false`
* background - Color for background pixels. Default: `nil`
* threshold - Object threshold. Default: `10.0`

## Returns
Operation returns a tuple

* left - Left edge of image. (`integer()`)
* top - Top edge of extract area. (`integer()`)
* width - Width of extract area. (`integer()`)
* height - Height of extract area. (`integer()`)

# `find_trim!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec find_trim!(Vix.Vips.Image.t(),
  &quot;line-art&quot;: boolean(),
  background: [float()],
  threshold: float()
) ::
  {integer(), integer(), integer(), integer()} | no_return()
```

Search an image for non-edge areas

## Arguments
  * input - Image to find_trim

## Optional
* line-art - Enable line art mode. Default: `false`
* background - Color for background pixels. Default: `nil`
* threshold - Object threshold. Default: `10.0`

## Returns
Operation returns a tuple

* left - Left edge of image. (`integer()`)
* top - Top edge of extract area. (`integer()`)
* width - Width of extract area. (`integer()`)
* height - Height of extract area. (`integer()`)

# `flatten`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec flatten(Vix.Vips.Image.t(), &quot;max-alpha&quot;: float(), background: [float()]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Flatten alpha out of an image

## Arguments
  * input - Input image

## Optional
* max-alpha - Maximum value of alpha channel. Default: `255.0`
* background - Background value. Default: `nil`

# `flatten!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec flatten!(Vix.Vips.Image.t(), &quot;max-alpha&quot;: float(), background: [float()]) ::
  Vix.Vips.Image.t() | no_return()
```

Flatten alpha out of an image

## Arguments
  * input - Input image

## Optional
* max-alpha - Maximum value of alpha channel. Default: `255.0`
* background - Background value. Default: `nil`

# `flip`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec flip(Vix.Vips.Image.t(), vips_direction()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Flip an image

## Arguments
  * input - Input image
  * direction - Direction to flip image

# `flip!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec flip!(Vix.Vips.Image.t(), vips_direction()) :: Vix.Vips.Image.t() | no_return()
```

Flip an image

## Arguments
  * input - Input image
  * direction - Direction to flip image

# `float2rad`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec float2rad(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform float rgb to radiance coding

## Arguments
  * input - Input image

# `float2rad!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec float2rad!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform float rgb to radiance coding

## Arguments
  * input - Input image

# `fractsurf`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec fractsurf(integer(), integer(), float()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a fractal surface

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * fractal-dimension - Fractal dimension

# `fractsurf!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec fractsurf!(integer(), integer(), float()) :: Vix.Vips.Image.t() | no_return()
```

Make a fractal surface

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * fractal-dimension - Fractal dimension

# `freqmult`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec freqmult(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Frequency-domain filtering

## Arguments
  * input - Input image
  * mask - Input mask image

# `freqmult!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec freqmult!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Frequency-domain filtering

## Arguments
  * input - Input image
  * mask - Input mask image

# `gamma`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec gamma(Vix.Vips.Image.t(), [{:exponent, float()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Gamma an image

## Arguments
  * input - Input image

## Optional
* exponent - Gamma factor. Default: `0.4166666666666667`

# `gamma!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec gamma!(Vix.Vips.Image.t(), [{:exponent, float()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Gamma an image

## Arguments
  * input - Input image

## Optional
* exponent - Gamma factor. Default: `0.4166666666666667`

# `gaussblur`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec gaussblur(Vix.Vips.Image.t(), float(),
  precision: vips_precision(),
  &quot;min-ampl&quot;: float()
) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Gaussian blur

## Arguments
  * input - Input image
  * sigma - Sigma of Gaussian

## Optional
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_INTEGER`
* min-ampl - Minimum amplitude of Gaussian. Default: `0.2`

# `gaussblur!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec gaussblur!(Vix.Vips.Image.t(), float(),
  precision: vips_precision(),
  &quot;min-ampl&quot;: float()
) ::
  Vix.Vips.Image.t() | no_return()
```

Gaussian blur

## Arguments
  * input - Input image
  * sigma - Sigma of Gaussian

## Optional
* precision - Convolve with this precision. Default: `:VIPS_PRECISION_INTEGER`
* min-ampl - Minimum amplitude of Gaussian. Default: `0.2`

# `gaussmat`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec gaussmat(float(), float(), precision: vips_precision(), separable: boolean()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a gaussian image

## Arguments
  * sigma - Sigma of Gaussian
  * min-ampl - Minimum amplitude of Gaussian

## Optional
* precision - Generate with this precision. Default: `:VIPS_PRECISION_INTEGER`
* separable - Generate separable Gaussian. Default: `false`

# `gaussmat!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec gaussmat!(float(), float(), precision: vips_precision(), separable: boolean()) ::
  Vix.Vips.Image.t() | no_return()
```

Make a gaussian image

## Arguments
  * sigma - Sigma of Gaussian
  * min-ampl - Minimum amplitude of Gaussian

## Optional
* precision - Generate with this precision. Default: `:VIPS_PRECISION_INTEGER`
* separable - Generate separable Gaussian. Default: `false`

# `gaussnoise`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec gaussnoise(integer(), integer(), seed: integer(), mean: float(), sigma: float()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a gaussnoise image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* seed - Random number seed. Default: `0`
* mean - Mean of pixels in generated image. Default: `128.0`
* sigma - Standard deviation of pixels in generated image. Default: `30.0`

# `gaussnoise!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec gaussnoise!(integer(), integer(),
  seed: integer(),
  mean: float(),
  sigma: float()
) ::
  Vix.Vips.Image.t() | no_return()
```

Make a gaussnoise image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* seed - Random number seed. Default: `0`
* mean - Mean of pixels in generated image. Default: `128.0`
* sigma - Standard deviation of pixels in generated image. Default: `30.0`

# `getpoint`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec getpoint(Vix.Vips.Image.t(), integer(), integer(), [
  {:&quot;unpack-complex&quot;, boolean()}
]) ::
  {:ok, [float()]} | {:error, term()}
```

Read a point from an image

## Arguments
  * input - Input image
  * x - Point to read
  * y - Point to read

## Optional
* unpack-complex - Complex pixels should be unpacked. Default: `false`

# `getpoint!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec getpoint!(Vix.Vips.Image.t(), integer(), integer(), [
  {:&quot;unpack-complex&quot;, boolean()}
]) ::
  [float()] | no_return()
```

Read a point from an image

## Arguments
  * input - Input image
  * x - Point to read
  * y - Point to read

## Optional
* unpack-complex - Complex pixels should be unpacked. Default: `false`

# `gifload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec gifload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  page: integer(),
  n: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load gif with libnsgif

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* page - First page to load. Default: `0`
* n - Number of pages to load, -1 for all. Default: `1`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `gifload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec gifload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  page: integer(),
  n: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load gif with libnsgif

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* page - First page to load. Default: `0`
* n - Number of pages to load, -1 for all. Default: `1`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `gifload_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec gifload_buffer(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  page: integer(),
  n: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load gif with libnsgif

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* page - First page to load. Default: `0`
* n - Number of pages to load, -1 for all. Default: `1`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `gifload_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec gifload_buffer!(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  page: integer(),
  n: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load gif with libnsgif

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* page - First page to load. Default: `0`
* n - Number of pages to load, -1 for all. Default: `1`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `gifsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec gifsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;keep-duplicate-frames&quot;: boolean(),
  interlace: boolean(),
  &quot;interpalette-maxerror&quot;: float(),
  reuse: boolean(),
  &quot;interframe-maxerror&quot;: float(),
  bitdepth: integer(),
  effort: integer(),
  dither: float()
) :: :ok | {:error, term()}
```

Save as gif

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* keep-duplicate-frames - Keep duplicate frames in the output instead of combining them. Default: `false`
* interlace - Generate an interlaced (progressive) GIF. Default: `false`
* interpalette-maxerror - Maximum inter-palette error for palette reusage. Default: `3.0`
* reuse - Reuse palette from input. Default: `false`
* interframe-maxerror - Maximum inter-frame error for transparency. Default: `0.0`
* bitdepth - Number of bits per pixel. Default: `8`
* effort - Quantisation effort. Default: `7`
* dither - Amount of dithering. Default: `1.0`

# `gifsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec gifsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;keep-duplicate-frames&quot;: boolean(),
  interlace: boolean(),
  &quot;interpalette-maxerror&quot;: float(),
  reuse: boolean(),
  &quot;interframe-maxerror&quot;: float(),
  bitdepth: integer(),
  effort: integer(),
  dither: float()
) :: :ok | no_return()
```

Save as gif

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* keep-duplicate-frames - Keep duplicate frames in the output instead of combining them. Default: `false`
* interlace - Generate an interlaced (progressive) GIF. Default: `false`
* interpalette-maxerror - Maximum inter-palette error for palette reusage. Default: `3.0`
* reuse - Reuse palette from input. Default: `false`
* interframe-maxerror - Maximum inter-frame error for transparency. Default: `0.0`
* bitdepth - Number of bits per pixel. Default: `8`
* effort - Quantisation effort. Default: `7`
* dither - Amount of dithering. Default: `1.0`

# `gifsave_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec gifsave_buffer(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;keep-duplicate-frames&quot;: boolean(),
  interlace: boolean(),
  &quot;interpalette-maxerror&quot;: float(),
  reuse: boolean(),
  &quot;interframe-maxerror&quot;: float(),
  bitdepth: integer(),
  effort: integer(),
  dither: float()
) :: {:ok, binary()} | {:error, term()}
```

Save as gif

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* keep-duplicate-frames - Keep duplicate frames in the output instead of combining them. Default: `false`
* interlace - Generate an interlaced (progressive) GIF. Default: `false`
* interpalette-maxerror - Maximum inter-palette error for palette reusage. Default: `3.0`
* reuse - Reuse palette from input. Default: `false`
* interframe-maxerror - Maximum inter-frame error for transparency. Default: `0.0`
* bitdepth - Number of bits per pixel. Default: `8`
* effort - Quantisation effort. Default: `7`
* dither - Amount of dithering. Default: `1.0`

# `gifsave_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec gifsave_buffer!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;keep-duplicate-frames&quot;: boolean(),
  interlace: boolean(),
  &quot;interpalette-maxerror&quot;: float(),
  reuse: boolean(),
  &quot;interframe-maxerror&quot;: float(),
  bitdepth: integer(),
  effort: integer(),
  dither: float()
) :: binary() | no_return()
```

Save as gif

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* keep-duplicate-frames - Keep duplicate frames in the output instead of combining them. Default: `false`
* interlace - Generate an interlaced (progressive) GIF. Default: `false`
* interpalette-maxerror - Maximum inter-palette error for palette reusage. Default: `3.0`
* reuse - Reuse palette from input. Default: `false`
* interframe-maxerror - Maximum inter-frame error for transparency. Default: `0.0`
* bitdepth - Number of bits per pixel. Default: `8`
* effort - Quantisation effort. Default: `7`
* dither - Amount of dithering. Default: `1.0`

# `globalbalance`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec globalbalance(Vix.Vips.Image.t(), &quot;int-output&quot;: boolean(), gamma: float()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Global balance an image mosaic

## Arguments
  * input - Input image

## Optional
* int-output - Integer output. Default: `false`
* gamma - Image gamma. Default: `1.6`

# `globalbalance!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec globalbalance!(Vix.Vips.Image.t(), &quot;int-output&quot;: boolean(), gamma: float()) ::
  Vix.Vips.Image.t() | no_return()
```

Global balance an image mosaic

## Arguments
  * input - Input image

## Optional
* int-output - Integer output. Default: `false`
* gamma - Image gamma. Default: `1.6`

# `gravity`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec gravity(Vix.Vips.Image.t(), vips_compass_direction(), integer(), integer(),
  background: [float()],
  extend: vips_extend()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Place an image within a larger image with a certain gravity

## Arguments
  * input - Input image
  * direction - Direction to place image within width/height
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* background - Color for background pixels. Default: `nil`
* extend - How to generate the extra pixels. Default: `:VIPS_EXTEND_BLACK`

# `gravity!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec gravity!(Vix.Vips.Image.t(), vips_compass_direction(), integer(), integer(),
  background: [float()],
  extend: vips_extend()
) :: Vix.Vips.Image.t() | no_return()
```

Place an image within a larger image with a certain gravity

## Arguments
  * input - Input image
  * direction - Direction to place image within width/height
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* background - Color for background pixels. Default: `nil`
* extend - How to generate the extra pixels. Default: `:VIPS_EXTEND_BLACK`

# `grey`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec grey(integer(), integer(), [{:uchar, boolean()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a grey ramp image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* uchar - Output an unsigned char image. Default: `false`

# `grey!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec grey!(integer(), integer(), [{:uchar, boolean()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Make a grey ramp image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* uchar - Output an unsigned char image. Default: `false`

# `grid`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec grid(Vix.Vips.Image.t(), integer(), integer(), integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Grid an image

## Arguments
  * input - Input image
  * tile-height - Chop into tiles this high
  * across - Number of tiles across
  * down - Number of tiles down

# `grid!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec grid!(Vix.Vips.Image.t(), integer(), integer(), integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Grid an image

## Arguments
  * input - Input image
  * tile-height - Chop into tiles this high
  * across - Number of tiles across
  * down - Number of tiles down

# `heifload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec heifload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  thumbnail: boolean(),
  n: integer(),
  page: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load a heif image

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* thumbnail - Fetch thumbnail image. Default: `false`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `heifload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec heifload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  thumbnail: boolean(),
  n: integer(),
  page: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load a heif image

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* thumbnail - Fetch thumbnail image. Default: `false`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `heifload_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec heifload_buffer(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  thumbnail: boolean(),
  n: integer(),
  page: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load a heif image

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* thumbnail - Fetch thumbnail image. Default: `false`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `heifload_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec heifload_buffer!(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  thumbnail: boolean(),
  n: integer(),
  page: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load a heif image

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* thumbnail - Fetch thumbnail image. Default: `false`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `heifsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec heifsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  encoder: vips_foreign_heif_encoder(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  effort: integer(),
  compression: vips_foreign_heif_compression(),
  lossless: boolean(),
  bitdepth: integer(),
  Q: integer()
) :: :ok | {:error, term()}
```

Save image in heif format

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* encoder - Select encoder to use. Default: `:VIPS_FOREIGN_HEIF_ENCODER_AUTO`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* effort - CPU effort. Default: `4`
* compression - Compression format. Default: `:VIPS_FOREIGN_HEIF_COMPRESSION_HEVC`
* lossless - Enable lossless compression. Default: `false`
* bitdepth - Number of bits per pixel. Default: `8`
* Q - Q factor. Default: `50`

# `heifsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec heifsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  encoder: vips_foreign_heif_encoder(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  effort: integer(),
  compression: vips_foreign_heif_compression(),
  lossless: boolean(),
  bitdepth: integer(),
  Q: integer()
) :: :ok | no_return()
```

Save image in heif format

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* encoder - Select encoder to use. Default: `:VIPS_FOREIGN_HEIF_ENCODER_AUTO`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* effort - CPU effort. Default: `4`
* compression - Compression format. Default: `:VIPS_FOREIGN_HEIF_COMPRESSION_HEVC`
* lossless - Enable lossless compression. Default: `false`
* bitdepth - Number of bits per pixel. Default: `8`
* Q - Q factor. Default: `50`

# `heifsave_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec heifsave_buffer(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  encoder: vips_foreign_heif_encoder(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  effort: integer(),
  compression: vips_foreign_heif_compression(),
  lossless: boolean(),
  bitdepth: integer(),
  Q: integer()
) :: {:ok, binary()} | {:error, term()}
```

Save image in heif format

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* encoder - Select encoder to use. Default: `:VIPS_FOREIGN_HEIF_ENCODER_AUTO`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* effort - CPU effort. Default: `4`
* compression - Compression format. Default: `:VIPS_FOREIGN_HEIF_COMPRESSION_HEVC`
* lossless - Enable lossless compression. Default: `false`
* bitdepth - Number of bits per pixel. Default: `8`
* Q - Q factor. Default: `50`

# `heifsave_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec heifsave_buffer!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  encoder: vips_foreign_heif_encoder(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  effort: integer(),
  compression: vips_foreign_heif_compression(),
  lossless: boolean(),
  bitdepth: integer(),
  Q: integer()
) :: binary() | no_return()
```

Save image in heif format

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* encoder - Select encoder to use. Default: `:VIPS_FOREIGN_HEIF_ENCODER_AUTO`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* effort - CPU effort. Default: `4`
* compression - Compression format. Default: `:VIPS_FOREIGN_HEIF_COMPRESSION_HEVC`
* lossless - Enable lossless compression. Default: `false`
* bitdepth - Number of bits per pixel. Default: `8`
* Q - Q factor. Default: `50`

# `hist_cum`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec hist_cum(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Form cumulative histogram

## Arguments
  * input - Input image

# `hist_cum!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec hist_cum!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Form cumulative histogram

## Arguments
  * input - Input image

# `hist_entropy`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec hist_entropy(Vix.Vips.Image.t()) :: {:ok, float()} | {:error, term()}
```

Estimate image entropy

## Arguments
  * input - Input histogram image

# `hist_entropy!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec hist_entropy!(Vix.Vips.Image.t()) :: float() | no_return()
```

Estimate image entropy

## Arguments
  * input - Input histogram image

# `hist_equal`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec hist_equal(Vix.Vips.Image.t(), [{:band, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Histogram equalisation

## Arguments
  * input - Input image

## Optional
* band - Equalise with this band. Default: `-1`

# `hist_equal!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec hist_equal!(Vix.Vips.Image.t(), [{:band, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Histogram equalisation

## Arguments
  * input - Input image

## Optional
* band - Equalise with this band. Default: `-1`

# `hist_find`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec hist_find(Vix.Vips.Image.t(), [{:band, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Find image histogram

## Arguments
  * input - Input image

## Optional
* band - Find histogram of band. Default: `-1`

# `hist_find!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec hist_find!(Vix.Vips.Image.t(), [{:band, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Find image histogram

## Arguments
  * input - Input image

## Optional
* band - Find histogram of band. Default: `-1`

# `hist_find_indexed`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec hist_find_indexed(Vix.Vips.Image.t(), Vix.Vips.Image.t(), [
  {:combine, vips_combine()}
]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Find indexed image histogram

## Arguments
  * input - Input image
  * index - Index image

## Optional
* combine - Combine bins like this. Default: `:VIPS_COMBINE_SUM`

# `hist_find_indexed!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec hist_find_indexed!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), [
  {:combine, vips_combine()}
]) ::
  Vix.Vips.Image.t() | no_return()
```

Find indexed image histogram

## Arguments
  * input - Input image
  * index - Index image

## Optional
* combine - Combine bins like this. Default: `:VIPS_COMBINE_SUM`

# `hist_find_ndim`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec hist_find_ndim(Vix.Vips.Image.t(), [{:bins, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Find n-dimensional image histogram

## Arguments
  * input - Input image

## Optional
* bins - Number of bins in each dimension. Default: `10`

# `hist_find_ndim!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec hist_find_ndim!(Vix.Vips.Image.t(), [{:bins, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Find n-dimensional image histogram

## Arguments
  * input - Input image

## Optional
* bins - Number of bins in each dimension. Default: `10`

# `hist_ismonotonic`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec hist_ismonotonic(Vix.Vips.Image.t()) :: {:ok, boolean()} | {:error, term()}
```

Test for monotonicity

## Arguments
  * input - Input histogram image

# `hist_ismonotonic!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec hist_ismonotonic!(Vix.Vips.Image.t()) :: boolean() | no_return()
```

Test for monotonicity

## Arguments
  * input - Input histogram image

# `hist_local`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec hist_local(Vix.Vips.Image.t(), integer(), integer(), [{:&quot;max-slope&quot;, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Local histogram equalisation

## Arguments
  * input - Input image
  * width - Window width in pixels
  * height - Window height in pixels

## Optional
* max-slope - Maximum slope (CLAHE). Default: `0`

# `hist_local!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec hist_local!(Vix.Vips.Image.t(), integer(), integer(), [
  {:&quot;max-slope&quot;, integer()}
]) ::
  Vix.Vips.Image.t() | no_return()
```

Local histogram equalisation

## Arguments
  * input - Input image
  * width - Window width in pixels
  * height - Window height in pixels

## Optional
* max-slope - Maximum slope (CLAHE). Default: `0`

# `hist_match`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec hist_match(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Match two histograms

## Arguments
  * input - Input histogram
  * ref - Reference histogram

# `hist_match!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec hist_match!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Match two histograms

## Arguments
  * input - Input histogram
  * ref - Reference histogram

# `hist_norm`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec hist_norm(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Normalise histogram

## Arguments
  * input - Input image

# `hist_norm!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec hist_norm!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Normalise histogram

## Arguments
  * input - Input image

# `hist_plot`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec hist_plot(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Plot histogram

## Arguments
  * input - Input image

# `hist_plot!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec hist_plot!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Plot histogram

## Arguments
  * input - Input image

# `hough_circle`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec hough_circle(Vix.Vips.Image.t(),
  &quot;max-radius&quot;: integer(),
  &quot;min-radius&quot;: integer(),
  scale: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Find hough circle transform

## Arguments
  * input - Input image

## Optional
* max-radius - Largest radius to search for. Default: `20`
* min-radius - Smallest radius to search for. Default: `10`
* scale - Scale down dimensions by this factor. Default: `1`

# `hough_circle!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec hough_circle!(Vix.Vips.Image.t(),
  &quot;max-radius&quot;: integer(),
  &quot;min-radius&quot;: integer(),
  scale: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Find hough circle transform

## Arguments
  * input - Input image

## Optional
* max-radius - Largest radius to search for. Default: `20`
* min-radius - Smallest radius to search for. Default: `10`
* scale - Scale down dimensions by this factor. Default: `1`

# `hough_line`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec hough_line(Vix.Vips.Image.t(), height: integer(), width: integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Find hough line transform

## Arguments
  * input - Input image

## Optional
* height - Vertical size of parameter space. Default: `256`
* width - Horizontal size of parameter space. Default: `256`

# `hough_line!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec hough_line!(Vix.Vips.Image.t(), height: integer(), width: integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Find hough line transform

## Arguments
  * input - Input image

## Optional
* height - Vertical size of parameter space. Default: `256`
* width - Horizontal size of parameter space. Default: `256`

# `hsv2srgb`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec hsv2srgb(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform hsv to srgb

## Arguments
  * input - Input image

# `hsv2srgb!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec hsv2srgb!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform hsv to srgb

## Arguments
  * input - Input image

# `icc_export`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec icc_export(Vix.Vips.Image.t(),
  depth: integer(),
  &quot;output-profile&quot;: String.t(),
  &quot;black-point-compensation&quot;: boolean(),
  intent: vips_intent(),
  pcs: vips_pcs()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Output to device with icc profile

## Arguments
  * input - Input image

## Optional
* depth - Output device space depth in bits. Default: `8`
* output-profile - Filename to load output profile from. Default: `nil`
* black-point-compensation - Enable black point compensation. Default: `false`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* pcs - Set Profile Connection Space. Default: `:VIPS_PCS_LAB`

# `icc_export!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec icc_export!(Vix.Vips.Image.t(),
  depth: integer(),
  &quot;output-profile&quot;: String.t(),
  &quot;black-point-compensation&quot;: boolean(),
  intent: vips_intent(),
  pcs: vips_pcs()
) :: Vix.Vips.Image.t() | no_return()
```

Output to device with icc profile

## Arguments
  * input - Input image

## Optional
* depth - Output device space depth in bits. Default: `8`
* output-profile - Filename to load output profile from. Default: `nil`
* black-point-compensation - Enable black point compensation. Default: `false`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* pcs - Set Profile Connection Space. Default: `:VIPS_PCS_LAB`

# `icc_import`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec icc_import(Vix.Vips.Image.t(),
  &quot;input-profile&quot;: String.t(),
  embedded: boolean(),
  &quot;black-point-compensation&quot;: boolean(),
  intent: vips_intent(),
  pcs: vips_pcs()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Import from device with icc profile

## Arguments
  * input - Input image

## Optional
* input-profile - Filename to load input profile from. Default: `nil`
* embedded - Use embedded input profile, if available. Default: `false`
* black-point-compensation - Enable black point compensation. Default: `false`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* pcs - Set Profile Connection Space. Default: `:VIPS_PCS_LAB`

# `icc_import!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec icc_import!(Vix.Vips.Image.t(),
  &quot;input-profile&quot;: String.t(),
  embedded: boolean(),
  &quot;black-point-compensation&quot;: boolean(),
  intent: vips_intent(),
  pcs: vips_pcs()
) :: Vix.Vips.Image.t() | no_return()
```

Import from device with icc profile

## Arguments
  * input - Input image

## Optional
* input-profile - Filename to load input profile from. Default: `nil`
* embedded - Use embedded input profile, if available. Default: `false`
* black-point-compensation - Enable black point compensation. Default: `false`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* pcs - Set Profile Connection Space. Default: `:VIPS_PCS_LAB`

# `icc_transform`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec icc_transform(Vix.Vips.Image.t(), String.t(),
  depth: integer(),
  &quot;input-profile&quot;: String.t(),
  embedded: boolean(),
  &quot;black-point-compensation&quot;: boolean(),
  intent: vips_intent(),
  pcs: vips_pcs()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform between devices with icc profiles

## Arguments
  * input - Input image
  * output-profile - Filename to load output profile from

## Optional
* depth - Output device space depth in bits. Default: `8`
* input-profile - Filename to load input profile from. Default: `nil`
* embedded - Use embedded input profile, if available. Default: `false`
* black-point-compensation - Enable black point compensation. Default: `false`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* pcs - Set Profile Connection Space. Default: `:VIPS_PCS_LAB`

# `icc_transform!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec icc_transform!(Vix.Vips.Image.t(), String.t(),
  depth: integer(),
  &quot;input-profile&quot;: String.t(),
  embedded: boolean(),
  &quot;black-point-compensation&quot;: boolean(),
  intent: vips_intent(),
  pcs: vips_pcs()
) :: Vix.Vips.Image.t() | no_return()
```

Transform between devices with icc profiles

## Arguments
  * input - Input image
  * output-profile - Filename to load output profile from

## Optional
* depth - Output device space depth in bits. Default: `8`
* input-profile - Filename to load input profile from. Default: `nil`
* embedded - Use embedded input profile, if available. Default: `false`
* black-point-compensation - Enable black point compensation. Default: `false`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* pcs - Set Profile Connection Space. Default: `:VIPS_PCS_LAB`

# `identity`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec identity(size: integer(), ushort: boolean(), bands: integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a 1d image where pixel values are indexes

## Arguments

## Optional
* size - Size of 16-bit LUT. Default: `65536`
* ushort - Create a 16-bit LUT. Default: `false`
* bands - Number of bands in LUT. Default: `1`

# `identity!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec identity!(size: integer(), ushort: boolean(), bands: integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Make a 1d image where pixel values are indexes

## Arguments

## Optional
* size - Size of 16-bit LUT. Default: `65536`
* ushort - Create a 16-bit LUT. Default: `false`
* bands - Number of bands in LUT. Default: `1`

# `ifthenelse`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec ifthenelse(Vix.Vips.Image.t(), Vix.Vips.Image.t(), Vix.Vips.Image.t(), [
  {:blend, boolean()}
]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Ifthenelse an image

## Arguments
  * cond - Condition input image
  * in1 - Source for TRUE pixels
  * in2 - Source for FALSE pixels

## Optional
* blend - Blend smoothly between then and else parts. Default: `false`

# `ifthenelse!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec ifthenelse!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), Vix.Vips.Image.t(), [
  {:blend, boolean()}
]) ::
  Vix.Vips.Image.t() | no_return()
```

Ifthenelse an image

## Arguments
  * cond - Condition input image
  * in1 - Source for TRUE pixels
  * in2 - Source for FALSE pixels

## Optional
* blend - Blend smoothly between then and else parts. Default: `false`

# `insert`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec insert(Vix.Vips.Image.t(), Vix.Vips.Image.t(), integer(), integer(),
  background: [float()],
  expand: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Insert image @sub into @main at @x, @y

## Arguments
  * main - Main input image
  * sub - Sub-image to insert into main image
  * x - Left edge of sub in main
  * y - Top edge of sub in main

## Optional
* background - Color for new pixels. Default: `nil`
* expand - Expand output to hold all of both inputs. Default: `false`

# `insert!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec insert!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), integer(), integer(),
  background: [float()],
  expand: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Insert image @sub into @main at @x, @y

## Arguments
  * main - Main input image
  * sub - Sub-image to insert into main image
  * x - Left edge of sub in main
  * y - Top edge of sub in main

## Optional
* background - Color for new pixels. Default: `nil`
* expand - Expand output to hold all of both inputs. Default: `false`

# `invert`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec invert(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Invert an image

## Arguments
  * input - Input image

# `invert!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec invert!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Invert an image

## Arguments
  * input - Input image

# `invertlut`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec invertlut(Vix.Vips.Image.t(), [{:size, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Build an inverted look-up table

## Arguments
  * input - Matrix of XY coordinates

## Optional
* size - LUT size to generate. Default: `256`

# `invertlut!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec invertlut!(Vix.Vips.Image.t(), [{:size, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Build an inverted look-up table

## Arguments
  * input - Matrix of XY coordinates

## Optional
* size - LUT size to generate. Default: `256`

# `join`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec join(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_direction(),
  align: vips_align(),
  background: [float()],
  shim: integer(),
  expand: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Join a pair of images

## Arguments
  * in1 - First input image
  * in2 - Second input image
  * direction - Join left-right or up-down

## Optional
* align - Align on the low, centre or high coordinate edge. Default: `:VIPS_ALIGN_LOW`
* background - Colour for new pixels. Default: `nil`
* shim - Pixels between images. Default: `0`
* expand - Expand output to hold all of both inputs. Default: `false`

# `join!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec join!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_direction(),
  align: vips_align(),
  background: [float()],
  shim: integer(),
  expand: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Join a pair of images

## Arguments
  * in1 - First input image
  * in2 - Second input image
  * direction - Join left-right or up-down

## Optional
* align - Align on the low, centre or high coordinate edge. Default: `:VIPS_ALIGN_LOW`
* background - Colour for new pixels. Default: `nil`
* shim - Pixels between images. Default: `0`
* expand - Expand output to hold all of both inputs. Default: `false`

# `jpegload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec jpegload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  autorotate: boolean(),
  shrink: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load jpeg from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* autorotate - Rotate image using exif orientation. Default: `false`
* shrink - Shrink factor on load. Default: `1`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `jpegload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec jpegload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  autorotate: boolean(),
  shrink: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load jpeg from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* autorotate - Rotate image using exif orientation. Default: `false`
* shrink - Shrink factor on load. Default: `1`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `jpegload_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec jpegload_buffer(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  autorotate: boolean(),
  shrink: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load jpeg from buffer

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* autorotate - Rotate image using exif orientation. Default: `false`
* shrink - Shrink factor on load. Default: `1`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `jpegload_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec jpegload_buffer!(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  autorotate: boolean(),
  shrink: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load jpeg from buffer

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* autorotate - Rotate image using exif orientation. Default: `false`
* shrink - Shrink factor on load. Default: `1`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `jpegsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec jpegsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;restart-interval&quot;: integer(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  &quot;quant-table&quot;: integer(),
  &quot;optimize-scans&quot;: boolean(),
  &quot;overshoot-deringing&quot;: boolean(),
  &quot;trellis-quant&quot;: boolean(),
  interlace: boolean(),
  &quot;optimize-coding&quot;: boolean(),
  Q: integer()
) :: :ok | {:error, term()}
```

Save image to jpeg file

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* restart-interval - Add restart markers every specified number of mcu. Default: `0`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* quant-table - Use predefined quantization table with given index. Default: `0`
* optimize-scans - Split spectrum of DCT coefficients into separate scans. Default: `false`
* overshoot-deringing - Apply overshooting to samples with extreme values. Default: `false`
* trellis-quant - Apply trellis quantisation to each 8x8 block. Default: `false`
* interlace - Generate an interlaced (progressive) jpeg. Default: `false`
* optimize-coding - Compute optimal Huffman coding tables. Default: `false`
* Q - Q factor. Default: `75`

# `jpegsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec jpegsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;restart-interval&quot;: integer(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  &quot;quant-table&quot;: integer(),
  &quot;optimize-scans&quot;: boolean(),
  &quot;overshoot-deringing&quot;: boolean(),
  &quot;trellis-quant&quot;: boolean(),
  interlace: boolean(),
  &quot;optimize-coding&quot;: boolean(),
  Q: integer()
) :: :ok | no_return()
```

Save image to jpeg file

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* restart-interval - Add restart markers every specified number of mcu. Default: `0`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* quant-table - Use predefined quantization table with given index. Default: `0`
* optimize-scans - Split spectrum of DCT coefficients into separate scans. Default: `false`
* overshoot-deringing - Apply overshooting to samples with extreme values. Default: `false`
* trellis-quant - Apply trellis quantisation to each 8x8 block. Default: `false`
* interlace - Generate an interlaced (progressive) jpeg. Default: `false`
* optimize-coding - Compute optimal Huffman coding tables. Default: `false`
* Q - Q factor. Default: `75`

# `jpegsave_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec jpegsave_buffer(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;restart-interval&quot;: integer(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  &quot;quant-table&quot;: integer(),
  &quot;optimize-scans&quot;: boolean(),
  &quot;overshoot-deringing&quot;: boolean(),
  &quot;trellis-quant&quot;: boolean(),
  interlace: boolean(),
  &quot;optimize-coding&quot;: boolean(),
  Q: integer()
) :: {:ok, binary()} | {:error, term()}
```

Save image to jpeg buffer

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* restart-interval - Add restart markers every specified number of mcu. Default: `0`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* quant-table - Use predefined quantization table with given index. Default: `0`
* optimize-scans - Split spectrum of DCT coefficients into separate scans. Default: `false`
* overshoot-deringing - Apply overshooting to samples with extreme values. Default: `false`
* trellis-quant - Apply trellis quantisation to each 8x8 block. Default: `false`
* interlace - Generate an interlaced (progressive) jpeg. Default: `false`
* optimize-coding - Compute optimal Huffman coding tables. Default: `false`
* Q - Q factor. Default: `75`

# `jpegsave_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec jpegsave_buffer!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;restart-interval&quot;: integer(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  &quot;quant-table&quot;: integer(),
  &quot;optimize-scans&quot;: boolean(),
  &quot;overshoot-deringing&quot;: boolean(),
  &quot;trellis-quant&quot;: boolean(),
  interlace: boolean(),
  &quot;optimize-coding&quot;: boolean(),
  Q: integer()
) :: binary() | no_return()
```

Save image to jpeg buffer

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* restart-interval - Add restart markers every specified number of mcu. Default: `0`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* quant-table - Use predefined quantization table with given index. Default: `0`
* optimize-scans - Split spectrum of DCT coefficients into separate scans. Default: `false`
* overshoot-deringing - Apply overshooting to samples with extreme values. Default: `false`
* trellis-quant - Apply trellis quantisation to each 8x8 block. Default: `false`
* interlace - Generate an interlaced (progressive) jpeg. Default: `false`
* optimize-coding - Compute optimal Huffman coding tables. Default: `false`
* Q - Q factor. Default: `75`

# `jpegsave_mime`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec jpegsave_mime(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;restart-interval&quot;: integer(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  &quot;quant-table&quot;: integer(),
  &quot;optimize-scans&quot;: boolean(),
  &quot;overshoot-deringing&quot;: boolean(),
  &quot;trellis-quant&quot;: boolean(),
  interlace: boolean(),
  &quot;optimize-coding&quot;: boolean(),
  Q: integer()
) :: :ok | {:error, term()}
```

Save image to jpeg mime

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* restart-interval - Add restart markers every specified number of mcu. Default: `0`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* quant-table - Use predefined quantization table with given index. Default: `0`
* optimize-scans - Split spectrum of DCT coefficients into separate scans. Default: `false`
* overshoot-deringing - Apply overshooting to samples with extreme values. Default: `false`
* trellis-quant - Apply trellis quantisation to each 8x8 block. Default: `false`
* interlace - Generate an interlaced (progressive) jpeg. Default: `false`
* optimize-coding - Compute optimal Huffman coding tables. Default: `false`
* Q - Q factor. Default: `75`

# `jpegsave_mime!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec jpegsave_mime!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  &quot;restart-interval&quot;: integer(),
  &quot;subsample-mode&quot;: vips_foreign_subsample(),
  &quot;quant-table&quot;: integer(),
  &quot;optimize-scans&quot;: boolean(),
  &quot;overshoot-deringing&quot;: boolean(),
  &quot;trellis-quant&quot;: boolean(),
  interlace: boolean(),
  &quot;optimize-coding&quot;: boolean(),
  Q: integer()
) :: :ok | no_return()
```

Save image to jpeg mime

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* restart-interval - Add restart markers every specified number of mcu. Default: `0`
* subsample-mode - Select chroma subsample operation mode. Default: `:VIPS_FOREIGN_SUBSAMPLE_AUTO`
* quant-table - Use predefined quantization table with given index. Default: `0`
* optimize-scans - Split spectrum of DCT coefficients into separate scans. Default: `false`
* overshoot-deringing - Apply overshooting to samples with extreme values. Default: `false`
* trellis-quant - Apply trellis quantisation to each 8x8 block. Default: `false`
* interlace - Generate an interlaced (progressive) jpeg. Default: `false`
* optimize-coding - Compute optimal Huffman coding tables. Default: `false`
* Q - Q factor. Default: `75`

# `lab2labq`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec lab2labq(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform float lab to labq coding

## Arguments
  * input - Input image

# `lab2labq!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec lab2labq!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform float lab to labq coding

## Arguments
  * input - Input image

# `lab2labs`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec lab2labs(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform float lab to signed short

## Arguments
  * input - Input image

# `lab2labs!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec lab2labs!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform float lab to signed short

## Arguments
  * input - Input image

# `lab2lch`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec lab2lch(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform lab to lch

## Arguments
  * input - Input image

# `lab2lch!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec lab2lch!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform lab to lch

## Arguments
  * input - Input image

# `lab2xyz`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec lab2xyz(Vix.Vips.Image.t(), [{:temp, [float()]}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform cielab to xyz

## Arguments
  * input - Input image

## Optional
* temp - Color temperature. Default: `nil`

# `lab2xyz!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec lab2xyz!(Vix.Vips.Image.t(), [{:temp, [float()]}]) ::
  Vix.Vips.Image.t() | no_return()
```

Transform cielab to xyz

## Arguments
  * input - Input image

## Optional
* temp - Color temperature. Default: `nil`

# `labelregions`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec labelregions(Vix.Vips.Image.t()) ::
  {:ok, {Vix.Vips.Image.t(), %{segments: integer()}}} | {:error, term()}
```

Label regions in an image

## Arguments
  * input - Input image argument

## Returns
Operation returns a tuple

* mask - Mask of region labels. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* segments - Number of discrete contiguous regions. (`integer()`)

# `labelregions!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec labelregions!(Vix.Vips.Image.t()) ::
  {Vix.Vips.Image.t(), %{segments: integer()}} | no_return()
```

Label regions in an image

## Arguments
  * input - Input image argument

## Returns
Operation returns a tuple

* mask - Mask of region labels. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* segments - Number of discrete contiguous regions. (`integer()`)

# `labq2lab`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec labq2lab(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Unpack a labq image to float lab

## Arguments
  * input - Input image

# `labq2lab!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec labq2lab!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Unpack a labq image to float lab

## Arguments
  * input - Input image

# `labq2labs`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec labq2labs(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Unpack a labq image to short lab

## Arguments
  * input - Input image

# `labq2labs!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec labq2labs!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Unpack a labq image to short lab

## Arguments
  * input - Input image

# `labq2srgb`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec labq2srgb(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Convert a labq image to srgb

## Arguments
  * input - Input image

# `labq2srgb!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec labq2srgb!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Convert a labq image to srgb

## Arguments
  * input - Input image

# `labs2lab`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec labs2lab(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform signed short lab to float

## Arguments
  * input - Input image

# `labs2lab!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec labs2lab!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform signed short lab to float

## Arguments
  * input - Input image

# `labs2labq`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec labs2labq(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform short lab to labq coding

## Arguments
  * input - Input image

# `labs2labq!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec labs2labq!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform short lab to labq coding

## Arguments
  * input - Input image

# `lch2cmc`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec lch2cmc(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform lch to cmc

## Arguments
  * input - Input image

# `lch2cmc!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec lch2cmc!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform lch to cmc

## Arguments
  * input - Input image

# `lch2lab`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec lch2lab(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform lch to lab

## Arguments
  * input - Input image

# `lch2lab!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec lch2lab!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform lch to lab

## Arguments
  * input - Input image

# `linear`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec linear(Vix.Vips.Image.t(), [float()], [float()], [{:uchar, boolean()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Calculate (a * in + b)

## Arguments
  * input - Input image
  * a - Multiply by this
  * b - Add this

## Optional
* uchar - Output should be uchar. Default: `false`

# `linear!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec linear!(Vix.Vips.Image.t(), [float()], [float()], [{:uchar, boolean()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Calculate (a * in + b)

## Arguments
  * input - Input image
  * a - Multiply by this
  * b - Add this

## Optional
* uchar - Output should be uchar. Default: `false`

# `linecache`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec linecache(Vix.Vips.Image.t(),
  persistent: boolean(),
  threaded: boolean(),
  access: vips_access(),
  &quot;tile-height&quot;: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Cache an image as a set of lines

## Arguments
  * input - Input image

## Optional
* persistent - Keep cache between evaluations. Default: `false`
* threaded - Allow threaded access. Default: `false`
* access - Expected access pattern. Default: `:VIPS_ACCESS_RANDOM`
* tile-height - Tile height in pixels. Default: `128`

# `linecache!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec linecache!(Vix.Vips.Image.t(),
  persistent: boolean(),
  threaded: boolean(),
  access: vips_access(),
  &quot;tile-height&quot;: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Cache an image as a set of lines

## Arguments
  * input - Input image

## Optional
* persistent - Keep cache between evaluations. Default: `false`
* threaded - Allow threaded access. Default: `false`
* access - Expected access pattern. Default: `:VIPS_ACCESS_RANDOM`
* tile-height - Tile height in pixels. Default: `128`

# `logmat`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec logmat(float(), float(), precision: vips_precision(), separable: boolean()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a laplacian of gaussian image

## Arguments
  * sigma - Radius of Gaussian
  * min-ampl - Minimum amplitude of Gaussian

## Optional
* precision - Generate with this precision. Default: `:VIPS_PRECISION_INTEGER`
* separable - Generate separable Gaussian. Default: `false`

# `logmat!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec logmat!(float(), float(), precision: vips_precision(), separable: boolean()) ::
  Vix.Vips.Image.t() | no_return()
```

Make a laplacian of gaussian image

## Arguments
  * sigma - Radius of Gaussian
  * min-ampl - Minimum amplitude of Gaussian

## Optional
* precision - Generate with this precision. Default: `:VIPS_PRECISION_INTEGER`
* separable - Generate separable Gaussian. Default: `false`

# `mapim`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mapim(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  extend: vips_extend(),
  premultiplied: boolean(),
  background: [float()],
  interpolate: Vix.Vips.Interpolate.t()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Resample with a map image

## Arguments
  * input - Input image argument
  * index - Index pixels with this

## Optional
* extend - How to generate the extra pixels. Default: `:VIPS_EXTEND_BACKGROUND`
* premultiplied - Images have premultiplied alpha. Default: `false`
* background - Background value. Default: `nil`
* interpolate - Interpolate pixels with this. 

# `mapim!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mapim!(Vix.Vips.Image.t(), Vix.Vips.Image.t(),
  extend: vips_extend(),
  premultiplied: boolean(),
  background: [float()],
  interpolate: Vix.Vips.Interpolate.t()
) :: Vix.Vips.Image.t() | no_return()
```

Resample with a map image

## Arguments
  * input - Input image argument
  * index - Index pixels with this

## Optional
* extend - How to generate the extra pixels. Default: `:VIPS_EXTEND_BACKGROUND`
* premultiplied - Images have premultiplied alpha. Default: `false`
* background - Background value. Default: `nil`
* interpolate - Interpolate pixels with this. 

# `maplut`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec maplut(Vix.Vips.Image.t(), Vix.Vips.Image.t(), [{:band, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Map an image though a lut

## Arguments
  * input - Input image
  * lut - Look-up table image

## Optional
* band - Apply one-band lut to this band of in. Default: `-1`

# `maplut!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec maplut!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), [{:band, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Map an image though a lut

## Arguments
  * input - Input image
  * lut - Look-up table image

## Optional
* band - Apply one-band lut to this band of in. Default: `-1`

# `mask_butterworth`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_butterworth(integer(), integer(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a butterworth filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * order - Filter order
  * frequency-cutoff - Frequency cutoff
  * amplitude-cutoff - Amplitude cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_butterworth!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_butterworth!(integer(), integer(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make a butterworth filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * order - Filter order
  * frequency-cutoff - Frequency cutoff
  * amplitude-cutoff - Amplitude cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_butterworth_band`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_butterworth_band(
  integer(),
  integer(),
  float(),
  float(),
  float(),
  float(),
  float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a butterworth_band filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * order - Filter order
  * frequency-cutoff-x - Frequency cutoff x
  * frequency-cutoff-y - Frequency cutoff y
  * radius - Radius of circle
  * amplitude-cutoff - Amplitude cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_butterworth_band!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_butterworth_band!(
  integer(),
  integer(),
  float(),
  float(),
  float(),
  float(),
  float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make a butterworth_band filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * order - Filter order
  * frequency-cutoff-x - Frequency cutoff x
  * frequency-cutoff-y - Frequency cutoff y
  * radius - Radius of circle
  * amplitude-cutoff - Amplitude cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_butterworth_ring`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_butterworth_ring(integer(), integer(), float(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a butterworth ring filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * order - Filter order
  * frequency-cutoff - Frequency cutoff
  * amplitude-cutoff - Amplitude cutoff
  * ringwidth - Ringwidth

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_butterworth_ring!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_butterworth_ring!(integer(), integer(), float(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make a butterworth ring filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * order - Filter order
  * frequency-cutoff - Frequency cutoff
  * amplitude-cutoff - Amplitude cutoff
  * ringwidth - Ringwidth

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_fractal`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_fractal(integer(), integer(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make fractal filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * fractal-dimension - Fractal dimension

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_fractal!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_fractal!(integer(), integer(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make fractal filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * fractal-dimension - Fractal dimension

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_gaussian`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_gaussian(integer(), integer(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a gaussian filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff - Frequency cutoff
  * amplitude-cutoff - Amplitude cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_gaussian!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_gaussian!(integer(), integer(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make a gaussian filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff - Frequency cutoff
  * amplitude-cutoff - Amplitude cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_gaussian_band`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_gaussian_band(integer(), integer(), float(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a gaussian filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff-x - Frequency cutoff x
  * frequency-cutoff-y - Frequency cutoff y
  * radius - Radius of circle
  * amplitude-cutoff - Amplitude cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_gaussian_band!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_gaussian_band!(integer(), integer(), float(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make a gaussian filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff-x - Frequency cutoff x
  * frequency-cutoff-y - Frequency cutoff y
  * radius - Radius of circle
  * amplitude-cutoff - Amplitude cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_gaussian_ring`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_gaussian_ring(integer(), integer(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a gaussian ring filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff - Frequency cutoff
  * amplitude-cutoff - Amplitude cutoff
  * ringwidth - Ringwidth

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_gaussian_ring!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_gaussian_ring!(integer(), integer(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make a gaussian ring filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff - Frequency cutoff
  * amplitude-cutoff - Amplitude cutoff
  * ringwidth - Ringwidth

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_ideal`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_ideal(integer(), integer(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make an ideal filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff - Frequency cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_ideal!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_ideal!(integer(), integer(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make an ideal filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff - Frequency cutoff

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_ideal_band`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_ideal_band(integer(), integer(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make an ideal band filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff-x - Frequency cutoff x
  * frequency-cutoff-y - Frequency cutoff y
  * radius - Radius of circle

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_ideal_band!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_ideal_band!(integer(), integer(), float(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make an ideal band filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff-x - Frequency cutoff x
  * frequency-cutoff-y - Frequency cutoff y
  * radius - Radius of circle

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_ideal_ring`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mask_ideal_ring(integer(), integer(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make an ideal ring filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff - Frequency cutoff
  * ringwidth - Ringwidth

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `mask_ideal_ring!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mask_ideal_ring!(integer(), integer(), float(), float(),
  optical: boolean(),
  reject: boolean(),
  nodc: boolean(),
  uchar: boolean()
) :: Vix.Vips.Image.t() | no_return()
```

Make an ideal ring filter

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * frequency-cutoff - Frequency cutoff
  * ringwidth - Ringwidth

## Optional
* optical - Rotate quadrants to optical space. Default: `false`
* reject - Invert the sense of the filter. Default: `false`
* nodc - Remove DC component. Default: `false`
* uchar - Output an unsigned char image. Default: `false`

# `match`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec match(
  Vix.Vips.Image.t(),
  Vix.Vips.Image.t(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  interpolate: Vix.Vips.Interpolate.t(),
  search: boolean(),
  harea: integer(),
  hwindow: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

First-order match of two images

## Arguments
  * ref - Reference image
  * sec - Secondary image
  * xr1 - Position of first reference tie-point
  * yr1 - Position of first reference tie-point
  * xs1 - Position of first secondary tie-point
  * ys1 - Position of first secondary tie-point
  * xr2 - Position of second reference tie-point
  * yr2 - Position of second reference tie-point
  * xs2 - Position of second secondary tie-point
  * ys2 - Position of second secondary tie-point

## Optional
* interpolate - Interpolate pixels with this. 
* search - Search to improve tie-points. Default: `false`
* harea - Half area size. Default: `15`
* hwindow - Half window size. Default: `5`

# `match!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec match!(
  Vix.Vips.Image.t(),
  Vix.Vips.Image.t(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  interpolate: Vix.Vips.Interpolate.t(),
  search: boolean(),
  harea: integer(),
  hwindow: integer()
) :: Vix.Vips.Image.t() | no_return()
```

First-order match of two images

## Arguments
  * ref - Reference image
  * sec - Secondary image
  * xr1 - Position of first reference tie-point
  * yr1 - Position of first reference tie-point
  * xs1 - Position of first secondary tie-point
  * ys1 - Position of first secondary tie-point
  * xr2 - Position of second reference tie-point
  * yr2 - Position of second reference tie-point
  * xs2 - Position of second secondary tie-point
  * ys2 - Position of second secondary tie-point

## Optional
* interpolate - Interpolate pixels with this. 
* search - Search to improve tie-points. Default: `false`
* harea - Half area size. Default: `15`
* hwindow - Half window size. Default: `5`

# `math2`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec math2(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_math2()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Binary math operations

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument
  * math2 - Math to perform

# `math2!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec math2!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_math2()) ::
  Vix.Vips.Image.t() | no_return()
```

Binary math operations

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument
  * math2 - Math to perform

# `math2_const`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec math2_const(Vix.Vips.Image.t(), vips_operation_math2(), [float()]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Binary math operations with a constant

## Arguments
  * input - Input image
  * math2 - Math to perform
  * c - Array of constants

# `math2_const!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec math2_const!(Vix.Vips.Image.t(), vips_operation_math2(), [float()]) ::
  Vix.Vips.Image.t() | no_return()
```

Binary math operations with a constant

## Arguments
  * input - Input image
  * math2 - Math to perform
  * c - Array of constants

# `math`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec math(Vix.Vips.Image.t(), vips_operation_math()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Apply a math operation to an image

## Arguments
  * input - Input image
  * math - Math to perform

# `math!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec math!(Vix.Vips.Image.t(), vips_operation_math()) ::
  Vix.Vips.Image.t() | no_return()
```

Apply a math operation to an image

## Arguments
  * input - Input image
  * math - Math to perform

# `matrixinvert`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec matrixinvert(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Invert a matrix

## Arguments
  * input - An square matrix

# `matrixinvert!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec matrixinvert!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Invert a matrix

## Arguments
  * input - An square matrix

# `matrixload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec matrixload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load matrix

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `matrixload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec matrixload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load matrix

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `matrixmultiply`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec matrixmultiply(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Multiply two matrices

## Arguments
  * left - First matrix to multiply
  * right - Second matrix to multiply

# `matrixmultiply!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec matrixmultiply!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Multiply two matrices

## Arguments
  * left - First matrix to multiply
  * right - Second matrix to multiply

# `matrixprint`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec matrixprint(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: :ok | {:error, term()}
```

Print matrix

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `matrixprint!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec matrixprint!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: :ok | no_return()
```

Print matrix

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `matrixsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec matrixsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: :ok | {:error, term()}
```

Save image to matrix

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `matrixsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec matrixsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: :ok | no_return()
```

Save image to matrix

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `max`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec max(Vix.Vips.Image.t(), [{:size, integer()}]) ::
  {:ok,
   {float(),
    %{
      &quot;y-array&quot;: [integer()],
      &quot;x-array&quot;: [integer()],
      &quot;out-array&quot;: [float()],
      y: integer(),
      x: integer()
    }}}
  | {:error, term()}
```

Find image maximum

## Arguments
  * input - Input image

## Optional
* size - Number of maximum values to find. Default: `1`

## Returns
Operation returns a tuple

* out - Output value. (`float()`)

Last value of the tuple is a map of additional output values as key-value pair.
* y-array - Array of vertical positions. (`list(integer())`)
* x-array - Array of horizontal positions. (`list(integer())`)
* out-array - Array of output values. (`list(float())`)
* y - Vertical position of maximum. (`integer()`)
* x - Horizontal position of maximum. (`integer()`)

# `max!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec max!(Vix.Vips.Image.t(), [{:size, integer()}]) ::
  {float(),
   %{
     &quot;y-array&quot;: [integer()],
     &quot;x-array&quot;: [integer()],
     &quot;out-array&quot;: [float()],
     y: integer(),
     x: integer()
   }}
  | no_return()
```

Find image maximum

## Arguments
  * input - Input image

## Optional
* size - Number of maximum values to find. Default: `1`

## Returns
Operation returns a tuple

* out - Output value. (`float()`)

Last value of the tuple is a map of additional output values as key-value pair.
* y-array - Array of vertical positions. (`list(integer())`)
* x-array - Array of horizontal positions. (`list(integer())`)
* out-array - Array of output values. (`list(float())`)
* y - Vertical position of maximum. (`integer()`)
* x - Horizontal position of maximum. (`integer()`)

# `maxpair`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec maxpair(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Maximum of a pair of images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `maxpair!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec maxpair!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Maximum of a pair of images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `measure`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec measure(Vix.Vips.Image.t(), integer(), integer(),
  height: integer(),
  width: integer(),
  top: integer(),
  left: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Measure a set of patches on a color chart

## Arguments
  * input - Image to measure
  * h - Number of patches across chart
  * v - Number of patches down chart

## Optional
* height - Height of extract area. Default: `1`
* width - Width of extract area. Default: `1`
* top - Top edge of extract area. Default: `0`
* left - Left edge of extract area. Default: `0`

# `measure!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec measure!(Vix.Vips.Image.t(), integer(), integer(),
  height: integer(),
  width: integer(),
  top: integer(),
  left: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Measure a set of patches on a color chart

## Arguments
  * input - Image to measure
  * h - Number of patches across chart
  * v - Number of patches down chart

## Optional
* height - Height of extract area. Default: `1`
* width - Width of extract area. Default: `1`
* top - Top edge of extract area. Default: `0`
* left - Left edge of extract area. Default: `0`

# `merge`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec merge(
  Vix.Vips.Image.t(),
  Vix.Vips.Image.t(),
  vips_direction(),
  integer(),
  integer(),
  [
    {:mblend, integer()}
  ]
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Merge two images

## Arguments
  * ref - Reference image
  * sec - Secondary image
  * direction - Horizontal or vertical merge
  * dx - Horizontal displacement from sec to ref
  * dy - Vertical displacement from sec to ref

## Optional
* mblend - Maximum blend size. Default: `10`

# `merge!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec merge!(
  Vix.Vips.Image.t(),
  Vix.Vips.Image.t(),
  vips_direction(),
  integer(),
  integer(),
  [
    {:mblend, integer()}
  ]
) :: Vix.Vips.Image.t() | no_return()
```

Merge two images

## Arguments
  * ref - Reference image
  * sec - Secondary image
  * direction - Horizontal or vertical merge
  * dx - Horizontal displacement from sec to ref
  * dy - Vertical displacement from sec to ref

## Optional
* mblend - Maximum blend size. Default: `10`

# `min`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec min(Vix.Vips.Image.t(), [{:size, integer()}]) ::
  {:ok,
   {float(),
    %{
      &quot;y-array&quot;: [integer()],
      &quot;x-array&quot;: [integer()],
      &quot;out-array&quot;: [float()],
      y: integer(),
      x: integer()
    }}}
  | {:error, term()}
```

Find image minimum

## Arguments
  * input - Input image

## Optional
* size - Number of minimum values to find. Default: `1`

## Returns
Operation returns a tuple

* out - Output value. (`float()`)

Last value of the tuple is a map of additional output values as key-value pair.
* y-array - Array of vertical positions. (`list(integer())`)
* x-array - Array of horizontal positions. (`list(integer())`)
* out-array - Array of output values. (`list(float())`)
* y - Vertical position of minimum. (`integer()`)
* x - Horizontal position of minimum. (`integer()`)

# `min!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec min!(Vix.Vips.Image.t(), [{:size, integer()}]) ::
  {float(),
   %{
     &quot;y-array&quot;: [integer()],
     &quot;x-array&quot;: [integer()],
     &quot;out-array&quot;: [float()],
     y: integer(),
     x: integer()
   }}
  | no_return()
```

Find image minimum

## Arguments
  * input - Input image

## Optional
* size - Number of minimum values to find. Default: `1`

## Returns
Operation returns a tuple

* out - Output value. (`float()`)

Last value of the tuple is a map of additional output values as key-value pair.
* y-array - Array of vertical positions. (`list(integer())`)
* x-array - Array of horizontal positions. (`list(integer())`)
* out-array - Array of output values. (`list(float())`)
* y - Vertical position of minimum. (`integer()`)
* x - Horizontal position of minimum. (`integer()`)

# `minpair`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec minpair(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Minimum of a pair of images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `minpair!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec minpair!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Minimum of a pair of images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `morph`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec morph(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_morphology()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Morphology operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image
  * morph - Morphological operation to perform

# `morph!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec morph!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_morphology()) ::
  Vix.Vips.Image.t() | no_return()
```

Morphology operation

## Arguments
  * input - Input image argument
  * mask - Input matrix image
  * morph - Morphological operation to perform

# `mosaic1`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mosaic1(
  Vix.Vips.Image.t(),
  Vix.Vips.Image.t(),
  vips_direction(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  mblend: integer(),
  interpolate: Vix.Vips.Interpolate.t(),
  search: boolean(),
  harea: integer(),
  hwindow: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

First-order mosaic of two images

## Arguments
  * ref - Reference image
  * sec - Secondary image
  * direction - Horizontal or vertical mosaic
  * xr1 - Position of first reference tie-point
  * yr1 - Position of first reference tie-point
  * xs1 - Position of first secondary tie-point
  * ys1 - Position of first secondary tie-point
  * xr2 - Position of second reference tie-point
  * yr2 - Position of second reference tie-point
  * xs2 - Position of second secondary tie-point
  * ys2 - Position of second secondary tie-point

## Optional
* mblend - Maximum blend size. Default: `10`
* interpolate - Interpolate pixels with this. 
* search - Search to improve tie-points. Default: `false`
* harea - Half area size. Default: `15`
* hwindow - Half window size. Default: `5`

# `mosaic1!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mosaic1!(
  Vix.Vips.Image.t(),
  Vix.Vips.Image.t(),
  vips_direction(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  mblend: integer(),
  interpolate: Vix.Vips.Interpolate.t(),
  search: boolean(),
  harea: integer(),
  hwindow: integer()
) :: Vix.Vips.Image.t() | no_return()
```

First-order mosaic of two images

## Arguments
  * ref - Reference image
  * sec - Secondary image
  * direction - Horizontal or vertical mosaic
  * xr1 - Position of first reference tie-point
  * yr1 - Position of first reference tie-point
  * xs1 - Position of first secondary tie-point
  * ys1 - Position of first secondary tie-point
  * xr2 - Position of second reference tie-point
  * yr2 - Position of second reference tie-point
  * xs2 - Position of second secondary tie-point
  * ys2 - Position of second secondary tie-point

## Optional
* mblend - Maximum blend size. Default: `10`
* interpolate - Interpolate pixels with this. 
* search - Search to improve tie-points. Default: `false`
* harea - Half area size. Default: `15`
* hwindow - Half window size. Default: `5`

# `mosaic`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec mosaic(
  Vix.Vips.Image.t(),
  Vix.Vips.Image.t(),
  vips_direction(),
  integer(),
  integer(),
  integer(),
  integer(),
  bandno: integer(),
  mblend: integer(),
  harea: integer(),
  hwindow: integer()
) ::
  {:ok,
   {Vix.Vips.Image.t(),
    %{
      dx1: float(),
      dy1: float(),
      angle1: float(),
      scale1: float(),
      dy0: integer(),
      dx0: integer()
    }}}
  | {:error, term()}
```

Mosaic two images

## Arguments
  * ref - Reference image
  * sec - Secondary image
  * direction - Horizontal or vertical mosaic
  * xref - Position of reference tie-point
  * yref - Position of reference tie-point
  * xsec - Position of secondary tie-point
  * ysec - Position of secondary tie-point

## Optional
* bandno - Band to search for features on. Default: `0`
* mblend - Maximum blend size. Default: `10`
* harea - Half area size. Default: `15`
* hwindow - Half window size. Default: `5`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* dx1 - Detected first-order displacement. (`float()`)
* dy1 - Detected first-order displacement. (`float()`)
* angle1 - Detected rotation. (`float()`)
* scale1 - Detected scale. (`float()`)
* dy0 - Detected integer offset. (`integer()`)
* dx0 - Detected integer offset. (`integer()`)

# `mosaic!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec mosaic!(
  Vix.Vips.Image.t(),
  Vix.Vips.Image.t(),
  vips_direction(),
  integer(),
  integer(),
  integer(),
  integer(),
  bandno: integer(),
  mblend: integer(),
  harea: integer(),
  hwindow: integer()
) ::
  {Vix.Vips.Image.t(),
   %{
     dx1: float(),
     dy1: float(),
     angle1: float(),
     scale1: float(),
     dy0: integer(),
     dx0: integer()
   }}
  | no_return()
```

Mosaic two images

## Arguments
  * ref - Reference image
  * sec - Secondary image
  * direction - Horizontal or vertical mosaic
  * xref - Position of reference tie-point
  * yref - Position of reference tie-point
  * xsec - Position of secondary tie-point
  * ysec - Position of secondary tie-point

## Optional
* bandno - Band to search for features on. Default: `0`
* mblend - Maximum blend size. Default: `10`
* harea - Half area size. Default: `15`
* hwindow - Half window size. Default: `5`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* dx1 - Detected first-order displacement. (`float()`)
* dy1 - Detected first-order displacement. (`float()`)
* angle1 - Detected rotation. (`float()`)
* scale1 - Detected scale. (`float()`)
* dy0 - Detected integer offset. (`integer()`)
* dx0 - Detected integer offset. (`integer()`)

# `msb`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec msb(Vix.Vips.Image.t(), [{:band, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Pick most-significant byte from an image

## Arguments
  * input - Input image

## Optional
* band - Band to msb. Default: `-1`

# `msb!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec msb!(Vix.Vips.Image.t(), [{:band, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Pick most-significant byte from an image

## Arguments
  * input - Input image

## Optional
* band - Band to msb. Default: `-1`

# `multiply`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec multiply(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Multiply two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `multiply!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec multiply!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Multiply two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `percent`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec percent(Vix.Vips.Image.t(), float()) :: {:ok, integer()} | {:error, term()}
```

Find threshold for percent of pixels

## Arguments
  * input - Input image
  * percent - Percent of pixels

# `percent!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec percent!(Vix.Vips.Image.t(), float()) :: integer() | no_return()
```

Find threshold for percent of pixels

## Arguments
  * input - Input image
  * percent - Percent of pixels

# `perlin`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec perlin(integer(), integer(),
  seed: integer(),
  uchar: boolean(),
  &quot;cell-size&quot;: integer()
) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a perlin noise image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* seed - Random number seed. Default: `0`
* uchar - Output an unsigned char image. Default: `false`
* cell-size - Size of Perlin cells. Default: `256`

# `perlin!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec perlin!(integer(), integer(),
  seed: integer(),
  uchar: boolean(),
  &quot;cell-size&quot;: integer()
) ::
  Vix.Vips.Image.t() | no_return()
```

Make a perlin noise image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* seed - Random number seed. Default: `0`
* uchar - Output an unsigned char image. Default: `false`
* cell-size - Size of Perlin cells. Default: `256`

# `phasecor`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec phasecor(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Calculate phase correlation

## Arguments
  * input - Input image
  * in2 - Second input image

# `phasecor!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec phasecor!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Calculate phase correlation

## Arguments
  * input - Input image
  * in2 - Second input image

# `pngload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec pngload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load png from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `pngload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec pngload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load png from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `pngload_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec pngload_buffer(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load png from buffer

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `pngload_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec pngload_buffer!(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load png from buffer

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `pngsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec pngsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  effort: integer(),
  bitdepth: integer(),
  dither: float(),
  Q: integer(),
  palette: boolean(),
  filter: vips_foreign_png_filter(),
  interlace: boolean(),
  compression: integer()
) :: :ok | {:error, term()}
```

Save image to file as png

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* effort - Quantisation CPU effort. Default: `7`
* bitdepth - Write as a 1, 2, 4, 8 or 16 bit image. Default: `8`
* dither - Amount of dithering. Default: `1.0`
* Q - Quantisation quality. Default: `100`
* palette - Quantise to 8bpp palette. Default: `false`
* filter - libspng row filter flag(s). Default: `[:VIPS_FOREIGN_PNG_FILTER_NONE]`
* interlace - Interlace image. Default: `false`
* compression - Compression factor. Default: `6`

# `pngsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec pngsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  effort: integer(),
  bitdepth: integer(),
  dither: float(),
  Q: integer(),
  palette: boolean(),
  filter: vips_foreign_png_filter(),
  interlace: boolean(),
  compression: integer()
) :: :ok | no_return()
```

Save image to file as png

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* effort - Quantisation CPU effort. Default: `7`
* bitdepth - Write as a 1, 2, 4, 8 or 16 bit image. Default: `8`
* dither - Amount of dithering. Default: `1.0`
* Q - Quantisation quality. Default: `100`
* palette - Quantise to 8bpp palette. Default: `false`
* filter - libspng row filter flag(s). Default: `[:VIPS_FOREIGN_PNG_FILTER_NONE]`
* interlace - Interlace image. Default: `false`
* compression - Compression factor. Default: `6`

# `pngsave_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec pngsave_buffer(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  effort: integer(),
  bitdepth: integer(),
  dither: float(),
  Q: integer(),
  palette: boolean(),
  filter: vips_foreign_png_filter(),
  interlace: boolean(),
  compression: integer()
) :: {:ok, binary()} | {:error, term()}
```

Save image to buffer as png

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* effort - Quantisation CPU effort. Default: `7`
* bitdepth - Write as a 1, 2, 4, 8 or 16 bit image. Default: `8`
* dither - Amount of dithering. Default: `1.0`
* Q - Quantisation quality. Default: `100`
* palette - Quantise to 8bpp palette. Default: `false`
* filter - libspng row filter flag(s). Default: `[:VIPS_FOREIGN_PNG_FILTER_NONE]`
* interlace - Interlace image. Default: `false`
* compression - Compression factor. Default: `6`

# `pngsave_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec pngsave_buffer!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  effort: integer(),
  bitdepth: integer(),
  dither: float(),
  Q: integer(),
  palette: boolean(),
  filter: vips_foreign_png_filter(),
  interlace: boolean(),
  compression: integer()
) :: binary() | no_return()
```

Save image to buffer as png

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* effort - Quantisation CPU effort. Default: `7`
* bitdepth - Write as a 1, 2, 4, 8 or 16 bit image. Default: `8`
* dither - Amount of dithering. Default: `1.0`
* Q - Quantisation quality. Default: `100`
* palette - Quantise to 8bpp palette. Default: `false`
* filter - libspng row filter flag(s). Default: `[:VIPS_FOREIGN_PNG_FILTER_NONE]`
* interlace - Interlace image. Default: `false`
* compression - Compression factor. Default: `6`

# `premultiply`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec premultiply(Vix.Vips.Image.t(), [{:&quot;max-alpha&quot;, float()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Premultiply image alpha

## Arguments
  * input - Input image

## Optional
* max-alpha - Maximum value of alpha channel. Default: `255.0`

# `premultiply!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec premultiply!(Vix.Vips.Image.t(), [{:&quot;max-alpha&quot;, float()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Premultiply image alpha

## Arguments
  * input - Input image

## Optional
* max-alpha - Maximum value of alpha channel. Default: `255.0`

# `prewitt`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec prewitt(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Prewitt edge detector

## Arguments
  * input - Input image

# `prewitt!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec prewitt!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Prewitt edge detector

## Arguments
  * input - Input image

# `profile`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec profile(Vix.Vips.Image.t()) ::
  {:ok, {Vix.Vips.Image.t(), Vix.Vips.Image.t()}} | {:error, term()}
```

Find image profiles

## Arguments
  * input - Input image

## Returns
Operation returns a tuple

* columns - First non-zero pixel in column. (`Vix.Vips.Image.t()`)
* rows - First non-zero pixel in row. (`Vix.Vips.Image.t()`)

# `profile!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec profile!(Vix.Vips.Image.t()) ::
  {Vix.Vips.Image.t(), Vix.Vips.Image.t()} | no_return()
```

Find image profiles

## Arguments
  * input - Input image

## Returns
Operation returns a tuple

* columns - First non-zero pixel in column. (`Vix.Vips.Image.t()`)
* rows - First non-zero pixel in row. (`Vix.Vips.Image.t()`)

# `profile_load`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec profile_load(String.t()) :: {:ok, binary()} | {:error, term()}
```

Load named icc profile

## Arguments
  * name - Profile name

# `profile_load!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec profile_load!(String.t()) :: binary() | no_return()
```

Load named icc profile

## Arguments
  * name - Profile name

# `project`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec project(Vix.Vips.Image.t()) ::
  {:ok, {Vix.Vips.Image.t(), Vix.Vips.Image.t()}} | {:error, term()}
```

Find image projections

## Arguments
  * input - Input image

## Returns
Operation returns a tuple

* columns - Sums of columns. (`Vix.Vips.Image.t()`)
* rows - Sums of rows. (`Vix.Vips.Image.t()`)

# `project!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec project!(Vix.Vips.Image.t()) ::
  {Vix.Vips.Image.t(), Vix.Vips.Image.t()} | no_return()
```

Find image projections

## Arguments
  * input - Input image

## Returns
Operation returns a tuple

* columns - Sums of columns. (`Vix.Vips.Image.t()`)
* rows - Sums of rows. (`Vix.Vips.Image.t()`)

# `quadratic`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec quadratic(Vix.Vips.Image.t(), Vix.Vips.Image.t(), [
  {:interpolate, Vix.Vips.Interpolate.t()}
]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Resample an image with a quadratic transform

## Arguments
  * input - Input image argument
  * coeff - Coefficient matrix

## Optional
* interpolate - Interpolate values with this. 

# `quadratic!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec quadratic!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), [
  {:interpolate, Vix.Vips.Interpolate.t()}
]) ::
  Vix.Vips.Image.t() | no_return()
```

Resample an image with a quadratic transform

## Arguments
  * input - Input image argument
  * coeff - Coefficient matrix

## Optional
* interpolate - Interpolate values with this. 

# `rad2float`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec rad2float(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Unpack radiance coding to float rgb

## Arguments
  * input - Input image

# `rad2float!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec rad2float!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Unpack radiance coding to float rgb

## Arguments
  * input - Input image

# `rank`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec rank(Vix.Vips.Image.t(), integer(), integer(), integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Rank filter

## Arguments
  * input - Input image argument
  * width - Window width in pixels
  * height - Window height in pixels
  * index - Select pixel at index

# `rank!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec rank!(Vix.Vips.Image.t(), integer(), integer(), integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Rank filter

## Arguments
  * input - Input image argument
  * width - Window width in pixels
  * height - Window height in pixels
  * index - Select pixel at index

# `rawload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec rawload(String.t(), integer(), integer(), integer(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  interpretation: vips_interpretation(),
  format: vips_band_format(),
  offset: non_neg_integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load raw data from a file

## Arguments
  * filename - Filename to load from
  * width - Image width in pixels
  * height - Image height in pixels
  * bands - Number of bands in image

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* interpretation - Pixel interpretation. Default: `:VIPS_INTERPRETATION_MULTIBAND`
* format - Pixel format in image. Default: `:VIPS_FORMAT_UCHAR`
* offset - Offset in bytes from start of file. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `rawload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec rawload!(String.t(), integer(), integer(), integer(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  interpretation: vips_interpretation(),
  format: vips_band_format(),
  offset: non_neg_integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load raw data from a file

## Arguments
  * filename - Filename to load from
  * width - Image width in pixels
  * height - Image height in pixels
  * bands - Number of bands in image

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* interpretation - Pixel interpretation. Default: `:VIPS_INTERPRETATION_MULTIBAND`
* format - Pixel format in image. Default: `:VIPS_FORMAT_UCHAR`
* offset - Offset in bytes from start of file. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `rawsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec rawsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: :ok | {:error, term()}
```

Save image to raw file

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `rawsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec rawsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: :ok | no_return()
```

Save image to raw file

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `rawsave_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec rawsave_buffer(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: {:ok, binary()} | {:error, term()}
```

Write raw image to buffer

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `rawsave_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec rawsave_buffer!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: binary() | no_return()
```

Write raw image to buffer

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `recomb`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec recomb(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Linear recombination with matrix

## Arguments
  * input - Input image argument
  * m - Matrix of coefficients

# `recomb!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec recomb!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Linear recombination with matrix

## Arguments
  * input - Input image argument
  * m - Matrix of coefficients

# `reduce`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec reduce(Vix.Vips.Image.t(), float(), float(),
  gap: float(),
  kernel: vips_kernel()
) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Reduce an image

## Arguments
  * input - Input image argument
  * hshrink - Horizontal shrink factor
  * vshrink - Vertical shrink factor

## Optional
* gap - Reducing gap. Default: `0.0`
* kernel - Resampling kernel. Default: `:VIPS_KERNEL_LANCZOS3`

# `reduce!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec reduce!(Vix.Vips.Image.t(), float(), float(),
  gap: float(),
  kernel: vips_kernel()
) ::
  Vix.Vips.Image.t() | no_return()
```

Reduce an image

## Arguments
  * input - Input image argument
  * hshrink - Horizontal shrink factor
  * vshrink - Vertical shrink factor

## Optional
* gap - Reducing gap. Default: `0.0`
* kernel - Resampling kernel. Default: `:VIPS_KERNEL_LANCZOS3`

# `reduceh`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec reduceh(Vix.Vips.Image.t(), float(), gap: float(), kernel: vips_kernel()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Shrink an image horizontally

## Arguments
  * input - Input image argument
  * hshrink - Horizontal shrink factor

## Optional
* gap - Reducing gap. Default: `0.0`
* kernel - Resampling kernel. Default: `:VIPS_KERNEL_LANCZOS3`

# `reduceh!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec reduceh!(Vix.Vips.Image.t(), float(), gap: float(), kernel: vips_kernel()) ::
  Vix.Vips.Image.t() | no_return()
```

Shrink an image horizontally

## Arguments
  * input - Input image argument
  * hshrink - Horizontal shrink factor

## Optional
* gap - Reducing gap. Default: `0.0`
* kernel - Resampling kernel. Default: `:VIPS_KERNEL_LANCZOS3`

# `reducev`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec reducev(Vix.Vips.Image.t(), float(), gap: float(), kernel: vips_kernel()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Shrink an image vertically

## Arguments
  * input - Input image argument
  * vshrink - Vertical shrink factor

## Optional
* gap - Reducing gap. Default: `0.0`
* kernel - Resampling kernel. Default: `:VIPS_KERNEL_LANCZOS3`

# `reducev!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec reducev!(Vix.Vips.Image.t(), float(), gap: float(), kernel: vips_kernel()) ::
  Vix.Vips.Image.t() | no_return()
```

Shrink an image vertically

## Arguments
  * input - Input image argument
  * vshrink - Vertical shrink factor

## Optional
* gap - Reducing gap. Default: `0.0`
* kernel - Resampling kernel. Default: `:VIPS_KERNEL_LANCZOS3`

# `relational`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec relational(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_relational()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Relational operation on two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument
  * relational - Relational to perform

# `relational!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec relational!(Vix.Vips.Image.t(), Vix.Vips.Image.t(), vips_operation_relational()) ::
  Vix.Vips.Image.t() | no_return()
```

Relational operation on two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument
  * relational - Relational to perform

# `relational_const`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec relational_const(Vix.Vips.Image.t(), vips_operation_relational(), [float()]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Relational operations against a constant

## Arguments
  * input - Input image
  * relational - Relational to perform
  * c - Array of constants

# `relational_const!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec relational_const!(Vix.Vips.Image.t(), vips_operation_relational(), [float()]) ::
  Vix.Vips.Image.t() | no_return()
```

Relational operations against a constant

## Arguments
  * input - Input image
  * relational - Relational to perform
  * c - Array of constants

# `remainder`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec remainder(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Remainder after integer division of two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `remainder!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec remainder!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Remainder after integer division of two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `remainder_const`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec remainder_const(Vix.Vips.Image.t(), [float()]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Remainder after integer division of an image and a constant

## Arguments
  * input - Input image
  * c - Array of constants

# `remainder_const!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec remainder_const!(Vix.Vips.Image.t(), [float()]) ::
  Vix.Vips.Image.t() | no_return()
```

Remainder after integer division of an image and a constant

## Arguments
  * input - Input image
  * c - Array of constants

# `remosaic`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec remosaic(Vix.Vips.Image.t(), String.t(), String.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Rebuild an mosaiced image

## Arguments
  * input - Input image
  * old-str - Search for this string
  * new-str - And swap for this string

# `remosaic!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec remosaic!(Vix.Vips.Image.t(), String.t(), String.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Rebuild an mosaiced image

## Arguments
  * input - Input image
  * old-str - Search for this string
  * new-str - And swap for this string

# `replicate`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec replicate(Vix.Vips.Image.t(), integer(), integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Replicate an image

## Arguments
  * input - Input image
  * across - Repeat this many times horizontally
  * down - Repeat this many times vertically

# `replicate!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec replicate!(Vix.Vips.Image.t(), integer(), integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Replicate an image

## Arguments
  * input - Input image
  * across - Repeat this many times horizontally
  * down - Repeat this many times vertically

# `resize`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec resize(Vix.Vips.Image.t(), float(),
  vscale: float(),
  gap: float(),
  kernel: vips_kernel()
) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Resize an image

## Arguments
  * input - Input image argument
  * scale - Scale image by this factor

## Optional
* vscale - Vertical scale image by this factor. Default: `0.0`
* gap - Reducing gap. Default: `2.0`
* kernel - Resampling kernel. Default: `:VIPS_KERNEL_LANCZOS3`

# `resize!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec resize!(Vix.Vips.Image.t(), float(),
  vscale: float(),
  gap: float(),
  kernel: vips_kernel()
) ::
  Vix.Vips.Image.t() | no_return()
```

Resize an image

## Arguments
  * input - Input image argument
  * scale - Scale image by this factor

## Optional
* vscale - Vertical scale image by this factor. Default: `0.0`
* gap - Reducing gap. Default: `2.0`
* kernel - Resampling kernel. Default: `:VIPS_KERNEL_LANCZOS3`

# `rot45`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec rot45(Vix.Vips.Image.t(), [{:angle, vips_angle45()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Rotate an image

## Arguments
  * input - Input image

## Optional
* angle - Angle to rotate image. Default: `:VIPS_ANGLE45_D45`

# `rot45!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec rot45!(Vix.Vips.Image.t(), [{:angle, vips_angle45()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Rotate an image

## Arguments
  * input - Input image

## Optional
* angle - Angle to rotate image. Default: `:VIPS_ANGLE45_D45`

# `rot`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec rot(Vix.Vips.Image.t(), vips_angle()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Rotate an image

## Arguments
  * input - Input image
  * angle - Angle to rotate image

# `rot!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec rot!(Vix.Vips.Image.t(), vips_angle()) :: Vix.Vips.Image.t() | no_return()
```

Rotate an image

## Arguments
  * input - Input image
  * angle - Angle to rotate image

# `rotate`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec rotate(Vix.Vips.Image.t(), float(),
  idy: float(),
  idx: float(),
  ody: float(),
  odx: float(),
  background: [float()],
  interpolate: Vix.Vips.Interpolate.t()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Rotate an image by a number of degrees

## Arguments
  * input - Input image argument
  * angle - Rotate clockwise by this many degrees

## Optional
* idy - Vertical input displacement. Default: `0.0`
* idx - Horizontal input displacement. Default: `0.0`
* ody - Vertical output displacement. Default: `0.0`
* odx - Horizontal output displacement. Default: `0.0`
* background - Background value. Default: `nil`
* interpolate - Interpolate pixels with this. 

# `rotate!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec rotate!(Vix.Vips.Image.t(), float(),
  idy: float(),
  idx: float(),
  ody: float(),
  odx: float(),
  background: [float()],
  interpolate: Vix.Vips.Interpolate.t()
) :: Vix.Vips.Image.t() | no_return()
```

Rotate an image by a number of degrees

## Arguments
  * input - Input image argument
  * angle - Rotate clockwise by this many degrees

## Optional
* idy - Vertical input displacement. Default: `0.0`
* idx - Horizontal input displacement. Default: `0.0`
* ody - Vertical output displacement. Default: `0.0`
* odx - Horizontal output displacement. Default: `0.0`
* background - Background value. Default: `nil`
* interpolate - Interpolate pixels with this. 

# `round`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec round(Vix.Vips.Image.t(), vips_operation_round()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Perform a round function on an image

## Arguments
  * input - Input image
  * round - Rounding operation to perform

# `round!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec round!(Vix.Vips.Image.t(), vips_operation_round()) ::
  Vix.Vips.Image.t() | no_return()
```

Perform a round function on an image

## Arguments
  * input - Input image
  * round - Rounding operation to perform

# `scale`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec scale(Vix.Vips.Image.t(), log: boolean(), exp: float()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Scale an image to uchar

## Arguments
  * input - Input image

## Optional
* log - Log scale. Default: `false`
* exp - Exponent for log scale. Default: `0.25`

# `scale!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec scale!(Vix.Vips.Image.t(), log: boolean(), exp: float()) ::
  Vix.Vips.Image.t() | no_return()
```

Scale an image to uchar

## Arguments
  * input - Input image

## Optional
* log - Log scale. Default: `false`
* exp - Exponent for log scale. Default: `0.25`

# `scharr`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec scharr(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Scharr edge detector

## Arguments
  * input - Input image

# `scharr!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec scharr!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Scharr edge detector

## Arguments
  * input - Input image

# `scrgb2bw`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec scrgb2bw(Vix.Vips.Image.t(), [{:depth, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Convert scrgb to bw

## Arguments
  * input - Input image

## Optional
* depth - Output device space depth in bits. Default: `8`

# `scrgb2bw!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec scrgb2bw!(Vix.Vips.Image.t(), [{:depth, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Convert scrgb to bw

## Arguments
  * input - Input image

## Optional
* depth - Output device space depth in bits. Default: `8`

# `scrgb2srgb`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec scrgb2srgb(Vix.Vips.Image.t(), [{:depth, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Convert scrgb to srgb

## Arguments
  * input - Input image

## Optional
* depth - Output device space depth in bits. Default: `8`

# `scrgb2srgb!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec scrgb2srgb!(Vix.Vips.Image.t(), [{:depth, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Convert scrgb to srgb

## Arguments
  * input - Input image

## Optional
* depth - Output device space depth in bits. Default: `8`

# `scrgb2xyz`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec scrgb2xyz(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform scrgb to xyz

## Arguments
  * input - Input image

# `scrgb2xyz!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec scrgb2xyz!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform scrgb to xyz

## Arguments
  * input - Input image

# `sdf`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec sdf(integer(), integer(), vips_sdf_shape(),
  corners: [float()],
  b: [float()],
  a: [float()],
  r: float()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Create an sdf image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * shape - SDF shape to create

## Optional
* corners - Corner radii. Default: `nil`
* b - Point b. Default: `nil`
* a - Point a. Default: `nil`
* r - Radius. Default: `50.0`

# `sdf!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec sdf!(integer(), integer(), vips_sdf_shape(),
  corners: [float()],
  b: [float()],
  a: [float()],
  r: float()
) :: Vix.Vips.Image.t() | no_return()
```

Create an sdf image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels
  * shape - SDF shape to create

## Optional
* corners - Corner radii. Default: `nil`
* b - Point b. Default: `nil`
* a - Point a. Default: `nil`
* r - Radius. Default: `50.0`

# `sequential`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec sequential(Vix.Vips.Image.t(), [{:&quot;tile-height&quot;, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Check sequential access

## Arguments
  * input - Input image

## Optional
* tile-height - Tile height in pixels. Default: `1`

# `sequential!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec sequential!(Vix.Vips.Image.t(), [{:&quot;tile-height&quot;, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Check sequential access

## Arguments
  * input - Input image

## Optional
* tile-height - Tile height in pixels. Default: `1`

# `sharpen`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec sharpen(Vix.Vips.Image.t(),
  m2: float(),
  m1: float(),
  y3: float(),
  y2: float(),
  x1: float(),
  sigma: float()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Unsharp masking for print

## Arguments
  * input - Input image

## Optional
* m2 - Slope for jaggy areas. Default: `3.0`
* m1 - Slope for flat areas. Default: `0.0`
* y3 - Maximum darkening. Default: `20.0`
* y2 - Maximum brightening. Default: `10.0`
* x1 - Flat/jaggy threshold. Default: `2.0`
* sigma - Sigma of Gaussian. Default: `0.5`

# `sharpen!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec sharpen!(Vix.Vips.Image.t(),
  m2: float(),
  m1: float(),
  y3: float(),
  y2: float(),
  x1: float(),
  sigma: float()
) :: Vix.Vips.Image.t() | no_return()
```

Unsharp masking for print

## Arguments
  * input - Input image

## Optional
* m2 - Slope for jaggy areas. Default: `3.0`
* m1 - Slope for flat areas. Default: `0.0`
* y3 - Maximum darkening. Default: `20.0`
* y2 - Maximum brightening. Default: `10.0`
* x1 - Flat/jaggy threshold. Default: `2.0`
* sigma - Sigma of Gaussian. Default: `0.5`

# `shrink`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec shrink(Vix.Vips.Image.t(), float(), float(), [{:ceil, boolean()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Shrink an image

## Arguments
  * input - Input image argument
  * hshrink - Horizontal shrink factor
  * vshrink - Vertical shrink factor

## Optional
* ceil - Round-up output dimensions. Default: `false`

# `shrink!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec shrink!(Vix.Vips.Image.t(), float(), float(), [{:ceil, boolean()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Shrink an image

## Arguments
  * input - Input image argument
  * hshrink - Horizontal shrink factor
  * vshrink - Vertical shrink factor

## Optional
* ceil - Round-up output dimensions. Default: `false`

# `shrinkh`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec shrinkh(Vix.Vips.Image.t(), integer(), [{:ceil, boolean()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Shrink an image horizontally

## Arguments
  * input - Input image argument
  * hshrink - Horizontal shrink factor

## Optional
* ceil - Round-up output dimensions. Default: `false`

# `shrinkh!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec shrinkh!(Vix.Vips.Image.t(), integer(), [{:ceil, boolean()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Shrink an image horizontally

## Arguments
  * input - Input image argument
  * hshrink - Horizontal shrink factor

## Optional
* ceil - Round-up output dimensions. Default: `false`

# `shrinkv`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec shrinkv(Vix.Vips.Image.t(), integer(), [{:ceil, boolean()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Shrink an image vertically

## Arguments
  * input - Input image argument
  * vshrink - Vertical shrink factor

## Optional
* ceil - Round-up output dimensions. Default: `false`

# `shrinkv!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec shrinkv!(Vix.Vips.Image.t(), integer(), [{:ceil, boolean()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Shrink an image vertically

## Arguments
  * input - Input image argument
  * vshrink - Vertical shrink factor

## Optional
* ceil - Round-up output dimensions. Default: `false`

# `sign`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec sign(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Unit vector of pixel

## Arguments
  * input - Input image

# `sign!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec sign!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Unit vector of pixel

## Arguments
  * input - Input image

# `similarity`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec similarity(Vix.Vips.Image.t(),
  idy: float(),
  idx: float(),
  ody: float(),
  odx: float(),
  background: [float()],
  interpolate: Vix.Vips.Interpolate.t(),
  angle: float(),
  scale: float()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Similarity transform of an image

## Arguments
  * input - Input image argument

## Optional
* idy - Vertical input displacement. Default: `0.0`
* idx - Horizontal input displacement. Default: `0.0`
* ody - Vertical output displacement. Default: `0.0`
* odx - Horizontal output displacement. Default: `0.0`
* background - Background value. Default: `nil`
* interpolate - Interpolate pixels with this. 
* angle - Rotate clockwise by this many degrees. Default: `0.0`
* scale - Scale by this factor. Default: `1.0`

# `similarity!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec similarity!(Vix.Vips.Image.t(),
  idy: float(),
  idx: float(),
  ody: float(),
  odx: float(),
  background: [float()],
  interpolate: Vix.Vips.Interpolate.t(),
  angle: float(),
  scale: float()
) :: Vix.Vips.Image.t() | no_return()
```

Similarity transform of an image

## Arguments
  * input - Input image argument

## Optional
* idy - Vertical input displacement. Default: `0.0`
* idx - Horizontal input displacement. Default: `0.0`
* ody - Vertical output displacement. Default: `0.0`
* odx - Horizontal output displacement. Default: `0.0`
* background - Background value. Default: `nil`
* interpolate - Interpolate pixels with this. 
* angle - Rotate clockwise by this many degrees. Default: `0.0`
* scale - Scale by this factor. Default: `1.0`

# `sines`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec sines(integer(), integer(), vfreq: float(), hfreq: float(), uchar: boolean()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a 2d sine wave

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* vfreq - Vertical spatial frequency. Default: `0.5`
* hfreq - Horizontal spatial frequency. Default: `0.5`
* uchar - Output an unsigned char image. Default: `false`

# `sines!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec sines!(integer(), integer(), vfreq: float(), hfreq: float(), uchar: boolean()) ::
  Vix.Vips.Image.t() | no_return()
```

Make a 2d sine wave

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* vfreq - Vertical spatial frequency. Default: `0.5`
* hfreq - Horizontal spatial frequency. Default: `0.5`
* uchar - Output an unsigned char image. Default: `false`

# `smartcrop`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec smartcrop(Vix.Vips.Image.t(), integer(), integer(),
  premultiplied: boolean(),
  interesting: vips_interesting()
) ::
  {:ok,
   {Vix.Vips.Image.t(), %{&quot;attention-y&quot;: integer(), &quot;attention-x&quot;: integer()}}}
  | {:error, term()}
```

Extract an area from an image

## Arguments
  * input - Input image
  * width - Width of extract area
  * height - Height of extract area

## Optional
* premultiplied - Input image already has premultiplied alpha. Default: `false`
* interesting - How to measure interestingness. Default: `:VIPS_INTERESTING_ATTENTION`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* attention-y - Vertical position of attention centre. (`integer()`)
* attention-x - Horizontal position of attention centre. (`integer()`)

# `smartcrop!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec smartcrop!(Vix.Vips.Image.t(), integer(), integer(),
  premultiplied: boolean(),
  interesting: vips_interesting()
) ::
  {Vix.Vips.Image.t(), %{&quot;attention-y&quot;: integer(), &quot;attention-x&quot;: integer()}}
  | no_return()
```

Extract an area from an image

## Arguments
  * input - Input image
  * width - Width of extract area
  * height - Height of extract area

## Optional
* premultiplied - Input image already has premultiplied alpha. Default: `false`
* interesting - How to measure interestingness. Default: `:VIPS_INTERESTING_ATTENTION`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* attention-y - Vertical position of attention centre. (`integer()`)
* attention-x - Horizontal position of attention centre. (`integer()`)

# `sobel`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec sobel(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Sobel edge detector

## Arguments
  * input - Input image

# `sobel!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec sobel!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Sobel edge detector

## Arguments
  * input - Input image

# `spcor`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec spcor(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Spatial correlation

## Arguments
  * input - Input image argument
  * ref - Input reference image

# `spcor!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec spcor!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Spatial correlation

## Arguments
  * input - Input image argument
  * ref - Input reference image

# `spectrum`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec spectrum(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make displayable power spectrum

## Arguments
  * input - Input image

# `spectrum!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec spectrum!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Make displayable power spectrum

## Arguments
  * input - Input image

# `srgb2hsv`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec srgb2hsv(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform srgb to hsv

## Arguments
  * input - Input image

# `srgb2hsv!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec srgb2hsv!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform srgb to hsv

## Arguments
  * input - Input image

# `srgb2scrgb`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec srgb2scrgb(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Convert an srgb image to scrgb

## Arguments
  * input - Input image

# `srgb2scrgb!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec srgb2scrgb!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Convert an srgb image to scrgb

## Arguments
  * input - Input image

# `stats`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec stats(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Find many image stats

## Arguments
  * input - Input image

# `stats!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec stats!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Find many image stats

## Arguments
  * input - Input image

# `stdif`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec stdif(Vix.Vips.Image.t(), integer(), integer(),
  a: float(),
  m0: float(),
  b: float(),
  s0: float()
) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Statistical difference

## Arguments
  * input - Input image
  * width - Window width in pixels
  * height - Window height in pixels

## Optional
* a - Weight of new mean. Default: `0.5`
* m0 - New mean. Default: `128.0`
* b - Weight of new deviation. Default: `0.5`
* s0 - New deviation. Default: `50.0`

# `stdif!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec stdif!(Vix.Vips.Image.t(), integer(), integer(),
  a: float(),
  m0: float(),
  b: float(),
  s0: float()
) ::
  Vix.Vips.Image.t() | no_return()
```

Statistical difference

## Arguments
  * input - Input image
  * width - Window width in pixels
  * height - Window height in pixels

## Optional
* a - Weight of new mean. Default: `0.5`
* m0 - New mean. Default: `128.0`
* b - Weight of new deviation. Default: `0.5`
* s0 - New deviation. Default: `50.0`

# `subsample`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec subsample(Vix.Vips.Image.t(), integer(), integer(), [{:point, boolean()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Subsample an image

## Arguments
  * input - Input image
  * xfac - Horizontal subsample factor
  * yfac - Vertical subsample factor

## Optional
* point - Point sample. Default: `false`

# `subsample!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec subsample!(Vix.Vips.Image.t(), integer(), integer(), [{:point, boolean()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Subsample an image

## Arguments
  * input - Input image
  * xfac - Horizontal subsample factor
  * yfac - Vertical subsample factor

## Optional
* point - Point sample. Default: `false`

# `subtract`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec subtract(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Subtract two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `subtract!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec subtract!(Vix.Vips.Image.t(), Vix.Vips.Image.t()) ::
  Vix.Vips.Image.t() | no_return()
```

Subtract two images

## Arguments
  * left - Left-hand image argument
  * right - Right-hand image argument

# `sum`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec sum([Vix.Vips.Image.t()]) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Sum an array of images

## Arguments
  * input - Array of input images

# `sum!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec sum!([Vix.Vips.Image.t()]) :: Vix.Vips.Image.t() | no_return()
```

Sum an array of images

## Arguments
  * input - Array of input images

# `svgload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec svgload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  &quot;high-bitdepth&quot;: boolean(),
  stylesheet: String.t(),
  unlimited: boolean(),
  scale: float(),
  dpi: float()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load svg with rsvg

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* high-bitdepth - Enable scRGB 128-bit output (32-bit per channel). Default: `false`
* stylesheet - Custom CSS. Default: `nil`
* unlimited - Allow SVG of any size. Default: `false`
* scale - Scale output by this factor. Default: `1.0`
* dpi - Render at this DPI. Default: `72.0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `svgload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec svgload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  &quot;high-bitdepth&quot;: boolean(),
  stylesheet: String.t(),
  unlimited: boolean(),
  scale: float(),
  dpi: float()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load svg with rsvg

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* high-bitdepth - Enable scRGB 128-bit output (32-bit per channel). Default: `false`
* stylesheet - Custom CSS. Default: `nil`
* unlimited - Allow SVG of any size. Default: `false`
* scale - Scale output by this factor. Default: `1.0`
* dpi - Render at this DPI. Default: `72.0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `svgload_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec svgload_buffer(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  &quot;high-bitdepth&quot;: boolean(),
  stylesheet: String.t(),
  unlimited: boolean(),
  scale: float(),
  dpi: float()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load svg with rsvg

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* high-bitdepth - Enable scRGB 128-bit output (32-bit per channel). Default: `false`
* stylesheet - Custom CSS. Default: `nil`
* unlimited - Allow SVG of any size. Default: `false`
* scale - Scale output by this factor. Default: `1.0`
* dpi - Render at this DPI. Default: `72.0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `svgload_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec svgload_buffer!(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  &quot;high-bitdepth&quot;: boolean(),
  stylesheet: String.t(),
  unlimited: boolean(),
  scale: float(),
  dpi: float()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load svg with rsvg

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* high-bitdepth - Enable scRGB 128-bit output (32-bit per channel). Default: `false`
* stylesheet - Custom CSS. Default: `nil`
* unlimited - Allow SVG of any size. Default: `false`
* scale - Scale output by this factor. Default: `1.0`
* dpi - Render at this DPI. Default: `72.0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `switch`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec switch([Vix.Vips.Image.t()]) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Find the index of the first non-zero pixel in tests

## Arguments
  * tests - Table of images to test

# `switch!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec switch!([Vix.Vips.Image.t()]) :: Vix.Vips.Image.t() | no_return()
```

Find the index of the first non-zero pixel in tests

## Arguments
  * tests - Table of images to test

# `system`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec system(String.t(),
  &quot;in-format&quot;: String.t(),
  &quot;out-format&quot;: String.t(),
  in: [Vix.Vips.Image.t()]
) ::
  {:ok, {%{log: String.t(), out: Vix.Vips.Image.t()}}} | {:error, term()}
```

Run an external command

## Arguments
  * cmd-format - Command to run

## Optional
* in-format - Format for input filename. Default: `nil`
* out-format - Format for output filename. Default: `nil`
* in - Array of input images. Default: `nil`

## Returns
Operation returns a tuple

Last value of the tuple is a map of additional output values as key-value pair.
* log - Command log. (`String.t()`)
* out - Output image. (`Vix.Vips.Image.t()`)

# `system!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec system!(String.t(),
  &quot;in-format&quot;: String.t(),
  &quot;out-format&quot;: String.t(),
  in: [Vix.Vips.Image.t()]
) ::
  {%{log: String.t(), out: Vix.Vips.Image.t()}} | no_return()
```

Run an external command

## Arguments
  * cmd-format - Command to run

## Optional
* in-format - Format for input filename. Default: `nil`
* out-format - Format for output filename. Default: `nil`
* in - Array of input images. Default: `nil`

## Returns
Operation returns a tuple

Last value of the tuple is a map of additional output values as key-value pair.
* log - Command log. (`String.t()`)
* out - Output image. (`Vix.Vips.Image.t()`)

# `text`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec text(String.t(),
  wrap: vips_text_wrap(),
  rgba: boolean(),
  fontfile: String.t(),
  spacing: integer(),
  dpi: integer(),
  justify: boolean(),
  align: vips_align(),
  height: integer(),
  width: integer(),
  font: String.t()
) :: {:ok, {Vix.Vips.Image.t(), %{&quot;autofit-dpi&quot;: integer()}}} | {:error, term()}
```

Make a text image

## Arguments
  * text - Text to render

## Optional
* wrap - Wrap lines on word or character boundaries. Default: `:VIPS_TEXT_WRAP_WORD`
* rgba - Enable RGBA output. Default: `false`
* fontfile - Load this font file. Default: `nil`
* spacing - Line spacing. Default: `0`
* dpi - DPI to render at. Default: `72`
* justify - Justify lines. Default: `false`
* align - Align on the low, centre or high edge. Default: `:VIPS_ALIGN_LOW`
* height - Maximum image height in pixels. Default: `0`
* width - Maximum image width in pixels. Default: `0`
* font - Font to render with. Default: `nil`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* autofit-dpi - DPI selected by autofit. (`integer()`)

# `text!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec text!(String.t(),
  wrap: vips_text_wrap(),
  rgba: boolean(),
  fontfile: String.t(),
  spacing: integer(),
  dpi: integer(),
  justify: boolean(),
  align: vips_align(),
  height: integer(),
  width: integer(),
  font: String.t()
) :: {Vix.Vips.Image.t(), %{&quot;autofit-dpi&quot;: integer()}} | no_return()
```

Make a text image

## Arguments
  * text - Text to render

## Optional
* wrap - Wrap lines on word or character boundaries. Default: `:VIPS_TEXT_WRAP_WORD`
* rgba - Enable RGBA output. Default: `false`
* fontfile - Load this font file. Default: `nil`
* spacing - Line spacing. Default: `0`
* dpi - DPI to render at. Default: `72`
* justify - Justify lines. Default: `false`
* align - Align on the low, centre or high edge. Default: `:VIPS_ALIGN_LOW`
* height - Maximum image height in pixels. Default: `0`
* width - Maximum image width in pixels. Default: `0`
* font - Font to render with. Default: `nil`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* autofit-dpi - DPI selected by autofit. (`integer()`)

# `thumbnail`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec thumbnail(String.t(), integer(),
  &quot;fail-on&quot;: vips_fail_on(),
  intent: vips_intent(),
  &quot;output-profile&quot;: String.t(),
  &quot;input-profile&quot;: String.t(),
  linear: boolean(),
  crop: vips_interesting(),
  &quot;no-rotate&quot;: boolean(),
  size: vips_size(),
  height: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Generate thumbnail from file

## Arguments
  * filename - Filename to read from
  * width - Size to this width

## Optional
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* output-profile - Fallback output profile. Default: `nil`
* input-profile - Fallback input profile. Default: `nil`
* linear - Reduce in linear light. Default: `false`
* crop - Reduce to fill target rectangle, then crop. Default: `:VIPS_INTERESTING_NONE`
* no-rotate - Don't use orientation tags to rotate image upright. Default: `false`
* size - Only upsize, only downsize, or both. Default: `:VIPS_SIZE_BOTH`
* height - Size to this height. Default: `1`

# `thumbnail!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec thumbnail!(String.t(), integer(),
  &quot;fail-on&quot;: vips_fail_on(),
  intent: vips_intent(),
  &quot;output-profile&quot;: String.t(),
  &quot;input-profile&quot;: String.t(),
  linear: boolean(),
  crop: vips_interesting(),
  &quot;no-rotate&quot;: boolean(),
  size: vips_size(),
  height: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Generate thumbnail from file

## Arguments
  * filename - Filename to read from
  * width - Size to this width

## Optional
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* output-profile - Fallback output profile. Default: `nil`
* input-profile - Fallback input profile. Default: `nil`
* linear - Reduce in linear light. Default: `false`
* crop - Reduce to fill target rectangle, then crop. Default: `:VIPS_INTERESTING_NONE`
* no-rotate - Don't use orientation tags to rotate image upright. Default: `false`
* size - Only upsize, only downsize, or both. Default: `:VIPS_SIZE_BOTH`
* height - Size to this height. Default: `1`

# `thumbnail_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec thumbnail_buffer(binary(), integer(),
  &quot;fail-on&quot;: vips_fail_on(),
  intent: vips_intent(),
  &quot;output-profile&quot;: String.t(),
  &quot;input-profile&quot;: String.t(),
  linear: boolean(),
  crop: vips_interesting(),
  &quot;no-rotate&quot;: boolean(),
  size: vips_size(),
  height: integer(),
  &quot;option-string&quot;: String.t()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Generate thumbnail from buffer

## Arguments
  * buffer - Buffer to load from
  * width - Size to this width

## Optional
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* output-profile - Fallback output profile. Default: `nil`
* input-profile - Fallback input profile. Default: `nil`
* linear - Reduce in linear light. Default: `false`
* crop - Reduce to fill target rectangle, then crop. Default: `:VIPS_INTERESTING_NONE`
* no-rotate - Don't use orientation tags to rotate image upright. Default: `false`
* size - Only upsize, only downsize, or both. Default: `:VIPS_SIZE_BOTH`
* height - Size to this height. Default: `1`
* option-string - Options that are passed on to the underlying loader. Default: `""`

# `thumbnail_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec thumbnail_buffer!(binary(), integer(),
  &quot;fail-on&quot;: vips_fail_on(),
  intent: vips_intent(),
  &quot;output-profile&quot;: String.t(),
  &quot;input-profile&quot;: String.t(),
  linear: boolean(),
  crop: vips_interesting(),
  &quot;no-rotate&quot;: boolean(),
  size: vips_size(),
  height: integer(),
  &quot;option-string&quot;: String.t()
) :: Vix.Vips.Image.t() | no_return()
```

Generate thumbnail from buffer

## Arguments
  * buffer - Buffer to load from
  * width - Size to this width

## Optional
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* output-profile - Fallback output profile. Default: `nil`
* input-profile - Fallback input profile. Default: `nil`
* linear - Reduce in linear light. Default: `false`
* crop - Reduce to fill target rectangle, then crop. Default: `:VIPS_INTERESTING_NONE`
* no-rotate - Don't use orientation tags to rotate image upright. Default: `false`
* size - Only upsize, only downsize, or both. Default: `:VIPS_SIZE_BOTH`
* height - Size to this height. Default: `1`
* option-string - Options that are passed on to the underlying loader. Default: `""`

# `thumbnail_image`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec thumbnail_image(Vix.Vips.Image.t(), integer(),
  &quot;fail-on&quot;: vips_fail_on(),
  intent: vips_intent(),
  &quot;output-profile&quot;: String.t(),
  &quot;input-profile&quot;: String.t(),
  linear: boolean(),
  crop: vips_interesting(),
  &quot;no-rotate&quot;: boolean(),
  size: vips_size(),
  height: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Generate thumbnail from image

## Arguments
  * input - Input image argument
  * width - Size to this width

## Optional
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* output-profile - Fallback output profile. Default: `nil`
* input-profile - Fallback input profile. Default: `nil`
* linear - Reduce in linear light. Default: `false`
* crop - Reduce to fill target rectangle, then crop. Default: `:VIPS_INTERESTING_NONE`
* no-rotate - Don't use orientation tags to rotate image upright. Default: `false`
* size - Only upsize, only downsize, or both. Default: `:VIPS_SIZE_BOTH`
* height - Size to this height. Default: `1`

# `thumbnail_image!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec thumbnail_image!(Vix.Vips.Image.t(), integer(),
  &quot;fail-on&quot;: vips_fail_on(),
  intent: vips_intent(),
  &quot;output-profile&quot;: String.t(),
  &quot;input-profile&quot;: String.t(),
  linear: boolean(),
  crop: vips_interesting(),
  &quot;no-rotate&quot;: boolean(),
  size: vips_size(),
  height: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Generate thumbnail from image

## Arguments
  * input - Input image argument
  * width - Size to this width

## Optional
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* intent - Rendering intent. Default: `:VIPS_INTENT_RELATIVE`
* output-profile - Fallback output profile. Default: `nil`
* input-profile - Fallback input profile. Default: `nil`
* linear - Reduce in linear light. Default: `false`
* crop - Reduce to fill target rectangle, then crop. Default: `:VIPS_INTERESTING_NONE`
* no-rotate - Don't use orientation tags to rotate image upright. Default: `false`
* size - Only upsize, only downsize, or both. Default: `:VIPS_SIZE_BOTH`
* height - Size to this height. Default: `1`

# `tiffload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec tiffload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  subifd: integer(),
  autorotate: boolean(),
  n: integer(),
  page: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load tiff from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* subifd - Subifd index. Default: `-1`
* autorotate - Rotate image using orientation tag. Default: `false`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `tiffload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec tiffload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  subifd: integer(),
  autorotate: boolean(),
  n: integer(),
  page: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load tiff from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* subifd - Subifd index. Default: `-1`
* autorotate - Rotate image using orientation tag. Default: `false`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `tiffload_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec tiffload_buffer(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  subifd: integer(),
  autorotate: boolean(),
  n: integer(),
  page: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load tiff from buffer

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* subifd - Subifd index. Default: `-1`
* autorotate - Rotate image using orientation tag. Default: `false`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `tiffload_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec tiffload_buffer!(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  unlimited: boolean(),
  subifd: integer(),
  autorotate: boolean(),
  n: integer(),
  page: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load tiff from buffer

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* unlimited - Remove all denial of service limits. Default: `false`
* subifd - Subifd index. Default: `-1`
* autorotate - Rotate image using orientation tag. Default: `false`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `tiffsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec tiffsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  premultiply: boolean(),
  subifd: boolean(),
  depth: vips_foreign_dz_depth(),
  lossless: boolean(),
  level: integer(),
  &quot;region-shrink&quot;: vips_region_shrink(),
  properties: boolean(),
  bigtiff: boolean(),
  yres: float(),
  xres: float(),
  resunit: vips_foreign_tiff_resunit(),
  bitdepth: integer(),
  miniswhite: boolean(),
  pyramid: boolean(),
  &quot;tile-height&quot;: integer(),
  &quot;tile-width&quot;: integer(),
  tile: boolean(),
  predictor: vips_foreign_tiff_predictor(),
  Q: integer(),
  compression: vips_foreign_tiff_compression()
) :: :ok | {:error, term()}
```

Save image to tiff file

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* premultiply - Save with premultiplied alpha. Default: `false`
* subifd - Save pyr layers as sub-IFDs. Default: `false`
* depth - Pyramid depth. Default: `:VIPS_FOREIGN_DZ_DEPTH_ONETILE`
* lossless - Enable WEBP lossless mode. Default: `false`
* level - Deflate (1-9, default 6) or ZSTD (1-22, default 9) compression level. Default: `0`
* region-shrink - Method to shrink regions. Default: `:VIPS_REGION_SHRINK_MEAN`
* properties - Write a properties document to IMAGEDESCRIPTION. Default: `false`
* bigtiff - Write a bigtiff image. Default: `false`
* yres - Vertical resolution in pixels/mm. Default: `1.0`
* xres - Horizontal resolution in pixels/mm. Default: `1.0`
* resunit - Resolution unit. Default: `:VIPS_FOREIGN_TIFF_RESUNIT_CM`
* bitdepth - Write as a 1, 2, 4 or 8 bit image. Default: `0`
* miniswhite - Use 0 for white in 1-bit images. Default: `false`
* pyramid - Write a pyramidal tiff. Default: `false`
* tile-height - Tile height in pixels. Default: `128`
* tile-width - Tile width in pixels. Default: `128`
* tile - Write a tiled tiff. Default: `false`
* predictor - Compression prediction. Default: `:VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL`
* Q - Q factor. Default: `75`
* compression - Compression for this file. Default: `:VIPS_FOREIGN_TIFF_COMPRESSION_NONE`

# `tiffsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec tiffsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  premultiply: boolean(),
  subifd: boolean(),
  depth: vips_foreign_dz_depth(),
  lossless: boolean(),
  level: integer(),
  &quot;region-shrink&quot;: vips_region_shrink(),
  properties: boolean(),
  bigtiff: boolean(),
  yres: float(),
  xres: float(),
  resunit: vips_foreign_tiff_resunit(),
  bitdepth: integer(),
  miniswhite: boolean(),
  pyramid: boolean(),
  &quot;tile-height&quot;: integer(),
  &quot;tile-width&quot;: integer(),
  tile: boolean(),
  predictor: vips_foreign_tiff_predictor(),
  Q: integer(),
  compression: vips_foreign_tiff_compression()
) :: :ok | no_return()
```

Save image to tiff file

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* premultiply - Save with premultiplied alpha. Default: `false`
* subifd - Save pyr layers as sub-IFDs. Default: `false`
* depth - Pyramid depth. Default: `:VIPS_FOREIGN_DZ_DEPTH_ONETILE`
* lossless - Enable WEBP lossless mode. Default: `false`
* level - Deflate (1-9, default 6) or ZSTD (1-22, default 9) compression level. Default: `0`
* region-shrink - Method to shrink regions. Default: `:VIPS_REGION_SHRINK_MEAN`
* properties - Write a properties document to IMAGEDESCRIPTION. Default: `false`
* bigtiff - Write a bigtiff image. Default: `false`
* yres - Vertical resolution in pixels/mm. Default: `1.0`
* xres - Horizontal resolution in pixels/mm. Default: `1.0`
* resunit - Resolution unit. Default: `:VIPS_FOREIGN_TIFF_RESUNIT_CM`
* bitdepth - Write as a 1, 2, 4 or 8 bit image. Default: `0`
* miniswhite - Use 0 for white in 1-bit images. Default: `false`
* pyramid - Write a pyramidal tiff. Default: `false`
* tile-height - Tile height in pixels. Default: `128`
* tile-width - Tile width in pixels. Default: `128`
* tile - Write a tiled tiff. Default: `false`
* predictor - Compression prediction. Default: `:VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL`
* Q - Q factor. Default: `75`
* compression - Compression for this file. Default: `:VIPS_FOREIGN_TIFF_COMPRESSION_NONE`

# `tiffsave_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec tiffsave_buffer(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  premultiply: boolean(),
  subifd: boolean(),
  depth: vips_foreign_dz_depth(),
  lossless: boolean(),
  level: integer(),
  &quot;region-shrink&quot;: vips_region_shrink(),
  properties: boolean(),
  bigtiff: boolean(),
  yres: float(),
  xres: float(),
  resunit: vips_foreign_tiff_resunit(),
  bitdepth: integer(),
  miniswhite: boolean(),
  pyramid: boolean(),
  &quot;tile-height&quot;: integer(),
  &quot;tile-width&quot;: integer(),
  tile: boolean(),
  predictor: vips_foreign_tiff_predictor(),
  Q: integer(),
  compression: vips_foreign_tiff_compression()
) :: {:ok, binary()} | {:error, term()}
```

Save image to tiff buffer

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* premultiply - Save with premultiplied alpha. Default: `false`
* subifd - Save pyr layers as sub-IFDs. Default: `false`
* depth - Pyramid depth. Default: `:VIPS_FOREIGN_DZ_DEPTH_ONETILE`
* lossless - Enable WEBP lossless mode. Default: `false`
* level - Deflate (1-9, default 6) or ZSTD (1-22, default 9) compression level. Default: `0`
* region-shrink - Method to shrink regions. Default: `:VIPS_REGION_SHRINK_MEAN`
* properties - Write a properties document to IMAGEDESCRIPTION. Default: `false`
* bigtiff - Write a bigtiff image. Default: `false`
* yres - Vertical resolution in pixels/mm. Default: `1.0`
* xres - Horizontal resolution in pixels/mm. Default: `1.0`
* resunit - Resolution unit. Default: `:VIPS_FOREIGN_TIFF_RESUNIT_CM`
* bitdepth - Write as a 1, 2, 4 or 8 bit image. Default: `0`
* miniswhite - Use 0 for white in 1-bit images. Default: `false`
* pyramid - Write a pyramidal tiff. Default: `false`
* tile-height - Tile height in pixels. Default: `128`
* tile-width - Tile width in pixels. Default: `128`
* tile - Write a tiled tiff. Default: `false`
* predictor - Compression prediction. Default: `:VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL`
* Q - Q factor. Default: `75`
* compression - Compression for this file. Default: `:VIPS_FOREIGN_TIFF_COMPRESSION_NONE`

# `tiffsave_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec tiffsave_buffer!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  premultiply: boolean(),
  subifd: boolean(),
  depth: vips_foreign_dz_depth(),
  lossless: boolean(),
  level: integer(),
  &quot;region-shrink&quot;: vips_region_shrink(),
  properties: boolean(),
  bigtiff: boolean(),
  yres: float(),
  xres: float(),
  resunit: vips_foreign_tiff_resunit(),
  bitdepth: integer(),
  miniswhite: boolean(),
  pyramid: boolean(),
  &quot;tile-height&quot;: integer(),
  &quot;tile-width&quot;: integer(),
  tile: boolean(),
  predictor: vips_foreign_tiff_predictor(),
  Q: integer(),
  compression: vips_foreign_tiff_compression()
) :: binary() | no_return()
```

Save image to tiff buffer

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* premultiply - Save with premultiplied alpha. Default: `false`
* subifd - Save pyr layers as sub-IFDs. Default: `false`
* depth - Pyramid depth. Default: `:VIPS_FOREIGN_DZ_DEPTH_ONETILE`
* lossless - Enable WEBP lossless mode. Default: `false`
* level - Deflate (1-9, default 6) or ZSTD (1-22, default 9) compression level. Default: `0`
* region-shrink - Method to shrink regions. Default: `:VIPS_REGION_SHRINK_MEAN`
* properties - Write a properties document to IMAGEDESCRIPTION. Default: `false`
* bigtiff - Write a bigtiff image. Default: `false`
* yres - Vertical resolution in pixels/mm. Default: `1.0`
* xres - Horizontal resolution in pixels/mm. Default: `1.0`
* resunit - Resolution unit. Default: `:VIPS_FOREIGN_TIFF_RESUNIT_CM`
* bitdepth - Write as a 1, 2, 4 or 8 bit image. Default: `0`
* miniswhite - Use 0 for white in 1-bit images. Default: `false`
* pyramid - Write a pyramidal tiff. Default: `false`
* tile-height - Tile height in pixels. Default: `128`
* tile-width - Tile width in pixels. Default: `128`
* tile - Write a tiled tiff. Default: `false`
* predictor - Compression prediction. Default: `:VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL`
* Q - Q factor. Default: `75`
* compression - Compression for this file. Default: `:VIPS_FOREIGN_TIFF_COMPRESSION_NONE`

# `tilecache`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec tilecache(Vix.Vips.Image.t(),
  persistent: boolean(),
  threaded: boolean(),
  access: vips_access(),
  &quot;max-tiles&quot;: integer(),
  &quot;tile-height&quot;: integer(),
  &quot;tile-width&quot;: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Cache an image as a set of tiles

## Arguments
  * input - Input image

## Optional
* persistent - Keep cache between evaluations. Default: `false`
* threaded - Allow threaded access. Default: `false`
* access - Expected access pattern. Default: `:VIPS_ACCESS_RANDOM`
* max-tiles - Maximum number of tiles to cache. Default: `1000`
* tile-height - Tile height in pixels. Default: `128`
* tile-width - Tile width in pixels. Default: `128`

# `tilecache!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec tilecache!(Vix.Vips.Image.t(),
  persistent: boolean(),
  threaded: boolean(),
  access: vips_access(),
  &quot;max-tiles&quot;: integer(),
  &quot;tile-height&quot;: integer(),
  &quot;tile-width&quot;: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Cache an image as a set of tiles

## Arguments
  * input - Input image

## Optional
* persistent - Keep cache between evaluations. Default: `false`
* threaded - Allow threaded access. Default: `false`
* access - Expected access pattern. Default: `:VIPS_ACCESS_RANDOM`
* max-tiles - Maximum number of tiles to cache. Default: `1000`
* tile-height - Tile height in pixels. Default: `128`
* tile-width - Tile width in pixels. Default: `128`

# `tonelut`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec tonelut(
  H: float(),
  M: float(),
  S: float(),
  Ph: float(),
  Pm: float(),
  Ps: float(),
  Lw: float(),
  Lb: float(),
  &quot;out-max&quot;: integer(),
  &quot;in-max&quot;: integer()
) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Build a look-up table

## Arguments

## Optional
* H - Adjust highlights by this much. Default: `0.0`
* M - Adjust mid-tones by this much. Default: `0.0`
* S - Adjust shadows by this much. Default: `0.0`
* Ph - Position of highlights. Default: `0.8`
* Pm - Position of mid-tones. Default: `0.5`
* Ps - Position of shadow. Default: `0.2`
* Lw - Highest value in output. Default: `100.0`
* Lb - Lowest value in output. Default: `0.0`
* out-max - Maximum value in output LUT. Default: `32767`
* in-max - Size of LUT to build. Default: `32767`

# `tonelut!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec tonelut!(
  H: float(),
  M: float(),
  S: float(),
  Ph: float(),
  Pm: float(),
  Ps: float(),
  Lw: float(),
  Lb: float(),
  &quot;out-max&quot;: integer(),
  &quot;in-max&quot;: integer()
) :: Vix.Vips.Image.t() | no_return()
```

Build a look-up table

## Arguments

## Optional
* H - Adjust highlights by this much. Default: `0.0`
* M - Adjust mid-tones by this much. Default: `0.0`
* S - Adjust shadows by this much. Default: `0.0`
* Ph - Position of highlights. Default: `0.8`
* Pm - Position of mid-tones. Default: `0.5`
* Ps - Position of shadow. Default: `0.2`
* Lw - Highest value in output. Default: `100.0`
* Lb - Lowest value in output. Default: `0.0`
* out-max - Maximum value in output LUT. Default: `32767`
* in-max - Size of LUT to build. Default: `32767`

# `transpose3d`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec transpose3d(Vix.Vips.Image.t(), [{:&quot;page-height&quot;, integer()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transpose3d an image

## Arguments
  * input - Input image

## Optional
* page-height - Height of each input page. Default: `0`

# `transpose3d!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec transpose3d!(Vix.Vips.Image.t(), [{:&quot;page-height&quot;, integer()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Transpose3d an image

## Arguments
  * input - Input image

## Optional
* page-height - Height of each input page. Default: `0`

# `unpremultiply`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec unpremultiply(Vix.Vips.Image.t(), &quot;alpha-band&quot;: integer(), &quot;max-alpha&quot;: float()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Unpremultiply image alpha

## Arguments
  * input - Input image

## Optional
* alpha-band - Unpremultiply with this alpha. Default: `3`
* max-alpha - Maximum value of alpha channel. Default: `255.0`

# `unpremultiply!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec unpremultiply!(Vix.Vips.Image.t(),
  &quot;alpha-band&quot;: integer(),
  &quot;max-alpha&quot;: float()
) ::
  Vix.Vips.Image.t() | no_return()
```

Unpremultiply image alpha

## Arguments
  * input - Input image

## Optional
* alpha-band - Unpremultiply with this alpha. Default: `3`
* max-alpha - Maximum value of alpha channel. Default: `255.0`

# `vipsload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec vipsload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load vips from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `vipsload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec vipsload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load vips from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `vipssave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec vipssave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: :ok | {:error, term()}
```

Save image to file in vips format

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `vipssave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec vipssave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep()
) :: :ok | no_return()
```

Save image to file in vips format

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`

# `webpload`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec webpload(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  scale: float(),
  n: integer(),
  page: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load webp from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* scale - Factor to scale by. Default: `1.0`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `webpload!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec webpload!(String.t(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  scale: float(),
  n: integer(),
  page: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load webp from file

## Arguments
  * filename - Filename to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* scale - Factor to scale by. Default: `1.0`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `webpload_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec webpload_buffer(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  scale: float(),
  n: integer(),
  page: integer()
) ::
  {:ok, {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}}} | {:error, term()}
```

Load webp from buffer

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* scale - Factor to scale by. Default: `1.0`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `webpload_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec webpload_buffer!(binary(),
  revalidate: boolean(),
  &quot;fail-on&quot;: vips_fail_on(),
  access: vips_access(),
  memory: boolean(),
  scale: float(),
  n: integer(),
  page: integer()
) :: {Vix.Vips.Image.t(), %{flags: vips_foreign_flags()}} | no_return()
```

Load webp from buffer

## Arguments
  * buffer - Buffer to load from

## Optional
* revalidate - Don't use a cached result for this operation. Default: `false`
* fail-on - Error level to fail on. Default: `:VIPS_FAIL_ON_NONE`
* access - Required access pattern for this file. Default: `:VIPS_ACCESS_RANDOM`
* memory - Force open via memory. Default: `false`
* scale - Factor to scale by. Default: `1.0`
* n - Number of pages to load, -1 for all. Default: `1`
* page - First page to load. Default: `0`

## Returns
Operation returns a tuple

* out - Output image. (`Vix.Vips.Image.t()`)

Last value of the tuple is a map of additional output values as key-value pair.
* flags - Flags for this file. (`vips_foreign_flags`)

# `webpsave`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec webpsave(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  passes: integer(),
  &quot;smart-deblock&quot;: boolean(),
  mixed: boolean(),
  &quot;target-size&quot;: integer(),
  effort: integer(),
  kmax: integer(),
  kmin: integer(),
  &quot;min-size&quot;: boolean(),
  &quot;alpha-q&quot;: integer(),
  &quot;near-lossless&quot;: boolean(),
  &quot;smart-subsample&quot;: boolean(),
  preset: vips_foreign_webp_preset(),
  lossless: boolean(),
  Q: integer()
) :: :ok | {:error, term()}
```

Save as webp

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* passes - Number of entropy-analysis passes (in [1..10]). Default: `1`
* smart-deblock - Enable auto-adjusting of the deblocking filter. Default: `false`
* mixed - Allow mixed encoding (might reduce file size). Default: `false`
* target-size - Desired target size in bytes. Default: `0`
* effort - Level of CPU effort to reduce file size. Default: `4`
* kmax - Maximum number of frames between key frames. Default: `2147483647`
* kmin - Minimum number of frames between key frames. Default: `2147483646`
* min-size - Optimise for minimum size. Default: `false`
* alpha-q - Change alpha plane fidelity for lossy compression. Default: `100`
* near-lossless - Enable preprocessing in lossless mode (uses Q). Default: `false`
* smart-subsample - Enable high quality chroma subsampling. Default: `false`
* preset - Preset for lossy compression. Default: `:VIPS_FOREIGN_WEBP_PRESET_DEFAULT`
* lossless - Enable lossless compression. Default: `false`
* Q - Q factor. Default: `75`

# `webpsave!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec webpsave!(Vix.Vips.Image.t(), String.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  passes: integer(),
  &quot;smart-deblock&quot;: boolean(),
  mixed: boolean(),
  &quot;target-size&quot;: integer(),
  effort: integer(),
  kmax: integer(),
  kmin: integer(),
  &quot;min-size&quot;: boolean(),
  &quot;alpha-q&quot;: integer(),
  &quot;near-lossless&quot;: boolean(),
  &quot;smart-subsample&quot;: boolean(),
  preset: vips_foreign_webp_preset(),
  lossless: boolean(),
  Q: integer()
) :: :ok | no_return()
```

Save as webp

## Arguments
  * input - Image to save
  * filename - Filename to save to

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* passes - Number of entropy-analysis passes (in [1..10]). Default: `1`
* smart-deblock - Enable auto-adjusting of the deblocking filter. Default: `false`
* mixed - Allow mixed encoding (might reduce file size). Default: `false`
* target-size - Desired target size in bytes. Default: `0`
* effort - Level of CPU effort to reduce file size. Default: `4`
* kmax - Maximum number of frames between key frames. Default: `2147483647`
* kmin - Minimum number of frames between key frames. Default: `2147483646`
* min-size - Optimise for minimum size. Default: `false`
* alpha-q - Change alpha plane fidelity for lossy compression. Default: `100`
* near-lossless - Enable preprocessing in lossless mode (uses Q). Default: `false`
* smart-subsample - Enable high quality chroma subsampling. Default: `false`
* preset - Preset for lossy compression. Default: `:VIPS_FOREIGN_WEBP_PRESET_DEFAULT`
* lossless - Enable lossless compression. Default: `false`
* Q - Q factor. Default: `75`

# `webpsave_buffer`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec webpsave_buffer(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  passes: integer(),
  &quot;smart-deblock&quot;: boolean(),
  mixed: boolean(),
  &quot;target-size&quot;: integer(),
  effort: integer(),
  kmax: integer(),
  kmin: integer(),
  &quot;min-size&quot;: boolean(),
  &quot;alpha-q&quot;: integer(),
  &quot;near-lossless&quot;: boolean(),
  &quot;smart-subsample&quot;: boolean(),
  preset: vips_foreign_webp_preset(),
  lossless: boolean(),
  Q: integer()
) :: {:ok, binary()} | {:error, term()}
```

Save as webp

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* passes - Number of entropy-analysis passes (in [1..10]). Default: `1`
* smart-deblock - Enable auto-adjusting of the deblocking filter. Default: `false`
* mixed - Allow mixed encoding (might reduce file size). Default: `false`
* target-size - Desired target size in bytes. Default: `0`
* effort - Level of CPU effort to reduce file size. Default: `4`
* kmax - Maximum number of frames between key frames. Default: `2147483647`
* kmin - Minimum number of frames between key frames. Default: `2147483646`
* min-size - Optimise for minimum size. Default: `false`
* alpha-q - Change alpha plane fidelity for lossy compression. Default: `100`
* near-lossless - Enable preprocessing in lossless mode (uses Q). Default: `false`
* smart-subsample - Enable high quality chroma subsampling. Default: `false`
* preset - Preset for lossy compression. Default: `:VIPS_FOREIGN_WEBP_PRESET_DEFAULT`
* lossless - Enable lossless compression. Default: `false`
* Q - Q factor. Default: `75`

# `webpsave_buffer!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec webpsave_buffer!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  passes: integer(),
  &quot;smart-deblock&quot;: boolean(),
  mixed: boolean(),
  &quot;target-size&quot;: integer(),
  effort: integer(),
  kmax: integer(),
  kmin: integer(),
  &quot;min-size&quot;: boolean(),
  &quot;alpha-q&quot;: integer(),
  &quot;near-lossless&quot;: boolean(),
  &quot;smart-subsample&quot;: boolean(),
  preset: vips_foreign_webp_preset(),
  lossless: boolean(),
  Q: integer()
) :: binary() | no_return()
```

Save as webp

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* passes - Number of entropy-analysis passes (in [1..10]). Default: `1`
* smart-deblock - Enable auto-adjusting of the deblocking filter. Default: `false`
* mixed - Allow mixed encoding (might reduce file size). Default: `false`
* target-size - Desired target size in bytes. Default: `0`
* effort - Level of CPU effort to reduce file size. Default: `4`
* kmax - Maximum number of frames between key frames. Default: `2147483647`
* kmin - Minimum number of frames between key frames. Default: `2147483646`
* min-size - Optimise for minimum size. Default: `false`
* alpha-q - Change alpha plane fidelity for lossy compression. Default: `100`
* near-lossless - Enable preprocessing in lossless mode (uses Q). Default: `false`
* smart-subsample - Enable high quality chroma subsampling. Default: `false`
* preset - Preset for lossy compression. Default: `:VIPS_FOREIGN_WEBP_PRESET_DEFAULT`
* lossless - Enable lossless compression. Default: `false`
* Q - Q factor. Default: `75`

# `webpsave_mime`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec webpsave_mime(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  passes: integer(),
  &quot;smart-deblock&quot;: boolean(),
  mixed: boolean(),
  &quot;target-size&quot;: integer(),
  effort: integer(),
  kmax: integer(),
  kmin: integer(),
  &quot;min-size&quot;: boolean(),
  &quot;alpha-q&quot;: integer(),
  &quot;near-lossless&quot;: boolean(),
  &quot;smart-subsample&quot;: boolean(),
  preset: vips_foreign_webp_preset(),
  lossless: boolean(),
  Q: integer()
) :: :ok | {:error, term()}
```

Save image to webp mime

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* passes - Number of entropy-analysis passes (in [1..10]). Default: `1`
* smart-deblock - Enable auto-adjusting of the deblocking filter. Default: `false`
* mixed - Allow mixed encoding (might reduce file size). Default: `false`
* target-size - Desired target size in bytes. Default: `0`
* effort - Level of CPU effort to reduce file size. Default: `4`
* kmax - Maximum number of frames between key frames. Default: `2147483647`
* kmin - Minimum number of frames between key frames. Default: `2147483646`
* min-size - Optimise for minimum size. Default: `false`
* alpha-q - Change alpha plane fidelity for lossy compression. Default: `100`
* near-lossless - Enable preprocessing in lossless mode (uses Q). Default: `false`
* smart-subsample - Enable high quality chroma subsampling. Default: `false`
* preset - Preset for lossy compression. Default: `:VIPS_FOREIGN_WEBP_PRESET_DEFAULT`
* lossless - Enable lossless compression. Default: `false`
* Q - Q factor. Default: `75`

# `webpsave_mime!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec webpsave_mime!(Vix.Vips.Image.t(),
  profile: String.t(),
  &quot;page-height&quot;: integer(),
  background: [float()],
  keep: vips_foreign_keep(),
  passes: integer(),
  &quot;smart-deblock&quot;: boolean(),
  mixed: boolean(),
  &quot;target-size&quot;: integer(),
  effort: integer(),
  kmax: integer(),
  kmin: integer(),
  &quot;min-size&quot;: boolean(),
  &quot;alpha-q&quot;: integer(),
  &quot;near-lossless&quot;: boolean(),
  &quot;smart-subsample&quot;: boolean(),
  preset: vips_foreign_webp_preset(),
  lossless: boolean(),
  Q: integer()
) :: :ok | no_return()
```

Save image to webp mime

## Arguments
  * input - Image to save

## Optional
* profile - Filename of ICC profile to embed. Default: `nil`
* page-height - Set page height for multipage save. Default: `0`
* background - Background value. Default: `nil`
* keep - Which metadata to retain. Default: `[:VIPS_FOREIGN_KEEP_OTHER, :VIPS_FOREIGN_KEEP_ICC, :VIPS_FOREIGN_KEEP_IPTC, :VIPS_FOREIGN_KEEP_XMP, :VIPS_FOREIGN_KEEP_EXIF]`
* passes - Number of entropy-analysis passes (in [1..10]). Default: `1`
* smart-deblock - Enable auto-adjusting of the deblocking filter. Default: `false`
* mixed - Allow mixed encoding (might reduce file size). Default: `false`
* target-size - Desired target size in bytes. Default: `0`
* effort - Level of CPU effort to reduce file size. Default: `4`
* kmax - Maximum number of frames between key frames. Default: `2147483647`
* kmin - Minimum number of frames between key frames. Default: `2147483646`
* min-size - Optimise for minimum size. Default: `false`
* alpha-q - Change alpha plane fidelity for lossy compression. Default: `100`
* near-lossless - Enable preprocessing in lossless mode (uses Q). Default: `false`
* smart-subsample - Enable high quality chroma subsampling. Default: `false`
* preset - Preset for lossy compression. Default: `:VIPS_FOREIGN_WEBP_PRESET_DEFAULT`
* lossless - Enable lossless compression. Default: `false`
* Q - Q factor. Default: `75`

# `worley`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec worley(integer(), integer(), seed: integer(), &quot;cell-size&quot;: integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a worley noise image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* seed - Random number seed. Default: `0`
* cell-size - Size of Worley cells. Default: `256`

# `worley!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec worley!(integer(), integer(), seed: integer(), &quot;cell-size&quot;: integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Make a worley noise image

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* seed - Random number seed. Default: `0`
* cell-size - Size of Worley cells. Default: `256`

# `wrap`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec wrap(Vix.Vips.Image.t(), y: integer(), x: integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Wrap image origin

## Arguments
  * input - Input image

## Optional
* y - Top edge of input in output. Default: `0`
* x - Left edge of input in output. Default: `0`

# `wrap!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec wrap!(Vix.Vips.Image.t(), y: integer(), x: integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Wrap image origin

## Arguments
  * input - Input image

## Optional
* y - Top edge of input in output. Default: `0`
* x - Left edge of input in output. Default: `0`

# `xyz2cmyk`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec xyz2cmyk(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform xyz to cmyk

## Arguments
  * input - Input image

# `xyz2cmyk!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec xyz2cmyk!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform xyz to cmyk

## Arguments
  * input - Input image

# `xyz2lab`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec xyz2lab(Vix.Vips.Image.t(), [{:temp, [float()]}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform xyz to lab

## Arguments
  * input - Input image

## Optional
* temp - Colour temperature. Default: `nil`

# `xyz2lab!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec xyz2lab!(Vix.Vips.Image.t(), [{:temp, [float()]}]) ::
  Vix.Vips.Image.t() | no_return()
```

Transform xyz to lab

## Arguments
  * input - Input image

## Optional
* temp - Colour temperature. Default: `nil`

# `xyz2scrgb`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec xyz2scrgb(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform xyz to scrgb

## Arguments
  * input - Input image

# `xyz2scrgb!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec xyz2scrgb!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform xyz to scrgb

## Arguments
  * input - Input image

# `xyz2yxy`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec xyz2yxy(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform xyz to yxy

## Arguments
  * input - Input image

# `xyz2yxy!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec xyz2yxy!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform xyz to yxy

## Arguments
  * input - Input image

# `xyz`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec xyz(integer(), integer(), esize: integer(), dsize: integer(), csize: integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make an image where pixel values are coordinates

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* esize - Size of fifth dimension. Default: `1`
* dsize - Size of fourth dimension. Default: `1`
* csize - Size of third dimension. Default: `1`

# `xyz!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec xyz!(integer(), integer(), esize: integer(), dsize: integer(), csize: integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Make an image where pixel values are coordinates

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* esize - Size of fifth dimension. Default: `1`
* dsize - Size of fourth dimension. Default: `1`
* csize - Size of third dimension. Default: `1`

# `yxy2xyz`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec yxy2xyz(Vix.Vips.Image.t()) :: {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Transform yxy to xyz

## Arguments
  * input - Input image

# `yxy2xyz!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec yxy2xyz!(Vix.Vips.Image.t()) :: Vix.Vips.Image.t() | no_return()
```

Transform yxy to xyz

## Arguments
  * input - Input image

# `zone`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L141)

```elixir
@spec zone(integer(), integer(), [{:uchar, boolean()}]) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Make a zone plate

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* uchar - Output an unsigned char image. Default: `false`

# `zone!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L174)

```elixir
@spec zone!(integer(), integer(), [{:uchar, boolean()}]) ::
  Vix.Vips.Image.t() | no_return()
```

Make a zone plate

## Arguments
  * width - Image width in pixels
  * height - Image height in pixels

## Optional
* uchar - Output an unsigned char image. Default: `false`

# `zoom`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L136)

```elixir
@spec zoom(Vix.Vips.Image.t(), integer(), integer()) ::
  {:ok, Vix.Vips.Image.t()} | {:error, term()}
```

Zoom an image

## Arguments
  * input - Input image
  * xfac - Horizontal zoom factor
  * yfac - Vertical zoom factor

# `zoom!`
[🔗](https://github.com/akash-akya/vix/blob/v0.38.0/lib/vix/vips/operation.ex#L163)

```elixir
@spec zoom!(Vix.Vips.Image.t(), integer(), integer()) ::
  Vix.Vips.Image.t() | no_return()
```

Zoom an image

## Arguments
  * input - Input image
  * xfac - Horizontal zoom factor
  * yfac - Vertical zoom factor

---

*Consult [api-reference.md](api-reference.md) for complete listing*
