Convert Figma logo to code with AI

davidbyttow logogovips

A lightning fast image processing and resizing library for Go

1,246
196
1,246
45

Top Related Projects

9,518

A fast image processing library with low memory needs.

Fast, simple, scalable, Docker-ready HTTP microservice for high-level image processing

Fast and secure standalone server for resizing and converting remote images

10,017

thumbor is an open-source photo thumbnail service by globo.com

A caching, resizing image proxy written in Go

2,092

An image resizing server written in Go

Quick Overview

govips is a Go binding for libvips, a fast image processing library. It provides a high-performance, thread-safe image processing solution for Go applications, allowing developers to efficiently manipulate images with minimal memory usage.

Pros

  • High performance and low memory usage
  • Thread-safe operations for concurrent image processing
  • Supports a wide range of image formats and operations
  • Easy-to-use API for Go developers

Cons

  • Requires libvips to be installed on the system
  • Limited documentation compared to some other image processing libraries
  • May have a steeper learning curve for developers unfamiliar with libvips

Code Examples

  1. Resizing an image:
import "github.com/davidbyttow/govips/v2/vips"

func resizeImage(inputPath, outputPath string) error {
    image, err := vips.NewImageFromFile(inputPath)
    if err != nil {
        return err
    }
    defer image.Close()

    err = image.Resize(0.5, vips.KernelAuto)
    if err != nil {
        return err
    }

    return image.ExportJpeg(outputPath, vips.NewJpegExportParams())
}
  1. Applying a blur effect:
import "github.com/davidbyttow/govips/v2/vips"

func blurImage(inputPath, outputPath string) error {
    image, err := vips.NewImageFromFile(inputPath)
    if err != nil {
        return err
    }
    defer image.Close()

    err = image.Gaussblur(5.0)
    if err != nil {
        return err
    }

    return image.ExportPng(outputPath, vips.NewPngExportParams())
}
  1. Converting image format:
import "github.com/davidbyttow/govips/v2/vips"

func convertToPNG(inputPath, outputPath string) error {
    image, err := vips.NewImageFromFile(inputPath)
    if err != nil {
        return err
    }
    defer image.Close()

    return image.ExportPng(outputPath, vips.NewPngExportParams())
}

Getting Started

To use govips in your Go project, follow these steps:

  1. Install libvips on your system (refer to the project's README for installation instructions).
  2. Add govips to your Go module:
    go get github.com/davidbyttow/govips/v2
    
  3. Import and use govips in your Go code:
    import "github.com/davidbyttow/govips/v2/vips"
    
    func main() {
        vips.Startup(nil)
        defer vips.Shutdown()
    
        // Your image processing code here
    }
    

Remember to call vips.Startup() before using any govips functions and vips.Shutdown() when you're done to properly initialize and clean up resources.

Competitor Comparisons

9,518

A fast image processing library with low memory needs.

Pros of libvips

  • Written in C, offering potentially better performance for low-level image processing operations
  • More extensive feature set and broader image format support
  • Longer development history and larger community, potentially leading to better stability and support

Cons of libvips

  • Requires C knowledge for direct usage or contribution
  • More complex setup and integration compared to a Go-native solution
  • Potential overhead when used with Go due to CGo bindings

Code Comparison

libvips (C):

VipsImage *in, *out;
vips_jpegload("input.jpg", &in, NULL);
vips_resize(in, &out, 0.5, NULL);
vips_jpegsave(out, "output.jpg", NULL);

govips (Go):

image, _ := vips.NewImageFromFile("input.jpg")
image.Resize(0.5, vips.KernelAuto)
image.WriteToFile("output.jpg")

Summary

libvips is a powerful, mature C library for image processing, offering extensive features and potentially better performance. govips provides a Go-native wrapper around libvips, simplifying usage for Go developers but potentially introducing some overhead. The choice between them depends on specific project requirements, language preferences, and performance needs.

Fast, simple, scalable, Docker-ready HTTP microservice for high-level image processing

Pros of Imaginary

  • Provides a complete HTTP microservice for image processing
  • Supports a wide range of image operations and transformations
  • Offers Docker support for easy deployment and scaling

Cons of Imaginary

  • Larger codebase and potentially more complex setup
  • May have higher resource requirements due to its microservice architecture

Code Comparison

Imaginary (HTTP handler):

func ImageHandler(o ServerOptions, fn func(*ImageOptions, http.ResponseWriter) error) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        if r.Method != "GET" && r.Method != "POST" {
            ErrorReply(w, ErrUnsupportedMethod, o)
            return
        }
        // ... (additional code)
    }
}

