A fast image processing library with low memory needs.

Overview

libvips : an image processing library

CI Fuzzing Status Coverity Status Gitter

Introduction

libvips is a demand-driven, horizontally threaded image processing library. Compared to similar libraries, libvips runs quickly and uses little memory. libvips is licensed under the LGPL 2.1+.

It has around 300 operations covering arithmetic, histograms, convolution, morphological operations, frequency filtering, colour, resampling, statistics and others. It supports a large range of numeric types, from 8-bit int to 128-bit complex. Images can have any number of bands. It supports a good range of image formats, including JPEG, JPEG2000, TIFF, PNG, WebP, HEIC, AVIF, FITS, Matlab, OpenEXR, PDF, SVG, HDR, PPM / PGM / PFM, CSV, GIF, Analyze, NIfTI, DeepZoom, and OpenSlide. It can also load images via ImageMagick or GraphicsMagick, letting it work with formats like DICOM.

It comes with bindings for C, C++, and the command-line. Full bindings are available for Ruby, Python, PHP, C# / .NET, Go, and Lua. libvips is used as an image processing engine by sharp (on node.js), bimg, sharp for Go, Ruby on Rails, carrierwave-vips, mediawiki, PhotoFlow and others. The official libvips GUI is nip2, a strange combination of a spreadsheet and an photo editor.

Install

There are packages for most Unix-like operating systems, including macOS. Check your package manager.

There are binaries for Windows in releases.

The libvips website has detailed install notes.

Building libvips from a source tarball

We keep pre-baked tarballs in releases.

Untar, then in the libvips directory you should just be able to do:

./configure

Check the summary at the end of configure carefully. libvips must have build-essential, pkg-config, libglib2.0-dev, libexpat1-dev.

You'll need the dev packages for the file format support you want. For basic jpeg and tiff support, you'll need libtiff5-dev, libjpeg-turbo8-dev, and libgsf-1-dev. See the Dependencies section below for a full list of the things that libvips can be configured to use.

Once configure is looking OK, compile and install with the usual:

make
sudo make install

By default this will install files to /usr/local.

Testing

Run the test suite with:

make check

Run a specific test with:

pytest test/test-suite/test_foreign.py -k test_tiff

Building libvips from git

Clone the latest sources with:

git clone git://github.com/libvips/libvips.git

Building from git needs more packages -- you'll need at least gtk-doc and gobject-introspection, see the dependencies section below. For example:

brew install gtk-doc 

Then generate the build system with:

./autogen.sh --prefix=/home/john/vips

Debug build:

CFLAGS="-g -Wall" CXXFLAGS="-g -Wall" \
  ./configure --prefix=/home/john/vips --enable-debug
make
make install

Built-in loaders

libvips has a number of built-in loaders and savers. You can disable these if you wish, for example:

./configure --prefix=/Users/john/vips --without-nsgif --without-ppm

Dependencies

libvips has to have libglib2.0-dev and libexpat1-dev. Other dependencies are optional.

Optional dependencies

If suitable versions are found, libvips will add support for the following libraries automatically. See ./configure --help for a set of flags to control library detection. Packages are generally found with pkg-config, so make sure that is working.

Libraries like nifti do not use pkg-config so libvips will also look for them in the default path and in $prefix. If you have installed your own versions of these libraries in a different location, libvips will not see them. Use switches to libvips configure like:

./configure --prefix=/Users/john/vips \
  --with-nifti-includes=/opt/local/include \
  --with-nifti-libraries=/opt/local/lib 

or perhaps:

CFLAGS="-g -Wall -I/opt/local/include -L/opt/local/lib" \
  CXXFLAGS="-g -Wall -I/opt/local/include -L/opt/local/lib" \
  ./configure --prefix=/Users/john/vips 

libjpeg

The IJG JPEG library. Use the -turbo version if you can.

libexif

If available, libvips adds support for EXIF metadata in JPEG files.

librsvg

The usual SVG loader. If this is not present, vips will try to load SVGs via imagemagick instead.

PDFium

If present, libvips will attempt to load PDFs with PDFium. Download the prebuilt pdfium binary from:

https://github.com/bblanchon/pdfium-binaries

Untar to the libvips install prefix, for example:

cd ~/vips
tar xf ~/pdfium-linux.tgz

Create a pdfium.pc like this (update the version number):

VIPSHOME=/home/john/vips
cat > $VIPSHOME/lib/pkgconfig/pdfium.pc << EOF
     prefix=$VIPSHOME
     exec_prefix=\${prefix}
     libdir=\${exec_prefix}/lib
     includedir=\${prefix}/include
     Name: pdfium
     Description: pdfium
     Version: 4290
     Requires:
     Libs: -L\${libdir} -lpdfium
     Cflags: -I\${includedir}
EOF

If PDFium is not detected, libvips will look for poppler-glib instead.

poppler-glib

The Poppler PDF renderer, with a glib API. If this is not present, vips will try to load PDFs via imagemagick.

libgsf-1

If available, libvips adds support for creating image pyramids with dzsave.

libtiff

The TIFF library. It needs to be built with support for JPEG and ZIP compression. 3.4b037 and later are known to be OK.

fftw3

If libvips finds this library, it uses it for fourier transforms.

lcms2

If present, vips_icc_import(), vips_icc_export() and vips_icc_transform() can be used to manipulate images with ICC profiles.

libspng

If present, libvips will load PNG files using libspng. At the moment, libpng is still necessary for save.

libpng

If libspng is not present and libpng is, libvips will load PNG files with libpng. It will always save PNG files with libpng.

libimagequant

If present, libvips can write 8-bit palette-ised PNGs.

ImageMagick, or optionally GraphicsMagick

If available, libvips adds support for loading all libMagick-supported image file types. Use --with-magickpackage=GraphicsMagick to build against graphicsmagick instead.

Imagemagick 6.9+ needs to have been built with --with-modules. Most packaged IMs are, I think.

If you are going to be using libvips with untrusted images, perhaps in a web server, for example, you should consider the security implications of enabling a package with such a large attack surface.

pangoft2

If available, libvips adds support for text rendering. You need the package pangoft2 in pkg-config --list-all.

orc-0.4

If available, vips will accelerate some operations with this run-time compiler.

matio

If available, vips can load images from Matlab save files.

cfitsio

If available, vips can load FITS images.

libwebp

If available, vips can load and save WebP images.

libniftiio

If available, vips can load and save NIfTI images.

OpenEXR

If available, libvips will directly read (but not write, sadly) OpenEXR images.

OpenJPEG

If available, libvips will read and write JPEG2000 images.

OpenSlide

If available, libvips can load OpenSlide-supported virtual slide files: Aperio, Hamamatsu, Leica, MIRAX, Sakura, Trestle, and Ventana.

libheif

If available, libvips can load and save HEIC and AVIF images. Your libheif (in turn) needs to be built with the correct decoders and encoders. You can check with eg.:

$ pkg-config libheif --print-variables
builtin_avif_decoder
builtin_avif_encoder
builtin_h265_decoder
builtin_h265_encoder
exec_prefix
includedir
libdir
pcfiledir
prefix

Contributors

Code Contributors

This project exists thanks to all the people who contribute.

Organizations

Support this project with your organization. Your logo will show up here with a link to your website.

