Golang实现从服务器高效获取并处理图片的完整指南

引言

一、HTTP基础概念回顾

在深入代码实现之前,我们先回顾一下HTTP的基础概念。

  1. HTTP请求:客户端向服务器发送的请求,包含请求方法(如GET、POST)、请求头和请求体。
  2. HTTP响应:服务器对客户端请求的响应,包含状态码(如200、404)、响应头和响应体。
  3. 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")
}

六、总结

参考文献

  1. Golang官方文档
  2. nfnt/resize库
  3. Go语言并发编程

希望这篇文章对你有所帮助,祝你在Golang的开发道路上越走越远!