123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- package file
- import (
- "bytes"
- "errors"
- "fmt"
- "io"
- "net/http"
- "os"
- "path/filepath"
- "strings"
- "github.com/disintegration/imaging"
- "github.com/dsoprea/go-exif/v3"
- exifcommon "github.com/dsoprea/go-exif/v3/common"
- )
- func GetImage(path string, width, height int) ([]byte, error) {
- if thumbnail, err := GetThumbnailByOwnerPhotos(path); err == nil {
- return thumbnail, nil
- } else {
- return GetThumbnailByWebPhoto(path, width, height)
- }
- }
- func GetThumbnailByOwnerPhotos(path string) ([]byte, error) {
- file, err := os.Open(path)
- if err != nil {
- return nil, err
- }
- buff := &bytes.Buffer{}
- defer file.Close()
- offset := 0
- offsets := []int{12, 30}
- head := make([]byte, 0xffff)
- r := io.TeeReader(file, buff)
- _, err = r.Read(head)
- if err != nil {
- return nil, err
- }
- for _, offset = range offsets {
- if _, err = exif.ParseExifHeader(head[offset:]); err == nil {
- break
- }
- }
- if err != nil {
- return nil, err
- }
- im, err := exifcommon.NewIfdMappingWithStandard()
- if err != nil {
- return nil, err
- }
- _, index, err := exif.Collect(im, exif.NewTagIndex(), head[offset:])
- if err != nil {
- return nil, err
- }
- ifd := index.RootIfd.NextIfd()
- if ifd == nil {
- return nil, exif.ErrNoThumbnail
- }
- thumbnail, err := ifd.Thumbnail()
- if err != nil {
- return nil, err
- }
- return thumbnail, nil
- }
- func GetThumbnailByWebPhoto(path string, width, height int) ([]byte, error) {
- src, err := imaging.Open(path)
- if err != nil {
- fmt.Println(err)
- return nil, err
- }
- img := imaging.Resize(src, width, 0, imaging.Lanczos)
- f, err := imaging.FormatFromFilename(path)
- if err != nil {
- return nil, err
- }
- buf := bytes.Buffer{}
- imaging.Encode(&buf, img, f)
- return buf.Bytes(), nil
- }
- func ImageExtArray() []string {
- ext := []string{
- "ase",
- "art",
- "bmp",
- "blp",
- "cd5",
- "cit",
- "cpt",
- "cr2",
- "cut",
- "dds",
- "dib",
- "djvu",
- "egt",
- "exif",
- "gif",
- "gpl",
- "grf",
- "icns",
- "ico",
- "iff",
- "jng",
- "jpeg",
- "jpg",
- "jfif",
- "jp2",
- "jps",
- "lbm",
- "max",
- "miff",
- "mng",
- "msp",
- "nitf",
- "ota",
- "pbm",
- "pc1",
- "pc2",
- "pc3",
- "pcf",
- "pcx",
- "pdn",
- "pgm",
- "PI1",
- "PI2",
- "PI3",
- "pict",
- "pct",
- "pnm",
- "pns",
- "ppm",
- "psb",
- "psd",
- "pdd",
- "psp",
- "px",
- "pxm",
- "pxr",
- "qfx",
- "raw",
- "rle",
- "sct",
- "sgi",
- "rgb",
- "int",
- "bw",
- "tga",
- "tiff",
- "tif",
- "vtf",
- "xbm",
- "xcf",
- "xpm",
- "3dv",
- "amf",
- "ai",
- "awg",
- "cgm",
- "cdr",
- "cmx",
- "dxf",
- "e2d",
- "egt",
- "eps",
- "fs",
- "gbr",
- "odg",
- "svg",
- "stl",
- "vrml",
- "x3d",
- "sxd",
- "v2d",
- "vnd",
- "wmf",
- "emf",
- "art",
- "xar",
- "png",
- "webp",
- "jxr",
- "hdp",
- "wdp",
- "cur",
- "ecw",
- "iff",
- "lbm",
- "liff",
- "nrrd",
- "pam",
- "pcx",
- "pgf",
- "sgi",
- "rgb",
- "rgba",
- "bw",
- "int",
- "inta",
- "sid",
- "ras",
- "sun",
- "tga",
- }
- return ext
- }
- /**
- * @description:get a image's ext
- * @param {string} path "file path"
- * @return {string} ext "file ext"
- * @return {error} err "error info"
- */
- func GetImageExt(p string) (string, error) {
- file, err := os.Open(p)
- if err != nil {
- return "", err
- }
- buff := make([]byte, 512)
- _, err = file.Read(buff)
- if err != nil {
- return "", err
- }
- filetype := http.DetectContentType(buff)
- ext := ImageExtArray()
- for i := 0; i < len(ext); i++ {
- if strings.Contains(ext[i], filetype[6:]) {
- return ext[i], nil
- }
- }
- return "", errors.New("invalid image type")
- }
- func GetImageExtByName(p string) (string, error) {
- extArr := ImageExtArray()
- ext := filepath.Ext(p)
- for i := 0; i < len(extArr); i++ {
- if strings.Contains(ext, extArr[i]) {
- return extArr[i], nil
- }
- }
- return "", errors.New("invalid image type")
- }
|