跳过正文

获取图片信息

·360 字
目录

获取远程图片信息
#

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
}