image和文件操作

获取image的meta信息

获取宽高

方式1

package main

import (
	"bytes"
	"fmt"
	"image/jpeg"
	"io"

	"log"
	"net/http"
)

func main() {
	// Fetch an image.
	resp, err := http.Get("http://10.130.48.25:8000/t.jpg")
	if err != nil {
		log.Panic(err)
	}
	defer resp.Body.Close()

	var respBuf bytes.Buffer
	io.Copy(&respBuf, resp.Body)

	// Keep an in memory copy.
	myImage, err := jpeg.Decode(&respBuf)
	if err != nil {
		log.Panic(err)
	}
	fmt.Println(myImage.Bounds().Max.X)
	fmt.Println(myImage.Bounds().Max.Y)
	fmt.Println(myImage.Bounds().Size())
	fmt.Println(myImage.Bounds().Size().X)
	fmt.Println(myImage.Bounds().Size().Y)
}

输出:

1980
1311
(1980,1311)
1980
1311

方式2

package main

import (
	"fmt"
	"image/jpeg"

	"log"
	"net/http"
)

func main() {
	// Fetch an image.
	resp, err := http.Get("http://10.130.48.25:8000/t.jpg")
	if err != nil {
		log.Panic(err)
	}
	defer resp.Body.Close()

	imgConfig, err := jpeg.DecodeConfig(resp.Body)
	fmt.Println(imgConfig.Width)
	fmt.Println(imgConfig.Height)
}

输出:

1980
1311

注意: jpeg.DecodeConfig(resp.Body)jpeg.Decode(resp.Body) 对于同一个Reader不能多次调用。

在方式1中调用jpeg.Decode(&respBuf)fmt.Println(respBuf.Len()) 为0。

image写入文件

参考文档: https://stackoverflow.com/questions/39927182/looking-for-better-way-to-save-an-in-memory-image-to-file

To save an image directly to a file:

f, err := os.Create("img.jpg")
if err != nil {
    panic(err)
}
defer f.Close()
if err = jpeg.Encode(f, target, nil); err != nil {
    log.Printf("failed to encode: %v", err)
}

To serve it as an image:

// w is of type http.ResponseWriter:
if err := jpeg.Encode(w, target, nil); err != nil {
    log.Printf("failed to encode: %v", err)
}

You can see some examples in these questions (saving/loading JPEG and PNG images):

Draw a rectangle in Golang?

How to add a simple text label to an image in Go?

Change color of a single pixel - Golang image

网络图片到文件

示例:

package main

import (
	"image"
	"image/draw"
	"image/jpeg"
	"os"

	// "image/color"
	// "io/ioutil"
	// "fmt"
	"bufio"
	"bytes"
	"log"
	"net/http"
)

func main() {
	// Fetch an image.
	resp, err := http.Get("http://10.130.48.25:8000/t.jpg")
	if err != nil {
		log.Panic(err)
	}
	defer resp.Body.Close()

	// Keep an in memory copy.
	myImage, err := jpeg.Decode(resp.Body)

	if err != nil {
		log.Panic(err)
	}

	// Prepare parent image where we want to position child image.
	target := image.NewRGBA(image.Rect(0, 0, 800, 800))
	// Draw white layer.
	draw.Draw(target, target.Bounds(), image.White, image.ZP, draw.Src)
	// Draw child image.
	draw.Draw(target, myImage.Bounds(), myImage, image.Point{0, 0}, draw.Src)

	// Encode to jpeg.
	var imageBuf bytes.Buffer
	err = jpeg.Encode(&imageBuf, target, nil)

	if err != nil {
		log.Panic(err)
	}

	// Write to file.
	fo, err := os.Create("img.jpg")
	if err != nil {
		panic(err)
	}
	fw := bufio.NewWriter(fo)

	fw.Write(imageBuf.Bytes())
}