Govips (image processing):

func Resize(image *C.VipsImage, scale float64, kernel Kernel) (*C.VipsImage, error) {
    var out *C.VipsImage
    err := C.vips_resize_bridge(image, &out, C.double(scale), C.int(kernel))
    return out, handleImageError(err)
}

Imaginary provides a full-featured HTTP microservice for image processing, while Govips focuses on providing Go bindings for the libvips image processing library. Imaginary offers more out-of-the-box functionality and easier deployment, but may have higher resource requirements. Govips provides lower-level access to image processing functions, allowing for more fine-grained control and potentially better performance in specific use cases.

Fast and secure standalone server for resizing and converting remote images

Pros of imgproxy

  • Ready-to-use image processing server with a wide range of features
  • Supports multiple image formats and processing operations out of the box
  • Designed for high performance and scalability in production environments

Cons of imgproxy

  • Less flexible for custom image processing workflows
  • Requires running as a separate service, which may increase infrastructure complexity
  • Limited to predefined image processing operations

Code Comparison

imgproxy (configuration example):

IMGPROXY_BIND=:8080
IMGPROXY_LOCAL_FILESYSTEM_ROOT=/mnt/images
IMGPROXY_USE_ETAG=true
IMGPROXY_QUALITY=80
IMGPROXY_MAX_SRC_RESOLUTION=50

govips (Go code example):

import "github.com/davidbyttow/govips/v2/vips"

image, err := vips.NewImageFromBuffer(buffer)
err = image.Resize(0.5, vips.KernelAuto)
buffer, err = image.WriteToBuffer(".jpg", vips.NewJpegExportParams())

govips is a Go library for image processing using libvips, offering more flexibility for custom image processing workflows. It's suitable for embedding within Go applications but requires more development effort. imgproxy, on the other hand, is a standalone image processing server that's easier to deploy and use out of the box, but with less customization options.

10,017

thumbor is an open-source photo thumbnail service by globo.com

Pros of Thumbor

  • Written in Python, making it accessible to a wider range of developers
  • Extensive feature set, including face detection and smart cropping
  • Large and active community with frequent updates and contributions

Cons of Thumbor

  • Generally slower performance compared to Go-based solutions
  • Higher resource consumption, especially for memory-intensive operations
  • More complex setup and configuration process

Code Comparison

Thumbor (Python):

from thumbor.handlers.imaging import ImagingHandler

class MyHandler(ImagingHandler):
    def get(self):
        # Custom image processing logic
        super(MyHandler, self).get()

Govips (Go):

import "github.com/davidbyttow/govips/v2/vips"

func processImage(buffer []byte) ([]byte, error) {
    image, err := vips.NewImageFromBuffer(buffer)
    // Custom image processing logic
    return image.ExportJpeg(vips.NewJpegExportParams())
}

Summary

Thumbor offers a feature-rich solution with a large community, making it suitable for projects requiring advanced image processing capabilities. Govips, on the other hand, provides better performance and resource efficiency, making it ideal for high-throughput applications. The choice between the two depends on specific project requirements, development team expertise, and performance needs.

A caching, resizing image proxy written in Go

Pros of imageproxy

  • Designed specifically as an image proxy server, offering more specialized features for this use case
  • Supports a wider range of image transformations and manipulations out-of-the-box
  • Includes caching mechanisms for improved performance in high-traffic scenarios

Cons of imageproxy

  • Less flexible for general-purpose image processing tasks outside of proxy use cases
  • May have higher resource usage due to its comprehensive feature set
  • Written in Go, which might be less familiar to some developers compared to C-based libraries

Code Comparison

imageproxy:

func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/favicon.ico" {
        http.Error(w, "404 Not Found", http.StatusNotFound)
        return
    }
    // ... (additional code)
}

govips:

