Nim bindings for the libvips image processing library.
libvips is a fast image processing library with low memory needs.
nimble install libvips
This package wraps the core functionality of libvips image processing library by exposing all image operations on first-class types in Nim language.
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 Nim language, which is suited well for concurrent requests.
import libvips/api
initVips:
let img = openImage("input.jpg")
img.resize(0.5).sharpen().save("output.jpg")import libvips/api
initVips:
let thumb = thumbnailFromFile("input.jpg", 300)
thumb.save("thumb.jpg")Thumbnails can also be created from buffers:
import libvips/api
initVips:
let bytes = readFile("photo.jpg")
let thumb = thumbnailFromBuffer(bytes, 300)
thumb.save("thumb.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
let result = img.rotate(90).crop(100, 100, 400, 400).blur(2.0).invert()
result.save("processed.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
img.smartCrop(300, 300).save("smart.jpg")
img.smartCrop(300, 300, VIPS_INTERESTING_ENTROPY).save("entropy.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
img.gravityCrop(400, 400, VIPS_COMPASS_DIRECTION_NORTH).save("north.jpg")
img.gravityCrop(400, 400, VIPS_COMPASS_DIRECTION_SOUTH_EAST).save("se.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
img.toGrayscale().save("grey.jpg")
img.toCMYK().save("cmyk.tif")
img.toLAB().save("lab.tif")
img.toHSV().save("hsv.tif")import libvips/api
initVips:
let base = openImage("background.jpg")
let overlay = openImage("overlay.png")
base.blendOver(overlay).save("over.jpg")
base.blendMultiply(overlay).save("multiply.jpg")
base.blendScreen(overlay).save("screen.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
let threshold = img.bandMean()
let bright = img.linear1(1.2, 0)
let dark = img.linear1(0.8, 0)
let result = threshold.ifThenElse(bright, dark)
result.save("adjusted.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
# Convert to grayscale using perceptual weights
let grey = img.recomb([
[0.299, 0.587, 0.114],
[0.299, 0.587, 0.114],
[0.299, 0.587, 0.114]
])
grey.save("grey_recomb.jpg")import libvips/api
initVips:
let left = openImage("left.jpg")
let right = openImage("right.jpg")
left.joinHorizontal(right).save("panorama.jpg")
left.joinVertical(right).save("stacked.jpg")import libvips/api
initVips:
let tile = openImage("tile.jpg")
tile.replicate(4, 4).save("tiled.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
img.zoom(2, 2).save("zoomed.jpg") # nearest-neighbor upscale
img.subsample(2, 2).save("down.jpg") # nearest-neighbor downsampleimport libvips/api
initVips:
let img = openImage("photo.jpg")
let wm = openImage("watermark.png").resize(0.3)
img.watermark(wm, VAlignBottom, HAlignRight).save("watermarked.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
img.embed(50, 50, 400, 400, VIPS_EXTEND_REPEAT).save("padded.jpg")
img.embed(100, 50, 600, 400, VIPS_EXTEND_WHITE).save("white_pad.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
img.savePNG("output.png")
img.saveWebP("output.webp", quality=80)
img.saveJPEG("output.jpg", quality=85)
img.saveTIFF("output.tif")
img.saveHEIF("output.heif", quality=60)
img.saveJXL("output.jxl", quality=80)import libvips/api
initVips:
let img = openImage("input.png")
img.saveGIF("output.gif")import libvips/api
initVips:
let gif = loadGIF("animation.gif")
gif.save("frame.png")import libvips/api
initVips:
let img = openImage("input.jpg")
let jpegBuf = img.saveJPEG(quality=90)
let pngBuf = img.savePNG(compression=9)
let webpBuf = img.saveWebP(quality=80)
discard jpegBufimport libvips/api
initVips:
let bytes = readFile("input.jpg")
let img = openBuffer(bytes)
img.resize(0.5).save("output.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
echo img.avg() ## average pixel value
echo img.min() ## minimum pixel value
echo img.max() ## maximum pixel value
echo img.deviate() ## standard deviationimport libvips/api
initVips:
let img = openImage("input.jpg")
let s = img.stats()
for band in s:
echo "min=", band[0], " max=", band[1], " mean=", band[4]import libvips/api
initVips:
let img = openImage("input.jpg")
let (left, top, width, height) = img.findTrim()
echo "content starts at (", left, ",", top, ") size ", width, "x", heightimport libvips/api
initVips:
let img = openImage("input.jpg")
let pixel = img.getPoint(100, 200)
echo "R=", pixel[0], " G=", pixel[1], " B=", pixel[2]import libvips/api
initVips:
let img = openImage("input.jpg")
img.histogram().save("hist.jpg")
let data = img.histogramData(bins=64)
echo "bins: ", data.len
let cum = img.cumulativeHistogram(bins=64)
echo "cumulative: ", cum[^1]
img.equalize().save("equalized.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
let colors = img.dominantColors(count=5, accuracy=10)
for c in colors:
echo "RGB(", c.r, ", ", c.g, ", ", c.b, ") count=", c.countimport libvips/api
initVips:
let img1 = openImage("photo1.jpg")
let img2 = openImage("photo2.jpg")
echo "dE76: ", img1.deltaE(img2, dE76)
echo "dE00: ", img1.deltaE(img2, dE00)
echo "dECMC: ", img1.deltaE(img2, dECMC)import libvips/api
initVips:
let img = openImage("input.jpg")
img.sobel().scale().castUchar().save("sobel.jpg")
img.scharr().scale().castUchar().save("scharr.jpg")
img.prewitt().scale().castUchar().save("prewitt.jpg")
img.canny().scale().castUchar().save("canny.jpg")import libvips/api
initVips:
let img = openImage("input.jpg")
img.gamma(2.2).save("gamma_22.jpg")
img.gamma(0.5).save("bright.jpg")import libvips/api
initVips:
let img = openImage("photo.jpg")
echo img.getMetadata("image-description")
echo img.getMetadataInt("orientation")
img.setMetadata("image-description", "My photo")import libvips/api
initVips:
let img = openImage("photo.jpg")
img.stripMetadata().save("clean.jpg")import libvips/api
initVips:
setConcurrency(8)
setCache(maxImages=100, maxMemory=50_000_000)
echo "threads: ", getConcurrency()import libvips/api
init_vips_accelerated(4):
let img = openImage("input.jpg")
img.resize(0.5).save("output.jpg")All operations return a new Image, so you can chain them fluently:
import libvips/api
initVips:
let result = openImage("input.jpg")
.resize(800)
.sharpen()
.gamma(2.2)
.toSRGB()
result.save("final.jpg")- Found a bug? Create a new Issue
- Want to help? Fork it!
MIT license. Made by Humans from OpenPeeps.
Copyright OpenPeeps & Contributors. All rights reserved.