Go語言在Web開發中的圖片處理功能非常強大,可以用于生成和處理各種圖片格式。以下是一些在Web中使用Go語言進行圖片處理的應用場景和示例代碼:
首先,你需要一個Web框架來處理HTTP請求。Go語言的net/http
包提供了基本的HTTP服務器功能,而mime/multipart
包則用于處理文件上傳。
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func uploadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method is not supported.", http.StatusMethodNotAllowed)
return
}
file, header, err := r.FormFile("file")
if err != nil {
http.Error(w, "Error retrieving the file.", http.StatusInternalServerError)
return
}
defer file.Close()
out, err := os.Create(header.Filename)
if err != nil {
http.Error(w, "Error creating the file.", http.StatusInternalServerError)
return
}
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {
http.Error(w, "Error saving the file.", http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "File %s uploaded successfully.", header.Filename)
}
func main() {
http.HandleFunc("/upload", uploadHandler)
http.ListenAndServe(":8080", nil)
}
Go語言的image
包提供了強大的圖片處理功能,包括縮放、裁剪等。
package main
import (
"image"
"image/jpeg"
"net/http"
"os"
)
func resizeHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method is not supported.", http.StatusMethodNotAllowed)
return
}
file, header, err := r.FormFile("file")
if err != nil {
http.Error(w, "Error retrieving the file.", http.StatusInternalServerError)
return
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
http.Error(w, "Error decoding the image.", http.StatusInternalServerError)
return
}
// 縮放圖片
scaledImg := resizeImage(img, 100, 100)
// 保存縮放后的圖片
out, err := os.Create("resized_" + header.Filename)
if err != nil {
http.Error(w, "Error creating the resized file.", http.StatusInternalServerError)
return
}
defer out.Close()
jpeg.Encode(out, scaledImg, &jpeg.Options{Quality: 80})
fmt.Fprintf(w, "Resized image saved as %s.", "resized_"+header.Filename)
}
func resizeImage(img image.Image, width, height int) image.Image {
bounds := img.Bounds()
ratio := float64(width) / float64(height)
newWidth := int(float64(bounds.Dx()) * ratio)
newHeight := int(float64(bounds.Dy()) * ratio)
resizedImg := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight))
draw.FloydSteinberg.Draw(resizedImg, image.Rect(0, 0, newWidth, newHeight), img, image.Point{}, draw.Src)
return resizedImg
}
func main() {
http.HandleFunc("/resize", resizeHandler)
http.ListenAndServe(":8080", nil)
}
你可以使用第三方庫來實現更復雜的圖片濾鏡效果,例如使用github.com/disintegration/imaging
庫。
package main
import (
"fmt"
"image"
"image/jpeg"
"net/http"
"os"
"github.com/disintegration/imaging"
)
func filterHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method is not supported.", http.StatusMethodNotAllowed)
return
}
file, header, err := r.FormFile("file")
if err != nil {
http.Error(w, "Error retrieving the file.", http.StatusInternalServerError)
return
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
http.Error(w, "Error decoding the image.", http.StatusInternalServerError)
return
}
// 應用濾鏡效果
filteredImg := applyFilter(img, imaging.Grayscale)
// 保存濾鏡后的圖片
out, err := os.Create("filtered_" + header.Filename)
if err != nil {
http.Error(w, "Error creating the filtered file.", http.StatusInternalServerError)
return
}
defer out.Close()
jpeg.Encode(out, filteredImg, &jpeg.Options{Quality: 80})
fmt.Fprintf(w, "Filtered image saved as %s.", "filtered_"+header.Filename)
}
func applyFilter(img image.Image, filter func(image.Image) image.Image) image.Image {
return filter(img)
}
func main() {
http.HandleFunc("/filter", filterHandler)
http.ListenAndServe(":8080", nil)
}
Go語言在Web開發中的圖片處理功能非常強大,可以用于生成和處理各種圖片格式。通過使用net/http
包處理HTTP請求,image
包進行圖片解碼和編碼,以及第三方庫實現復雜的濾鏡效果,你可以輕松地在Web應用中實現圖片處理功能。