获取远程图片信息#
image库针对远程图片使用image.Decode()方法进行解析时,会遇到无法解析图片格式的情况;
image: unknown format
所以先使用http.DetectContentType([]byte)方法读取文件类型,然后根据具体类型对图片进行Decode
package main
import (
"bytes"
"errors"
"fmt"
"image"
"image/jpeg"
"image/png"
"io"
"net/http"
)
func main() {
pic := "https://code-thinking-1253855093.file.myqcloud.com/pics/20210310150641186.png"
imageInfo, err := GetImageInfo(pic)
if err != nil {
fmt.Println("get image info failed, ", err)
return
}
fmt.Printf("%+v\n", *imageInfo)
}
type ImageInfo struct {
Width int
Height int
Size int
Mime string
}
func GetImageInfo(url string) (*ImageInfo, error) {
resp, err := http.Get(url)
defer resp.Body.Close()
if err != nil {
return nil, fmt.Errorf("request url failed, %v", err)
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("read response failed, %v", err)
}
imageMime := http.DetectContentType(body)
reader := bytes.NewReader(body)
var img image.Image
switch imageMime {
case "image/jpeg":
img, err = jpeg.Decode(reader)
case "image/png":
img, err = png.Decode(reader)
case "image/gif":
img, err = gif.Decode(reader)
default:
err = errors.New("invalid image type, " + imageMime)
}
if err != nil {
return nil, err
}
imageInfo := &ImageInfo{
Width: img.Bounds().Dx(),
Height: img.Bounds().Dy(),
Mime: imageMime,
Size: len(body),
}
return imageInfo, nil
}
获取本地图片信息#
func GetLocalImageInfo(file string) (imageInfo *ImageInfo, err error) {
fp, err := os.OpenFile(file, os.O_RDONLY, 0666)
if err != nil {
return
}
defer fp.Close()
stat, err := fp.Stat()
if err != nil {
return
}
img, imageMime, err := image.Decode(fp)
if err != nil {
return nil, err
}
imageInfo = &ImageInfo{
Width: img.Bounds().Dx(),
Height: img.Bounds().Dy(),
Mime: "image/" + imageMime,
Size: int(stat.Size()),
}
return imageInfo, nil
}