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写入文件
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):
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())
}