Xử lí ảnh trên Golang
Bài đăng này đã không được cập nhật trong 8 năm
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
All rights reserved