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ả ...
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 awidth = 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 awidth=100px và height=100px:
dstImage := imaging.Resize(srcImage, 100, 100, imaging.Lanczos)
- Resize ảnh với awidth=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