Comments
  • off by one problem when generating pyramidal tiff

    off by one problem when generating pyramidal tiff

    Original issue noted here: https://github.com/ruven/iipsrv/issues/98 but copied below since this is really a vips issue, not an IIP issue.

    I have confirmed that there is an ongoing resize bug in vips that is reproducible on the latest up-to-date RHEL6 and RHEL7 systems using either vips 7.x or the latest 8.4 version of vips. See the differences between the images below which were taken from the pyramidal tiff. The first was created using imagemagick and the second with vips 8.4.5 on RHEL7. Aside from being slower, we had found a few years back that IM creates intermittent corrupted ptifs that IIP can't open. I think the only option is to find the bug in vips or the library it's using and fix it - or switch to IM if the PTIF generation has been fixed since we last looked at it about 4 or 5 years ago. Any advice appreciated.

    One of the resolutions from an ImageMagick generated pyramidal tiff image image

    and same resolution from vips generated pyramidal tiff (note flatness on right side and bottom) image image

    command used to generate the ptif: vips im_vips2tiff ./source_tiff_file.tif vips_regen_8.4.5_rhel7.ptif:jpeg:90,tile:256x256,pyramid

    info about the original TIFF source: TIFF 11038x11038 11038x11038+0+0 8-bit DirectClass 365.5MB

    command used to generate the output above

    convert vips_regen_8.4.5_rhel7.ptif -quality 100 vips_regen_8.4.5_rhel7.jpg

    This produces one jpg for each of the 6 or 7 resolutions that vips generates in the ptif. All of the exported jpegs from a ptif generated by vips exhibit this problem whereas none of the exported jpgs generated with imagemagick do.

    bug in development 
    opened by beaudet 125
  • Tutorial for common image adjustments?

    Tutorial for common image adjustments?

    I'm new to libvips and want to perform common image corrections like the adjustment of white balance, hue, brightness or tonal range. Are there tutorials/documentations covering these adjustments? I'm also interested in applying filters like gaussian blur etc. with libvips

    enhancement 
    opened by fbuchinger 79
  • Join multiple images?

    Join multiple images?

    Hi i have a folder with these images: image_1.png, image_2.png, image_3.png. Its possible to join all this images togheter horizontaly? I found vips join, but that can only merge 2 images.

    In ImageMagick i would do: convert +append image_*.png output.png

    Thanks.

    question 
    opened by philipgiuliani 69
  • Final steps to 8.9.0

    Final steps to 8.9.0

    Let's get 8.9.0 out of the door now that streams are merged.

    This issue is for tracking the final checks before release.

    • [x] test win builds
    • [x] test macos
    • [x] write a "what's new" post
    • [x] test ruby-vips
    • [x] test pyvips
    • [x] test php-vips
    • [x] test lua-vips
    • [x] clear out PRs
    • [x] clear out bug issues
    • [x] add a thing to make old-style file and buffer loaders usable from the stream API
    • [x] benchmark
    • [x] out of order read in tiffload?
    • [x] decide: should we revert sharpen behaviour?
    • [x] update API docs

    @lovell and @kleisauke, do you have any things you'd like to add for 8.9?

    opened by jcupitt 67
  • conda installation

    conda installation

    Hello,

    I have seen this conda package for libvips: https://anaconda.org/zegami/libvips

    However, it has some limitations (e.g. openslide is not included).

    Is there anyone trying to build a conda package for libvips, and make it available either through conda-forge or bioconda?

    Best regards, Sebastian

    in development help wanted 
    opened by sebastian-luna-valero 64
  • Some newbie questions on how to do things with libvips

    Some newbie questions on how to do things with libvips

    Background: I have a Rust web server that do some image processing using OpenCV and I want to switch to libvips mostly because of performance.

    Lately I've been trying to write bindings for the libvips C library for rust and I'd like to start with the things I have to support in my application, which are decoding images from any known format, resizing, rotating, watermarking and encoding to jpeg or webp.

    I've been reading the docs and I've got a good idea on how the library works, but still got a couple doubts. Please bear in mind that I'm not a very experienced C programmer. I have some experience with C++, but still it's been almost 10 years since last time I used it.

    Here it goes:

    1. For the functions that take varargs options (the option named parameters), how do I specify them? Are them strings and should be specified like the options in the read from file options where you can just pass in the file name the options like this file.jpeg[shrink=2]? So should I specify a list with of option=value as strings (const *char)? Still about this options, how should I specify the ones that are enums?

    2. What are the types for the PNG options in the save function? https://libvips.github.io/libvips/API/current/VipsForeignSave.html#vips-pngsave Is there a place where I can find the defaults for the various options when encoding and decoding images?

    3. One of the features I have to support envolves removing the alpha channel of images when encoding to JPEG. I know it works out of the box, but I want a different behavior. The default way, it transform the transparent pixels to black, which makes sense, since 0 = transparent = black. How can I invert the alpha channel in a image with libvips to get the opposite result (the fully transparent pixels getting white instead of black)?

    4. About the error handling... How should I proceed? Should I have a background thread consuming and clearing the error buffer from time to time? If so how would it be a reasonable time to do it without degrading the performance of my application (because of the locks)...

    5. Still about error handling, if I call vips_error_freeze, the buffer will never be filled, meaning I never have to care clearing it, right?

    6. For watermarking I found out I should use the vips_composite2 function with the VIPS_BLEND_MODE_OVERLAY mode, but how can I set an opacity for the overlay image?

    Thank you in advance.

    opened by augustocdias 61
  • Process

    Process "Killed" using Python Vips8

    I run a program that stitches images together to an overview using merge() and join(), performs some operations on the overview image, and writes the resulting image to disk in form of a zoomify pyramid using dzsave().

    Individual images exists on disk as PNG files with a size of 3.5 to 6MB per file. The program works fine with small overviews, i.e. small number of images, but fails with a large number of images (about 10000 files).

    The program get's killed with exitcode 137 (128+9) after the stitching as soon as a function is applied to the resulting Vips.Image object.

    The error message is not very informative, it just says Killed.

    This is the tail of the DEBUG log output:

    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | _call_base self=<Image object at 0x7f1f0ea0dc80 (VipsImage at 0xe9e687e0)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning <Image object at 0x7f1f0ea0dc80 (VipsImage at 0xe9e687e0)> to in1
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | in1 needs a <GType VipsImage (33612672)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning <Image object at 0x7f1f0ea0dc80 (VipsImage at 0xe9e687e0)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning <Image object at 0x7f1f0fcc2eb0 (VipsImage at 0x2ee0ca0)> to in2
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | in2 needs a <GType VipsImage (33612672)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning <Image object at 0x7f1f0fcc2eb0 (VipsImage at 0x2ee0ca0)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning vertical to direction
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | direction needs a <GType VipsDirection (37071744)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning vertical
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | _call_base checking cache for op <__main__.VipsJoin object at 0x7f1f0ccaf3c0 (VipsJoin at 0xe9cc4e50)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | _call_base got op2 <__main__.VipsJoin object at 0x7f1f0ccaf3c0 (VipsJoin at 0xe9cc4e50)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | _call_base fetching required output args
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | read out <Image object at 0x7f1f0f1b88c0 (VipsImage at 0xe9fdaaf0)> from out
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | _call_base fetching optional output args
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | success
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | Image.__getattr__ percent
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | _call_base name=percent, required=(99.9,) optional={}
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | _call_base self=<Image object at 0x7f1f0f1b88c0 (VipsImage at 0xe9fdaaf0)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning <Image object at 0x7f1f0f1b88c0 (VipsImage at 0xe9fdaaf0)> to in
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | in needs a <GType VipsImage (33612672)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning <Image object at 0x7f1f0f1b88c0 (VipsImage at 0xe9fdaaf0)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning 99.9 to percent
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | percent needs a <GType gdouble (60)>
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | assigning 99.9
    2015-12-08 16:05:27 | gi.overrides.Vips              | DEBUG    | _call_base checking cache for op <__main__.VipsPercent object at 0x7f1f0f1b8910 (VipsPercent at 0xe9e6e980)>
    Killed
    

    The program was run on a machine with 32GB memory and 8 cores.

    The same error occurs when another function is called, e.g. scale() instead of percent().

    Here is a small test program that illustrates the actual program and might be helpful to reproduce the error:

    #! /usr/bin/env python
    import os
    import numpy as np
    import shutil
    import tempfile
    import itertools
    import logging
    import argparse
    from gi.repository import Vips
    
    
    def configure_logging():
        logger = logging.getLogger()
    
        fmt = '%(asctime)s | %(name)-30s | %(levelname)-8s | %(message)s'
        datefmt = '%Y-%m-%d %H:%M:%S'
        formatter = logging.Formatter(fmt=fmt, datefmt=datefmt)
    
        handler = logging.StreamHandler()
        handler.name = 'stream'
        handler.setFormatter(formatter)
        logger.addHandler(handler)
    
    
    if __name__ == '__main__':
    
        configure_logging()
    
        parser = argparse.ArgumentParser('Test program for Vips pyramid creation.')
        parser.add_argument('-v', '--verbosity', action='count', default=0,
                            help='increase logging verbosity')
        parser.add_argument('-m', '--mosaic_axis_length', default=2, type=int,
                            help='number of images along each dimension of a mosaic')
        parser.add_argument('-o', '--overview_axis_length', default=5, type=int,
                            help='number of mosaics along each dimension of the overview')
    
        tmp_dir = tempfile.gettempdir()
    
        args = parser.parse_args()
    
        logging_level_mapper = {
            0: logging.CRITICAL,
            1: logging.INFO,
            2: logging.DEBUG,
        }
    
        logger = logging.getLogger('test_vips_pyramid')
        logger.setLevel(logging_level_mapper[args.verbosity])
    
        vips_logger = logging.getLogger('gi.overrides.Vips')
        vips_logger.setLevel(logging_level_mapper[args.verbosity])
    
        # Create a squared "overview" image that is composed of many smaller squared
        # "mosaics", each of which is composed of several individual images.
        # NOTE: The size of the actual overview image is at least 0.5 * 10^6 pixels
        # along each dimension.
        mosaic_axis_length = args.mosaic_axis_length
        files = ['file_%d.png' % i for i in range(mosaic_axis_length**2)]
    
        overview_axis_length = args.overview_axis_length
        folder_names = ['directory_%d' % i for i in range(overview_axis_length**2)]
    
        input_dir = os.path.join(tmp_dir, 'vips_test', 'inputs')
        if not os.path.exists(input_dir):
            os.makedirs(input_dir)
    
        output_dir = os.path.join(tmp_dir, 'vips_test', 'outputs')
        if os.path.exists(output_dir):
            shutil.rmtree(output_dir)
    
        directories = [os.path.join(input_dir, f) for f in folder_names]
    
        # Create images on disk
        # NOTE: The actual images would already exist on disk
        logger.info('create images')
        for d in directories:
            if not os.path.exists(d):
                os.mkdir(d)
            for f in files:
                filename = os.path.join(input_dir, d, f)
                logger.debug('write image to file: %s', filename)
                img = Vips.Image.gaussnoise(100, 100)
               # NOTE: The actual dimensions are 2500 x 2600
                img.write_to_file(filename)
    
        logger.info('create mosaics')
        moasic_coordinates = list(itertools.product(
                                 range(mosaic_axis_length),
                                 range(mosaic_axis_length)))
        mosaics = list()
        for i, d in enumerate(directories):
            logger.debug('stitch mosaic # %d', i)
            # Build grid for the current mosaic
            mosaic_grid_dims = (mosaic_axis_length, mosaic_axis_length)
            mosaic_grid = np.empty(mosaic_grid_dims, dtype='O')
            for i, coords in enumerate(moasic_coordinates):
                filename = os.path.join(d, files[i])
                mosaic_grid[coords[0], coords[1]] = filename
    
            # Load individual images and stitch them together according to the grid layout
            for r in xrange(mosaic_grid.shape[0]):
                for c in xrange(mosaic_grid.shape[1]):
    
                    img = Vips.Image.new_from_file(mosaic_grid[r, c])
    
                    if c == 0:
                        row = img
                    else:
                        row = row.merge(img, 'horizontal', -img.width, 0)
    
                if r == 0:
                    mosaic = row
                else:
                    mosaic = mosaic.merge(row, 'vertical', 0, -img.height)
    
            mosaics.append(mosaic)
    
    
        logger.info('create overview')
        overview_coordinates = list(itertools.product(
                                  range(overview_axis_length),
                                  range(overview_axis_length)))
        # Build grid for the final overview image
        overview_grid_dims = (overview_axis_length, overview_axis_length)
        overiew_grid = np.empty(overview_grid_dims, dtype='O')
        for i, coords in enumerate(overview_coordinates):
            overiew_grid[coords[0], coords[1]] = mosaics[i]
    
        # Create spacer images, which will be inserted between individual mosaics
        img_dtype = img.get_format()
        col_spacer = Vips.Image.black(10, mosaic.height, bands=1).cast(img_dtype)
        row_width = (
            mosaic.width * overview_grid_dims[1] +
            10 * (overview_grid_dims[1] + 1)
        )
        row_spacer = Vips.Image.black(row_width, 10, bands=1).cast(img_dtype)
    
        # Stitch mosaics together according to the grid layout
        overview = row_spacer
        for r in xrange(overiew_grid.shape[0]):
            for c in xrange(overiew_grid.shape[1]):
    
                if c == 0:
                    row = col_spacer
    
                mosaic = overiew_grid[r, c]
                row = row.join(mosaic, 'horizontal')
                row = row.join(col_spacer, 'horizontal')
    
            overview = overview.join(row, 'vertical')
            overview = overview.join(row_spacer, 'vertical')
    
        # Clip intensity values
        logger.info('clip intensities')
        threshold = overview.percent(99.9)
        identity_image = Vips.Image.identity(ushort=True)
        condition_image = (identity_image >= threshold)
        lut = condition_image.ifthenelse(threshold, identity_image)
        overview = overview.maplut(lut)
    
        # Rescale to 8-bit
        logger.info('rescale intensities')
        overview = overview.scale()
    
        # Save as pyramid
        logger.info('create pyramid: %s', output_dir)
        overview.dzsave(output_dir, layout='zoomify')
    

    Run the program in DEBUG mode:

    test_vips_pyramid.py -vv
    

    Vips was installed from git (branch 8.1).

    I would like to include @riccardomurri and @smaffiol.

    enhancement in development 
    opened by hackermd 59
  • vips2png: Unable to write to target

    vips2png: Unable to write to target

    Hi, we get the error vips2png: unable to write to target when converting certain tiff files to png. This error is sporadic. Does this mean that it is unable to write to the file?

    Vips: 8.9.0 - Running inside alpine docker image Using bimg to talk to vips

    question 
    opened by revathi-murali 56
  • Ruby vips8 read then write image files loop crashes after n images

    Ruby vips8 read then write image files loop crashes after n images

    Hi John,

    I have run into what seems to be a bug in vips8 or the Ruby interface to it.

    I am processing large numbers of 2K tif video images: 2048 x 1556 pixels. For each image: Image file gets read. Modified in some way. Modified image file gets written to a new file.

    This was working OK with ruby-vips (vips7). I changed over to vips8 and the gir_ffi-vips interface. All was working OK when processing just a handful of files (testing). When I tried to ramp it up to hundreds of files, there was a crash after about 30 files.

    I have isolated this to a very simple example ruby script which just reads a series of numbered 2048 x 1556 pixel all-black tif images and writes each image out — all to the same output file — the error appears when reading a series of different files — writing to different output files or to the same output file makes no difference. This bombs on my system after 16 images. The error message trace back to Vips::Image.write_to_file is:

    GLib-GObject-CRITICAL **: g_value_type_compatible: assertion 'G_TYPE_IS_VALUE (src_type)' failed value.rb:158: in check_type_compatibility': Vips::Image is incompatible with VipsImage (ArgumentError) from /Library/Ruby/Gems/2.0.0/gems/gir_ffi-0.7.9/lib/ffi-gobject/value.rb:139:inset_instance_enhanced' from /Library/Ruby/Gems/2.0.0/gems/gir_ffi-0.7.9/lib/ffi-gobject/value.rb:53:in set_value' from /Library/Ruby/Gems/2.0.0/gems/gir_ffi-0.7.9/lib/ffi-gobject/object.rb:77:inset_property_with_override' from /Library/Ruby/Gems/2.0.0/gems/gir_ffi-vips-0.1.0/lib/vips8/argument.rb:130:in set_value' from /Library/Ruby/Gems/2.0.0/gems/gir_ffi-vips-0.1.0/lib/vips8/call.rb:73:incall_base' from /Library/Ruby/Gems/2.0.0/gems/gir_ffi-vips-0.1.0/lib/vips8/image.rb:384:in `write_to_file'

    Mostly this is the error I get. One time the error was an address error (a zero address).

    Here is the simple test script:

    require 'vips8'
    require 'pathname'
    
    image_folder = Pathname(__FILE__).dirname + "IMAGE_FOLDER"
    
    (1..50).each do |image_number|
    
      puts "Image #{image_number}"
    
      source_file_path = image_folder + "test-2K-image-#{sprintf('%02d', image_number)}.tif"
    
      test_image = Vips::Image.new_from_file (source_file_path).to_s
    
      test_image.write_to_file((image_folder + "output_image.tif").to_s)
    end
    

    The test files are named "test-2K-image-01", etc. I can't attach a sample file because GitHub doesn't support uploading tif files. Just create a test file in Photoshop then duplicate and number the duplicates.

    As I say, the ruby-vips equivalent code worked without a problem.

    Any ideas?

    Paul Howson

    bug in development 
    opened by PaulHowson 56
  • Better PDF support

    Better PDF support

    It would be great if libvips had a direct binding to a pdf library to allow efficient generation of eg. thumbnails from PDFs.

    vips currently can read pdfs via imagemagick or graphicksmagic, but both of these are very slow and memory inefficient at that.

    I think a good candidate could be libpoppler which has a cairo output device (Usage in pdftocairo utility).

    enhancement in development 
    opened by felixbuenemann 51
  • dzsave - -centre creates a huge differential in processing time

    dzsave - -centre creates a huge differential in processing time

    We're converting aperio .svs images directly to a google maps pyramid.

    In some basic tests, we're seeing a huge variance between running with and without centre.

    One of our smaller examples - a ~84 MB .svs:

    without

    ubuntu@Tortuga:/opt/Processing$ time vips dzsave 2 a --layout google --background black
    
    real     0m43.411s
    user 2m44.544s
    sys  0m42.400s
    

    with

    ubuntu@Tortuga:/opt/Processing$ time vips dzsave 2 b --layout google --background black --centre
    
    real     17m6.623s
    user 73m9.596s
    sys  17m53.780s
    

    Is this fairly par for the course? Is there anyway we can pre-process the image to optimize conversion?

    We have live samples that are 2 GB+ that are taking an hour without the flag, I'm not sure I want to see the difference at that rate. :)

    question bug 
    opened by kacecode 50
  • threadset: stop idle threads after a regular timeout

    threadset: stop idle threads after a regular timeout

    In line with the previous behaviour of GLib's threadpool, which would help in long-running processes. This PR is best reviewed per commit.

    Unfortunately, the added internal function (vips__semaphore_down_timed()) was based on vips_semaphore_downn(), so there are currently two copies of almost the same function. I don't think we can safely change vips_semaphore_downn() as that could be called with n > 1, which could conflict with the error code (-1) upon return.

    Also, deprecate vips_g_thread_join() in favor of g_thread_join() while we are here (commit 46aee63a4f43e6486867208f5e049f42541eccd7).

    Context: https://github.com/libvips/libvips/issues/3240#issuecomment-1367931803.

    Note: this PR targets the 8.14 branch.


    This branch was successfully deployed on the service associated with the weserv/images project.

    Details

    graph

    opened by kleisauke 0
  • The road to 8.14

    The road to 8.14

    We have 8.14.0-rc1 now, including win32 binaries:

    https://github.com/libvips/libvips/releases/tag/v8.14.0-rc1

    Website updated in this branch:

    https://github.com/libvips/libvips/tree/gh-pages-8.14

    Draft release notes here:

    https://github.com/libvips/libvips/blob/gh-pages-8.14/_posts/2022-12-22-What's-new-in-8.14.md

    TODO

    • [ ] there have been some minor doc fixes since rc1, we need to regen the C++ binding
    • [ ] and the website docs
    • [x] test downstream bindings ... pyvips and ruby-vips seem fine
    • [x] test sharp
    • [ ] test packaging for deb and rpm now that auto* has gone
    in progress 
    opened by jcupitt 13
  • should `g_warning` messages be internationalised?

    should `g_warning` messages be internationalised?

    At the moment, g_warning() messages are sometimes internationalised, and sometimes not. We should pick a policy and apply it to all of libvips.

    Suggestion: don't bother.

    enhancement 
    opened by jcupitt 0
  • heifload: AVIF decode fails with some images

    heifload: AVIF decode fails with some images

    Some AVIF images fail to be loaded with heifload. For instance: test.avif.zip

    Maybe related to https://github.com/libvips/libvips/issues/1808.

    $ vips copy test.avif out.jpg
    
    (vips:50621): VIPS-WARNING **: 15:14:52.085: heifload: ignoring nclx profile
    
    (vips:50621): VIPS-WARNING **: 15:14:52.087: heifload: ignoring nclx profile
    
    (vips:50621): VIPS-WARNING **: 15:14:52.088: error in tile 0 x 0
    
    (vips:50621): VIPS-WARNING **: 15:14:52.088: error in tile 0 x 1
    [..]
    test.avif: bad seek to 2133
    heifload: bad image dimensions on decode
    

    vipsheader says the dimensions are 296x196:

    $ vipsheader test.avif
    test.avif: 296x196 uchar, 3 bands, srgb, heifload
    

    However they should be 296x197 (dimensions of the original JPEG). The AVIF has been created with heif-enc (latest master + SVT-AV1 as encoder):

    $ heif-enc -A -e svt test.jpg
    

    test.jpg test.jpg

    libvips version: latest master

    bug 
    opened by dloebl 1
  • Retrieving tiff tags

    Retrieving tiff tags

    Hello :)

    Is there a way to read/write the TIFFTAG_SMINSAMPLEVALUE and TIFFTAG_SMAXSAMPLEVALUE tiff tag using libvips? (https://www.awaresystems.be/imaging/tiff/tifftags/sminsamplevalue.html)

    I can see that the wtiff_write_header in vips2tiff.c handles a few tiff tags but not all of them.

    Thanks for your help,

    Lionel

    enhancement 
    opened by LionelArn2 1
Releases(v8.14.0)
  • v8.14.0(Dec 30, 2022)

    Changes for this release:

    • expose location of interest when using attention based cropping [ejoebstl]
    • remove autotools
    • remove various obsolete scripts
    • remove benchmark
    • jp2ksave defaults to chroma subsample off, and jp2 write
    • don't minimise vips_sink_screen() input after expose ... improves caching during interactive use
    • require libjxl 0.6+
    • add interlace option to GIF save [dloebl]
    • magick load sets magick-format metadata [aksdb]
    • add .pnm save [ewelot]
    • threaded tiff jp2k and jpeg decompress
    • improve speed and efficiency of animated WebP write [dloebl]
    • add rgb mode to openslideload
    • new thread recycler
    • threadpools size dynamically with load
    • operations can hint threadpool size
    • faster dzsave
    • support for N-colour ICC profiles
    • add bash completions for vips
    • fits load and allows many more bands
    • fits write doesn't duplicate header fields
    • add wrap to vips_text()
    • GIF load supports truncated frames [tlsa]
    • EXIF support for PNG load and save
    • deprecate gifsave reoptimise, add reuse
    • add encoder to heifsave [dloebl]
    • add cplusplus meson build option [jcupitt]
    • make arrayjoin much faster with large arrays

    Windows builds will be here shortly:

    https://github.com/libvips/build-win64-mxe/releases/tag/v8.14.0

    Source code(tar.gz)
    Source code(zip)
    vips-8.14.0.tar.xz(17.78 MB)
    vips-8.14.0.tar.xz.sha256sum(85 bytes)
  • v8.14.0-rc1(Dec 22, 2022)

    This is test release of 8.14.

    Changes for this release:

    • expose location of interest when using attention based cropping [ejoebstl]
    • remove autotools
    • remove various obsolete scripts
    • remove benchmark
    • jp2ksave defaults to chroma subsample off, and jp2 write
    • don't minimise vips_sink_screen() input after expose ... improves caching during interactive use
    • require libjxl 0.6+
    • add interlace option to GIF save [dloebl]
    • magick load sets magick-format metadata [aksdb]
    • add .pnm save [ewelot]
    • threaded tiff jp2k and jpeg decompress
    • improve speed and efficiency of animated WebP write [dloebl]
    • add rgb mode to openslideload
    • new thread recycler
    • threadpools size dynamically with load
    • operations can hint threadpool size
    • faster dzsave
    • support for N-colour ICC profiles
    • add bash completions for vips
    • fits load and allows many more bands
    • fits write doesn't duplicate header fields
    • add wrap to vips_text()
    • GIF load supports truncated frames [tlsa]
    • EXIF support for PNG load and save
    • deprecate gifsave reoptimise, add reuse
    • add encoder to heifsave [dloebl]
    • add cplusplus meson build option [jcupitt]

    Windows builds:

    https://github.com/libvips/build-win64-mxe/releases/tag/v8.14.0-rc1

    Source code(tar.gz)
    Source code(zip)
    vips-8.14.0.tar.xz(17.79 MB)
    vips-8.14.0.tar.xz.sha256sum(85 bytes)
  • v8.13.3(Nov 1, 2022)

    A few bugfixes since 8.13.2:

    • improve rules for 16-bit heifsave [johntrunc]
    • improve libspng pallette write [kleisauke]
    • improve libspng pallette sort [DarthSim]
    • ensure EXIF has prefix before parsing [lovell]
    • fix low bit depth pallette spng save [DarthSim]
    • fix thumbnail of non-sRGB images with an export profile [kleisauke]

    Windows binaries here:

    https://github.com/libvips/build-win64-mxe/releases/tag/v8.13.3

    Source code(tar.gz)
    Source code(zip)
    vips-8.13.3.tar.gz(17.12 MB)
  • v8.13.2(Sep 29, 2022)

    A few bugfixes since 8.13.1:

    • in dzsave, add add missing include directive for errno/EEXIST [kleisauke]
    • fix 8 bit pallete PNG save [lovell]
    • fix null string in buffer print [pclewis]
    • revise caching of seq mode loaders [jcupitt]
    • reduce latency on dzsave kill [kleisauke]
    • improve text too large check [kleisauke]
    • fix subifd tiff writing for small images [ruven]
    • name ICC profiles in spngsave [lovell]

    Windows binaries here:

    https://github.com/libvips/build-win64-mxe/releases/tag/v8.13.2

    Source code(tar.gz)
    Source code(zip)
    vips-8.13.2.tar.gz(17.06 MB)
  • v8.13.1(Sep 3, 2022)

    A few bugfixes since 8.13.0:

    • fix im7 feature detection in meson
    • add a summary table at the end of configure in meson
    • fix libpng fallback when spng is disabled in meson
    • add "unlimited" to jpegload
    • better 0 detection in unpremultiply
    • fix low bitdepth spng save [jeffska]
    • fix PNG low bitdepth save of high bitdepth images
    • add support for libjxl 0.7 [kleisauke]
    • improve compatibility with older libgsf versions [kleisauke]

    Windows binaries here: https://github.com/libvips/build-win64-mxe/releases/tag/v8.13.1

    Source code(tar.gz)
    Source code(zip)
    vips-8.13.1.tar.gz(17.06 MB)
  • v8.13.0(Jul 21, 2022)

    Release notes here:

    https://www.libvips.org/2022/05/28/What's-new-in-8.13.html

    API docs here:

    https://www.libvips.org/API/8.13

    Windows binaries here:

    https://github.com/libvips/build-win64-mxe/releases/tag/v8.13.0

    Changes for this release:

    • configure fails for requested but unmet dependencies [remicollet]
    • add support for another quantiser [DarthSim]
    • add "extend", "background" and "premultiplied" to vips_mapim() to fix edge antialiasing [GavinJoyce]
    • add support for HDR HEIC and AVIF images
    • add vips_spngsave()
    • jpeg2000 load left-justifies bitdepth
    • add "password" option to pdfload, fix byte ordering of "background"
    • add vips_operation_block_set(), vips_block_untrusted_set()
    • improve the pixel rng
    • new meson build system [tintou]
    • improve introspection annotations [tintou]
    • add "unlimited" to heifload [lovell]
    • add support for regions in C++ API [shado23]
    • add "maxerror" to gifsave [dloebl]
    • update libnsgif API [tlsa]
    • deprecate "properties" option to dzsave (now always on)
    • add vips_dzsave_buffer()
    • always set the min stack size for pthreads, if we can
    • add "fail-on" to thumbnail
    • add "gap" option to vips_reducehv and vips_resize() [kleisauke]
    • add "ceil" option to vips_shrink() [kleisauke]
    • quality improvements for image resizing [kleisauke]
    • add vips_source_new_from_target()
    • add vips_target_seek(), vips_target_read(), vips_target_new_temp()
    • add vips_tiffsave_target()
    • add vips_target_end(), deprecate vips_target_finish()
    • add "mixed" to webpsave [dloebl]
    • add support for ICC profiles and linear encoding to JXL load and save [f1ac]
    • add "reoptimise" to gifsave [dloebl]
    • add "bitdepth" to magicksave [dloebl]
    Source code(tar.gz)
    Source code(zip)
    vips-8.13.0.tar.gz(17.06 MB)
  • v8.13.0-rc2(Jul 12, 2022)

  • v8.13.0-rc1(Jun 19, 2022)

    Release notes here:

    https://www.libvips.org/2022/05/28/What's-new-in-8.13.html

    API docs here:

    https://www.libvips.org/API/8.13/

    Please discuss this test release here:

    https://github.com/libvips/libvips/issues/2790

    Changes for this release:

    • configure fails for requested but unmet dependencies [remicollet]
    • add support for another quantiser [DarthSim]
    • add "extend", "background" and "premultiplied" to vips_mapim() to fix edge antialiasing [GavinJoyce]
    • add support for HDR HEIC and AVIF images
    • add vips_spngsave()
    • jpeg2000 load left-justifies bitdepth
    • add "password" option to pdfload, fix byte ordering of "background"
    • add vips_operation_block_set(), vips_block_untrusted_set()
    • improve the pixel rng
    • new meson build system [tintou]
    • improve introspection annotations [tintou]
    • add "unlimited" to heifload [lovell]
    • add support for regions in C++ API [shado23]
    • add "maxerror" to gifsave [dloebl]
    • update libnsgif API [tlsa]
    • deprecate "properties" option to dzsave (now always on)
    • add vips_dzsave_buffer()
    • always set the min stack size for pthreads, if we can
    • add "fail-on" to thumbnail
    • add "gap" option to vips_reducehv and vips_resize() [kleisauke]
    • add "ceil" option to vips_shrink() [kleisauke]
    • quality improvements for image resizing [kleisauke]
    • add vips_source_new_from_target()
    • add vips_target_seek(), vips_target_read(), vips_target_new_temp()
    • add vips_tiffsave_target()
    • add vips_target_end(), deprecate vips_target_finish()
    • add "mixed" to webpsave [dloebl]
    • add support for ICC profiles and linear encoding to JXL load and save [f1ac]
    • add "reoptimise" to gifsave [dloebl]
    • add "bitdepth" to magicksave [dloebl]
    Source code(tar.gz)
    Source code(zip)
    vips-8.13.0-rc1.tar.gz(17.04 MB)
  • v8.12.2(Jan 25, 2022)

    Changes since 8.12.1:

    • make exif resunit optional and default to inch
    • win: don't set create time on inappropriate file descriptors [lovell]
    • fall back to magicksave for gif if cgif is not present [erik-frontify]
    • fix a crash with 0 length vectors
    • change default frame delay for GIFs from 1s to 0.1s
    • remove stray trailing comma from iiif3 dirnames [whalehub]
    • fix TTF load [chregu]
    • revise GIF save alpha threshold [jfcalvo]
    • raise libpng pixel size limit from 1m to 10m pixels [jskrzypek]
    • fix gif save change detector [TheEssem]
    • fix load from pipe with variable size reads

    Windows binaries here: https://github.com/libvips/build-win64-mxe/releases/tag/v8.12.2

    Source code(tar.gz)
    Source code(zip)
    vips-8.12.2.tar.gz(16.99 MB)
  • v8.12.1(Nov 24, 2021)

  • v8.12.0(Nov 20, 2021)

    libvips 8.12.0

    Release notes are here:

    https://www.libvips.org/2021/11/14/What's-new-in-8.12.html

    Changes since 8.11:

    • add vips_svgload_string() convenience function
    • fix thumbnail with small image plus crop plus no upsize [Andrewsville]
    • rename speed / reduction-effort / etc. params as "effort"
    • add gifsave [lovell]
    • arrayjoin minimises inputs during sequential processing, saving a lot of memory and file descriptors
    • add vips_image_get_format_max()
    • flatten handles out of range alpha and max_alpha correctly
    • don't use atexit for cleanup, it's too unreliable
    • tiff writer loops for the whole image rather than per page [LionelArn2]
    • fix VipsSource with named pipes [vibbix]
    • added restart_interval option to jpegsave [manthey]
    • add IIIF3 support to dzsave [martimpassos]
    • add atan2 to math2 [indus]
    • improve buffer and target save file format selection
    • added VipsForeignPpmFormat, format arg to ppm savers
    • add fail-on to give better control over loader error sensitivity
    • add hyperbolic functions sinh, cosh, tanh, asinh, acosh, atanh [hroskes]
    • add untiled jp2k load
    • "insert" will minimise in seq mode
    • better EXIF string handling [lovell]

    Windows binaries are here:

    https://github.com/libvips/build-win64-mxe/releases/tag/v8.12.0

    Source code(tar.gz)
    Source code(zip)
    vips-8.12.0.tar.gz(16.99 MB)
  • v8.12.0-rc1(Nov 14, 2021)

    Test release for 8.12

    Changes since 8.11:

    • add vips_svgload_string() convenience function
    • fix thumbnail with small image plus crop plus no upsize [Andrewsville]
    • rename speed / reduction-effort / etc. params as "effort"
    • add gifsave [lovell]
    • arrayjoin minimises inputs during sequential processing, saving a lot of memory and file descriptors
    • add vips_image_get_format_max()
    • flatten handles out of range alpha and max_alpha correctly
    • don't use atexit for cleanup, it's too unreliable
    • tiff writer loops for the whole image rather than per page [LionelArn2]
    • fix VipsSource with named pipes [vibbix]
    • added restart_interval option to jpegsave [manthey]
    • add IIIF3 support to dzsave [martimpassos]
    • add atan2 to math2 [indus]
    • improve buffer and target save file format selection
    • added VipsForeignPpmFormat, format arg to ppm savers
    • add fail-on to give better control over loader error sensitivity
    • add hyperbolic functions sinh, cosh, tanh, asinh, acosh, atanh [hroskes]
    • add untiled jp2k load
    • "insert" will minimise in seq mode
    • better EXIF string handling [lovell]

    Windows binaries are here:

    https://github.com/libvips/build-win64-mxe/releases/tag/v8.12.0-rc1

    Source code(tar.gz)
    Source code(zip)
    vips-8.12.0-rc1.tar.gz(16.99 MB)
  • v8.11.4(Sep 23, 2021)

    Changes since 8.11.3:

    • fix off-by-one error in new rank fast path
    • add "unlimited" flag to png load [joshuamsager]
    • improve filtering of .v enums [lovell]
    • better logic to prevent shrink to nothing in thumbnail [kleisauke]

    Windows binaries are here: https://github.com/libvips/build-win64-mxe/releases/tag/v8.11.4

    Source code(tar.gz)
    Source code(zip)
    vips-8.11.4.tar.gz(16.95 MB)
  • v8.11.3(Aug 14, 2021)

  • v8.11.2(Jul 3, 2021)

    Changes since 8.11.1:

    • better libdir guessing [remi]
    • fix tiff pyramid creation with jp2k compression (was broken by 8.11.1, argh)
    • don't load modules if we're built without modules

    Windows binaries are here:

    https://github.com/libvips/build-win64-mxe/releases

    Source code(tar.gz)
    Source code(zip)
    vips-8.11.2.tar.gz(16.95 MB)
  • v8.11.1(Jun 29, 2021)

    Changes since 8.11.0:

    • add more example code to C docs
    • update libtool support in configure.ac
    • more startup info if VIPS_INFO is set
    • command-line programs set glib prgname (no longer set for you by VIPS_INIT)
    • enable strip chopping for TIFF read [DavidStorm]
    • disable modules by default for static builds [kleisauke]
    • fix jpeg tiff pyramid save

    Windows binaries are here:

    https://github.com/libvips/build-win64-mxe/releases

    Source code(tar.gz)
    Source code(zip)
    vips-8.11.1.tar.gz(16.95 MB)
  • v8.11.0(Jun 9, 2021)

    See this blog post for a summary of the new features in 8.11.

    Windows binaries are here:

    https://github.com/libvips/build-win64-mxe/releases/tag/v8.11.0

    The libvips Windows binary vips-dev-w64-all-x.y.z.zip contains ALL the file format loaders that libvips supports, including some very minor ones, and a complete copy of ImageMagick. It can process many different file types, but it is also rather vulnerable to hacking.

    The vips-dev-w64-web-x.y.z.zip build contains only file format loaders that have been carefully tested and which are commonly used on the web. It won't load formats like openslide (for example), but it should be safer to use with untrusted input.

    Changes since 8.10:

    • add vips_jpegload_source() and vips_svgload_source() to public C API
    • integrate doxygen in build system to generate C++ API docs
    • improve C++ API doc comments
    • add VipsInterpolate and guint64 support to C++ API
    • add VImage::new_from_memory_steal [Zeranoe]
    • vipsthumbnail supports stdin / stdout thumbnailing
    • have a lock just for pdfium [DarthSim]
    • get pdfium load building again [Projkt-James]
    • add _source load support for pdfium
    • add "seed" param to perlin, worley and gaussnoise
    • add vips_source_g_input_stream_new() to load images from a GInputStream
    • add openslideload_source(), vipsload_source(), vipssave_target()
    • add hist path to rank for large windows on uchar images
    • better 8/16-bit choice for pngsave
    • avoid NaN in mapim [afontenot]
    • hist_find outputs a double histogram for large images [erdmann]
    • fix ref leaks in mosaicing package
    • run libvips leak test in CI
    • add vips_fitsload_source(), vips_niftiload_source()
    • png and gif load note background colour as metadata [781545872]
    • add vips_image_[set|get]_array_double()
    • add GIF load with libnsgif
    • add jp2kload, jp2ksave
    • add jp2k compression to tiff load and save
    • add JPEG-XL load and save
    • add black_point_compensation flag for icc transforms
    • add "rgba" flag to vips_text() to enable full colour text rendering
    • move openslide, libheif, poppler and magick to loadable modules [kleisauke]
    • better detection of invalid ICC profiles, better fallback paths
    • add "premultiply" flag to tiffsave
    • new threading model has a singe threadpool shared by all pipelines [kleisauke]
    Source code(tar.gz)
    Source code(zip)
    vips-8.11.0.tar.gz(16.95 MB)
  • v8.11.0-rc1(Jun 4, 2021)

  • v8.10.6(Mar 23, 2021)

    Changes since 8.10.5:

    • don't seek on bad file descriptors [kleisauke]
    • check for null memory sources [kleisauke]
    • revise ppmload, fixing a couple of small bugs
    • signal error on EOF in jpegload more reliably [bozaro]
    • better error detection in spngload [randy408]
    • fix includes of glib headers in C++ [lovell]
    • fix build with more modern librsvg [lovell]
    • fix a possible segv with very wide images [f1ac]
    • fix issue thumbnailing RGBA images in linear mode [jjonesrs]
    • revise profile handling in vipsthumbnail
    • fix tiff deflate predictor setting [Adios]
    • fix vector path for composite on i386 [kleisauke]
    Source code(tar.gz)
    Source code(zip)
    vips-8.10.6.tar.gz(18.62 MB)
    vips-dev-w64-all-8.10.6.zip(32.62 MB)
    vips-dev-w64-web-8.10.6.zip(19.77 MB)
  • v8.10.6-beta(Mar 6, 2021)

    Changes since 8.10.5:

    • don't seek on bad file descriptors [kleisauke]
    • check for null memory sources [kleisauke]
    • revise ppmload, fixing a couple of small bugs
    • signal error on EOF in jpegload more reliably [bozaro]
    • better error detection in spngload [randy408]
    • fix includes of glib headers in C++ [lovell]
    • fix build with more modern librsvg [lovell]
    • fix a possible segv with very wide images [f1ac]
    • fix issue thumbnailing RGBA images in linear mode [jjonesrs]
    • revise profile handling in vipsthumbnail
    • fix tiff deflate predictor setting [Adios]
    Source code(tar.gz)
    Source code(zip)
    vips-8.10.6.tar.gz(18.62 MB)
    vips-dev-w64-all-8.10.6.zip(32.62 MB)
    vips-dev-w64-web-8.10.6.zip(19.77 MB)
  • v8.10.4(Dec 14, 2020)

    Changes since 8.10.2:

    • relax heic is_a rules [hisham]
    • fix vips7 webp load [barryspearce]
    • fix out of bounds exif read in heifload
    • fix out of bounds read in tiffload
    • fix tiffsave region shrink mode [imgifty]
    • add missing flushes on write to target [harukizaemon]
    • hide info messages you could get with some older glibs [kleisauke]
    • fix --no-strip on dzsave with icc-profiles [altert]
    • better GraphicsMagick image write [bfriesen]
    • add missing read loops to spng, heif, giflib and ppm load [kleisauke]
    • block zero width or height images from imagemagick load [Koen1999]
    • check for overflow in gifload height [lovell]
    • fix msb_first default in ppm load and save [ewelot]
    • force binary mode on win for connection read / write [Alreiber]
    • better testing for output to target [barryspearce]
    • ppmload_source was missing is_a [ewelot]
    • improve webpload rounding and blending behaviour [lovell]
    • fix range clip in int32 -> unsigned casts [ewelot]
    • fix precision error in clip of float -> int casts [ewelot]
    • fix load of HEIC images with 0 length metadata [ddennedy-gpsw]
    • fix spng detection
    Source code(tar.gz)
    Source code(zip)
    vips-8.10.4.tar.gz(18.61 MB)
    vips-dev-w64-all-8.10.4.zip(32.58 MB)
    vips-dev-w64-web-8.10.4.zip(19.73 MB)
  • v8.10.3(Dec 12, 2020)

    Changes since 8.10.2:

    • relax heic is_a rules [hisham]
    • fix vips7 webp load [barryspearce]
    • fix out of bounds exif read in heifload
    • fix out of bounds read in tiffload
    • fix tiffsave region shrink mode [imgifty]
    • add missing flushes on write to target [harukizaemon]
    • hide info messages you could get with some older glibs [kleisauke]
    • fix --no-strip on dzsave with icc-profiles [altert]
    • better GraphicsMagick image write [bfriesen]
    • add missing read loops to spng, heif, giflib and ppm load [kleisauke]
    • block zero width or height images from imagemagick load [Koen1999]
    • check for overflow in gifload height [lovell]
    • fix msb_first default in ppm load and save [ewelot]
    • force binary mode on win for connection read / write [Alreiber]
    • better testing for output to target [barryspearce]
    • ppmload_source was missing is_a [ewelot]
    • improve webpload rounding and blending behaviour [lovell]
    • fix range clip in int32 -> unsigned casts [ewelot]
    • fix precision error in clip of float -> int casts [ewelot]
    • fix load of HEIC images with 0 length metadata [ddennedy-gpsw]
    Source code(tar.gz)
    Source code(zip)
    vips-8.10.3.tar.gz(18.61 MB)
  • v8.10.2(Oct 12, 2020)

    Changes since 8.10.1:

    • update magicksave/load profile handling [kelilevi]
    • better demand hint rules [kaas3000]
    • fix tiff thumbnail from buffer and source [vansante]
    • in jpegsave, don't set JFIF resolution if we set EXIF resolution
    • bump minimum libheif version to 1.3 [lovell]
    • dzsave in iiif mode could set info.json dimensions off by one [Linden6]
    • pdfload allows dpi and scale to both be set [le0daniel]
    • allow gaussblur sigma zero, meaning no blur
    • better heif signature detection [lovell]
    • fix vips_fractsurf() typo [kleisauke]
    • better heif EOF detection [lovell]
    • fix gir build with g-o-i 1.66+ [László]
    • improve seek behaviour on pipes
    • add "speed" param to heifsave [lovell]
    • fix regression in C path for dilate / erode [kleisauke]
    • fix build with libheif save but no load [estepnv]
    Source code(tar.gz)
    Source code(zip)
    vips-8.10.2.tar.gz(18.61 MB)
    vips-dev-w64-all-8.10.2.zip(32.83 MB)
    vips-dev-w64-web-8.10.2.zip(20.12 MB)
  • v8.10.1(Sep 4, 2020)

    Changes since 8.10.0:

    • fix markdown -> xml conversion in doc generation
    • remove typedef redefinitions to please old gccs
    • fix regression in tiff pyramid thumbnailing [tand826]
    • stop 0-length buffer being passed to imagemagick [lovell]
    • convert no-profile CMYK to RGB on save [augustocdias]
    • ensure SVG loader skips input with chars outside x09-x7F range [lovell]
    • better mask sizing in gaussmat [johntrunc]
    • fix tiffsave "squash" handling [barryspearce]
    • fix jpegload autorotate [chregu]
    • only start the background render thread on first use
    Source code(tar.gz)
    Source code(zip)
    vips-8.10.1.tar.gz(18.59 MB)
    vips-dev-w64-all-8.10.1.zip(32.80 MB)
    vips-dev-w64-web-8.10.1.zip(20.09 MB)
  • v8.10.0(Aug 8, 2020)

    The libvips Windows binary vips-dev-w64-all-x.y.z.zip contains ALL the file format loaders that libvips supports, including some very minor ones, and a complete copy of ImageMagick. It can process many different file types, but it is also rather vulnerable to hacking.

    The vips-dev-w64-web-x.y.z.zip build contains only file format loaders that have been carefully tested and which are commonly used on the web. It won't load formats like openslide (for example), but it should be safer to use with untrusted input.

    See this blog post for a summary of the new features in 8.10.

    Changes since 8.9:

    • more conformal IIIF output from dzsave [regisrob]
    • add id to dzsave to set IIIF id property [regisrob]
    • add max and min to region shrink [rgluskin]
    • allow \ as an escape character in vips_break_token() [akemrir]
    • tiffsave has a "depth" param to set max pyr depth
    • libtiff LOGLUV images load and save as libvips XYZ
    • add gifload_source, csvload_source, csvsave_target, matrixload_source, matrixsave_source, pdfload_source, heifload_source, heifsave_target, ppmload_source, ppmsave_target
    • revise vipsthumbnail flags
    • add VIPS_LEAK env var
    • add vips_pipe_read_limit_set(), --vips-pipe-read-limit, VIPS_PIPE_READ_LIMIT
    • revise gifload to fix BACKGROUND and PREVIOUS dispose [alon-ne]
    • add subsample_mode, deprecate no_subsample in jpegsave [Elad-Laufer]
    • add vips_isdirf()
    • add PAGENUMBER support to tiff write [jclavoie-jive]
    • add all mode to smartcrop
    • flood fill could stop half-way for some very complex shapes
    • better handling of unaligned reads in multipage tiffs [petoor]
    • mark old --delete option to vipsthumbnail as deprecated [UweOhse]
    • png save with a bad ICC profile just gives a warning
    • add premultipled option to vips_affine(), clarified vips_resize() behaviour with alpha channels
    • improve bioformats compatibility with read and write of tiff subifd pyramids
    • thumbnail exploits subifd pyramids
    • handle all EXIF orientation cases, deprecate vips_autorot_get_angle() [Elad-Laufer]
    • load PNGs with libspng, if possible
    • deprecate heifload autorotate -- it's now always on
    • revised resize improves accuracy [kleisauke]
    • add --vips-config flag to show configuration info
    • add bitdepth param to tiff save, deprecate squash [MathemanFlo]
    • tiff load and save now supports 2 and 4 bit data [MathemanFlo]
    • pngsave bitdepth parameter lets you write 1, 2 and 4 bit PNGs
    • ppmsave also uses bitdepth now, for consistency
    • reduce operation cache max to 100
    • rework the final bits of vips7 for vips8 [kleisauke]
    • --disable-deprecated now works [kleisauke]
    • vipsheader allows stdin as a filename
    • gifload allows gifs with images outside the canvas
    • wasm compatibility patches [kleisauke]
    • webpsave has a @profile param
    Source code(tar.gz)
    Source code(zip)
    vips-8.10.0.tar.gz(18.60 MB)
    vips-dev-w64-all-8.10.0.zip(32.81 MB)
    vips-dev-w64-web-8.10.0.zip(20.10 MB)
  • v8.10.0-beta2(Jul 10, 2020)

Owner
libvips
A fast image processing library with low memory needs.
libvips
Writing our own printf function, this is a project done under ALX Low Level Programming.

0x11. C - printf Writing our own printf function, this is a project done under ALX Low Level Programming. Resource secrets of printf Implementing prin

Ephantus Mwangi 4 Oct 26, 2022
Make a directory to an ESP disk image

espack Make a directory to an ESP disk image. 把目录整体打包成一个 ESP 分区的磁盘镜像。 usage Download the released zip file from (here), for example espack-1.0.zip and

longpanda 16 Sep 12, 2022
A docker image where you can run a judge program and a converter for multiple sequence alignment

genocon2021-docker 本リポジトリでは、ジャッジプログラム(eval.c)と Multiple Sequence Alignment (MSA) 変換プログラム(decode_cigar.py)を同梱した Docker イメージを提供しています。 また、サンプル解答プログラム(sam

Sakamoto, Kazunori 4 Sep 20, 2021
Sqrt OS is a simulation of an OS scheduler and memory manager using different scheduling algorithms including Highest Priority First (non-preemptive), Shortest Remaining Time Next, and Round Robin.

A CPU scheduler determines an order for the execution of its scheduled processes; it decides which process will run according to a certain data structure that keeps track of the processes in the system and their status. A process, upon creation, has one of the three states: Running, Ready, Blocked (doing I/O, using other resources than CPU or waiting on unavailable resource).

Abdallah Hemdan 18 Apr 15, 2022
Remote Download and Memory Execute for shellcode framework

RmExecute Remote Download and Memory Execute for shellcode framework 远程下载并内存加载的ShellCode框架,暂不支持X64 参(抄)考(袭)项目 windows下shellcode提取模板的实现 主要抄袭来源,直接使用这位大佬

null 52 Dec 25, 2022
PoC memory injection detection agent based on ETW, for offensive and defensive research purposes

TiEtwAgent - ETW-based process injection detection This project was created to research, build and test different memory injection detection use cases

Filip Olszak 188 Dec 26, 2022
Scans all running processes. Recognizes and dumps a variety of potentially malicious implants (replaced/implanted PEs, shellcodes, hooks, in-memory patches).

Scans all running processes. Recognizes and dumps a variety of potentially malicious implants (replaced/implanted PEs, shellcodes, hooks, in-memory patches).

hasherezade 1.5k Jan 4, 2023
Bytehound - a memory profiler for Linux

Bytehound - a memory profiler for Linux Features Can be used to analyze memory leaks, see where exactly the memory is being consumed, identify tempora

Koute 3.3k Jan 4, 2023
A fast character conversion and transliteration library based on the scheme defined for Japan National Tax Agency (国税庁) 's corporate number (法人番号) system.

jntajis-python Documentation: https://jntajis-python.readthedocs.io/ What's JNTAJIS-python? JNTAJIS-python is a transliteration library, specifically

Open Collector, Inc. 15 Nov 12, 2022
fast javascript bundler :package:

Fast JavaScript Bundler https://fjbundler.com What? It is what it says it is. However, this bundler aims to be a monolithic does-it-all type of bundle

Sebastian Karlsson 103 Oct 27, 2022
Fast comparison-based sort algorithm

nanosort Algorithm nanosort aims to be a fast comparison-based sorting algorithm, tuned for POD types of reasonably small sizes. nanosort implements a

Arseny Kapoulkine 40 Dec 29, 2022
A fast phone number lib for Ruby (binds to Google's C++ libphonenumber)

MiniPhone A Ruby gem which plugs directly into Google's native C++ libphonenumber for extremely fast and robust phone number parsing, validation, and

Ian Ker-Seymer 148 Dec 28, 2022
Tau is a fast syntax highlighter capable of emitting HTML.

tau - a reasonably fast (wip) syntax highlighter. Tau is a fast syntax highlighter capable of emitting HTML. It highlights the following languages: py

Palaiologos 12 Nov 16, 2022
Very fast Markdown parser and HTML generator implemented in WebAssembly, based on md4c

Very fast Markdown parser and HTML generator implemented in WebAssembly, based on md4c

Rasmus 1.3k Dec 24, 2022
The goal of insidesp is to do fast point in polygon classification, the sp way.

insidesp The goal of insidesp is to do fast point in polygon classification, the sp way. We are comparing a few ways of implementing this, essentially

diminutive 2 Nov 12, 2021
Fast regular expression grep for source code with incremental index updates

Fast regular expression grep for source code with incremental index updates

Arseny Kapoulkine 261 Dec 28, 2022
Isocline is a pure C library that can be used as an alternative to the GNU readline library

Isocline: a portable readline alternative. Isocline is a pure C library that can be used as an alternative to the GNU readline library (latest release

Daan 136 Dec 30, 2022
A linux library to get the file path of the currently running shared library. Emulates use of Win32 GetModuleHandleEx/GetModuleFilename.

whereami A linux library to get the file path of the currently running shared library. Emulates use of Win32 GetModuleHandleEx/GetModuleFilename. usag

Blackle Morisanchetto 3 Sep 24, 2022
Command-line arguments parsing library.

argparse argparse - A command line arguments parsing library in C (compatible with C++). Description This module is inspired by parse-options.c (git)

Yecheng Fu 533 Dec 26, 2022