func Resize(image *C.VipsImage, scale float64) (*C.VipsImage, error) {
    var out *C.VipsImage
    err := C.vips_resize_bridge(image, &out, C.double(scale))
    return out, handleImageError(err)
}

Both projects serve different purposes: imageproxy is a full-fledged image proxy server, while govips is a low-level binding to the libvips image processing library. The choice between them depends on specific project requirements and use cases.

2,092

An image resizing server written in Go

Pros of picfit

  • More comprehensive image processing solution with built-in HTTP server and caching
  • Supports multiple storage backends (e.g., S3, Google Cloud Storage)
  • Offers a wider range of image manipulation operations out-of-the-box

Cons of picfit

  • Less actively maintained (last commit over 2 years ago)
  • Fewer stars and contributors on GitHub
  • More complex setup and configuration compared to govips

Code Comparison

picfit (main.go):

engine := picfit.NewEngine()
engine.AddProcessor(processor.NewImageProcessor())
engine.AddStorage(storage.NewFileSystemStorage("/path/to/images"))
server := http.NewServer(engine)
server.Run(":8080")

govips (example.go):

image, err := vips.NewImageFromBuffer(buffer)
err = image.Resize(0.5, vips.KernelAuto)
buffer, err = image.ExportJpeg(vips.NewJpegExportParams())

Both libraries offer image processing capabilities, but picfit provides a more complete solution with an HTTP server and storage options, while govips focuses on low-level image operations with high performance.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

govips

GoDoc Go Report Card GitHub release (latest SemVer) License Build Status Coverage Status

A lightning fast image processing and resizing library for Go

This package wraps the core functionality of libvips image processing library by exposing all image operations on first-class types in Go.

Libvips is generally 4-8x faster than other graphics processors such as GraphicsMagick and ImageMagick. Check the benchmark: Speed and Memory Use

The intent for this is to enable developers to build extremely fast image processors in Go, which is suited well for concurrent requests.

Requirements

  • libvips 8.10+
  • C compatible compiler such as gcc 4.6+ or clang 3.0+
  • Go 1.16+

Dependencies

MacOS

Use homebrew to install vips and pkg-config:

brew install vips pkg-config

Windows

The recommended approach on Windows is to use Govips via WSL and Ubuntu.

If you need to run Govips natively on Windows, it's not difficult but will require some effort. We don't have a recommended environment or setup at the moment. Windows is also not in our list of CI/CD targets so Govips is not regularly tested for compatibility. If you would be willing to setup and maintain a robust CI/CD Windows environment, please open a PR, we would be pleased to accept your contribution and support Windows as a platform.

Installation

go get -u github.com/davidbyttow/govips/v2/vips

MacOS note

On MacOS, govips may not compile without first setting an environment variable:

export CGO_CFLAGS_ALLOW="-Xpreprocessor"

Example usage

package main

import (
	"fmt"
	"os"

	"github.com/davidbyttow/govips/v2/vips"
)

func checkError(err error) {
	if err != nil {
		fmt.Println("error:", err)
		os.Exit(1)
	}
}

func main() {
	vips.Startup(nil)
	defer vips.Shutdown()

	image1, err := vips.NewImageFromFile("input.jpg")
	checkError(err)

	// Rotate the picture upright and reset EXIF orientation tag
	err = image1.AutoRotate()
	checkError(err)

	ep := vips.NewDefaultJPEGExportParams()
	image1bytes, _, err := image1.Export(ep)
	err = os.WriteFile("output.jpg", image1bytes, 0644)
	checkError(err)

}

See examples/ folder for more examples.

Running tests

$ make test

Memory usage note

MALLOC_ARENA_MAX

libvips uses GLib for memory management, and it brings GLib memory fragmentation issues to heavily multi-threaded programs. First thing you can try if you noticed constantly growing RSS usage without Go's sys memory growth is set MALLOC_ARENA_MAX:

MALLOC_ARENA_MAX=2 application

This will reduce GLib memory appetites by reducing the number of malloc arenas that it can create. By default GLib creates one are per thread, and this would follow to memory fragmentation.

Contributing

Feel free to file issues or create pull requests. See this guide on contributing for more information.

Credits

Thanks to:

License

MIT