Golang实现从服务器高效获取并处理图片的完整指南
引言
一、HTTP基础概念回顾
在深入代码实现之前,我们先回顾一下HTTP的基础概念。
- HTTP请求:客户端向服务器发送的请求,包含请求方法(如GET、POST)、请求头和请求体。
- HTTP响应:服务器对客户端请求的响应,包含状态码(如200、404)、响应头和响应体。
- HTTP/1.1与HTTP/2:HTTP/1.1是广泛使用的HTTP协议版本,而HTTP/2则提供了更高的性能和效率,支持多路复用、头部压缩等特性。
二、使用Golang创建HTTP服务器
package main
import (
"net/http"
"log"
)
func main() {
http.HandleFunc("/download", downloadHandler)
log.Println("Server started on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
func downloadHandler(w http.ResponseWriter, r *http.Request) {
filePath := "path/to/your/image.jpg"
http.ServeFile(w, r, filePath)
}
三、使用Golang创建HTTP客户端
package main
import (
"io"
"net/http"
"os"
"log"
)
func main() {
url := "http://localhost:8080/download"
resp, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := os.Create("downloaded_image.jpg")
if err != nil {
log.Fatal(err)
}
defer out.Close()
_, err = io.Copy(out, resp.Body)
if err != nil {
log.Fatal(err)
}
log.Println("Image downloaded successfully")
}
四、图片处理
首先,安装必要的包:
go get -u github.com/nfnt/resize
package main
import (
"image"
"image/color"
"image/draw"
"image/jpeg"
"log"
"os"
"github.com/nfnt/resize"
)
func main() {
file, err := os.Open("downloaded_image.jpg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
log.Fatal(err)
}
// 缩放图片
newImg := resize.Resize(800, 0, img, resize.Lanczos3)
// 创建一个新的图片用于添加水印
watermark := image.NewRGBA(image.Rect(0, 0, newImg.Bounds().Dx(), newImg.Bounds().Dy()))
draw.Draw(watermark, watermark.Bounds(), newImg, newImg.Bounds().Min, draw.Src)
// 添加水印
watermarkText := "Watermark"
x := (newImg.Bounds().Dx() - len(watermarkText)*10) / 2
y := newImg.Bounds().Dy() - 30
for i, c := range watermarkText {
draw.Draw(watermark, image.Rect(x+i*10, y, x+(i+1)*10, y+20), image.NewUniform(color.RGBA{255, 0, 0, 255}), image.Point{}, draw.Src)
}
// 保存处理后的图片
outFile, err := os.Create("processed_image.jpg")
if err != nil {
log.Fatal(err)
}
defer outFile.Close()
jpeg.Encode(outFile, watermark, nil)
log.Println("Image processed and saved successfully")
}
五、高效并发处理
package main
import (
"fmt"
"sync"
)
func processImage(url string) {
// 这里是前面定义的图片处理逻辑
fmt.Printf("Processing image from %s\n", url)
}
func main() {
urls := []string{
"http://localhost:8080/download1",
"http://localhost:8080/download2",
"http://localhost:8080/download3",
}
var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)
go func(url string) {
defer wg.Done()
processImage(url)
}(url)
}
wg.Wait()
fmt.Println("All images processed")
}
六、总结
参考文献
- Golang官方文档
- nfnt/resize库
- Go语言并发编程
希望这篇文章对你有所帮助,祝你在Golang的开发道路上越走越远!