Xử lí ảnh trên Golang

Imaging

Package imaging cung cấp các hàm xử lí ảnh cơ bản (resize, rotate, flip, crop...). Package này xây dựng dựa trên package tiêu chuẩn của Go và hoạt động tốt nhất bên cạnh nó.

Các hàm xử lí ảnh được cung cấp bởi package sẽ nhận bất kì định dạng ảnh nào qua giao diện image.Image, và trả về một ảnh kiểu *image.NRGBA (32bit RGBA colors).

Cài đặt

Imaging yêu cầu phiên bản Go 1.2 hoặc cao hơn.

go get -u github.com/disintegration/imaging

Sử dụng

Dưới đây là một số ví dụ về cách sử dụng Imaging:

Image resizing

// resize srcImage to size = 128x128px using the Lanczos filter
dstImage128 := imaging.Resize(srcImage, 128, 128, imaging.Lanczos)

// resize srcImage to width = 800px preserving the aspect ratio
dstImage800 := imaging.Resize(srcImage, 800, 0, imaging.Lanczos)

// scale down srcImage to fit the 800x600px bounding box
dstImageFit := imaging.Fit(srcImage, 800, 600, imaging.Lanczos)

// resize and crop the srcImage to fill the 100x100px area
dstImageFill := imaging.Fill(srcImage, 100, 100, imaging.Center, imaging.Lanczos)

Imaging hỗ trợ resize ảnh với nhiều bộ lọc khác nhau. Một số bộ lọc đáng chú ý:

  • NearestNeighbor - Bộ lọc nhanh nhất, không có khử răng cưa.
  • Box - Bộ lọc đơn giản với tốc độ trung bình, phù hợp với việc thu nhỏ kích thước. Khi sử dụng để phóng to ảnh, nó tương đương với NearestNeighbor
  • Linear - Bộ lọc bilinear, mượt mà và tương đối nhanh.
  • MitchellNetravali - Bộ lọc bicubic làm mượt.
  • CatmullRom - Bộ lọc bicubic làm nét.
  • Gaussian - Bộ lọc làm mờ sử dụng hàm gaussian, hữu dụng cho việc loại nhiễu.
  • Lanczos - Bộ lọc ảnh chất lượng cao cho ảnh nghệ thuật sắc nét, những nó chậm hơn so với bộ lọc cubic.

Danh sách các bộ lọc được hỗ trợ: NearestNeighbor, Box, Linear, Hermite, MitchellNetravali, CatmullRom, BSpline, Gaussian, Lanczos, Hann, Hamming, Blackman, Bartlett, Welch, Cosine. Bộ lọc custom có thể tạo theo cấu trúc ResampleFilter.

Resampling filters comparison

  • Ảnh gốc, sẽ resize từ 512x512px về 128x128px.

  • imaging.NearestNeighbor

  • imaging.Box

  • imaging.Linear

  • imaging.MitchellNetravali

  • imaging.CatmullRom

  • imaging.Gaussian

  • imaging.Lanczos

Resize functions comparison

  • Ảnh gốc:

  • Resize ảnh với width=100px và height=100px:
dstImage := imaging.Resize(srcImage, 100, 100, imaging.Lanczos)

  • Resize ảnh với width=100px và giữ nguyên tỉ lệ:
dstImage := imaging.Resize(srcImage, 100, 0, imaging.Lanczos)

  • Resize ảnh vừa với kich thước 100x100px và giữ nguyên tỉ lệ:
dstImage := imaging.Fit(srcImage, 100, 100, imaging.Lanczos)

  • Resize và crop ảnh với một điểm tâm, kích cỡ 100x100px:
dstImage := imaging.Fill(srcImage, 100, 100, imaging.Center, imaging.Lanczos)

Gaussian Blur

dstImage := imaging.Blur(srcImage, 0.5)

Tham số sigma cho phép điều chỉnh mức độ của hiệu ứng làm mờ.

  • Ảnh gốc:

  • Sigma = 0.5

  • Sigma = 1.5

Sharpening

dstImage := imaging.Sharpen(srcImage, 0.5)

Sử dụng hàm gassian bên trong, tham số sigma cho phép điều chỉnh mức độ của hiệu ứng sắc nét.

  • Ảnh gốc:

  • Sigma = 0.5

  • Sigma = 1.5

Gamma correction

dstImage := imaging.AdjustGamma(srcImage, 0.75)
  • Ảnh gốc:

  • Gamma = 0.75

  • Gamma = 1.25

Contrast adjustment

dstImage := imaging.AdjustContrast(srcImage, 20)
  • Ảnh gốc:

  • Contrast = 20

  • Contrast = -20

Brightness adjustment

dstImage := imaging.AdjustBrightness(srcImage, 20)
  • Ảnh gốc:

  • Brightness = 20

  • Brightness = -20

Complete code example

Dưới đây là code mẫu về chức năng load một vài ảnh , tạo thumbnail của chúng và kết hợp chúng side-by-side.

package main

import (
    "image"
    "image/color"

    "github.com/disintegration/imaging"
)

func main() {

    // input files
    files := []string{"01.jpg", "02.jpg", "03.jpg"}

    // load images and make 100x100 thumbnails of them
    var thumbnails []image.Image
    for _, file := range files {
        img, err := imaging.Open(file)
        if err != nil {
            panic(err)
        }
        thumb := imaging.Thumbnail(img, 100, 100, imaging.CatmullRom)
        thumbnails = append(thumbnails, thumb)
    }

    // create a new blank image
    dst := imaging.New(100*len(thumbnails), 100, color.NRGBA{0, 0, 0, 0})

    // paste thumbnails into the new image side by side
    for i, thumb := range thumbnails {
        dst = imaging.Paste(dst, thumb, image.Pt(i*100, 0))
    }

    // save the combined image to file
    err := imaging.Save(dst, "dst.jpg")
    if err != nil {
        panic(err)
    }
}

Tổng kết

Bài viết được dịch từ Imaging

Documentation: Imaging Documentation