image.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. package file
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "strings"
  11. "github.com/disintegration/imaging"
  12. "github.com/dsoprea/go-exif/v3"
  13. exifcommon "github.com/dsoprea/go-exif/v3/common"
  14. )
  15. func GetImage(path string, width, height int) ([]byte, error) {
  16. if thumbnail, err := GetThumbnailByOwnerPhotos(path); err == nil {
  17. return thumbnail, nil
  18. } else {
  19. return GetThumbnailByWebPhoto(path, width, height)
  20. }
  21. }
  22. func GetThumbnailByOwnerPhotos(path string) ([]byte, error) {
  23. file, err := os.Open(path)
  24. if err != nil {
  25. return nil, err
  26. }
  27. buff := &bytes.Buffer{}
  28. defer file.Close()
  29. offset := 0
  30. offsets := []int{12, 30}
  31. head := make([]byte, 0xffff)
  32. r := io.TeeReader(file, buff)
  33. _, err = r.Read(head)
  34. if err != nil {
  35. return nil, err
  36. }
  37. for _, offset = range offsets {
  38. if _, err = exif.ParseExifHeader(head[offset:]); err == nil {
  39. break
  40. }
  41. }
  42. if err != nil {
  43. return nil, err
  44. }
  45. im, err := exifcommon.NewIfdMappingWithStandard()
  46. if err != nil {
  47. return nil, err
  48. }
  49. _, index, err := exif.Collect(im, exif.NewTagIndex(), head[offset:])
  50. if err != nil {
  51. return nil, err
  52. }
  53. ifd := index.RootIfd.NextIfd()
  54. if ifd == nil {
  55. return nil, exif.ErrNoThumbnail
  56. }
  57. thumbnail, err := ifd.Thumbnail()
  58. if err != nil {
  59. return nil, err
  60. }
  61. return thumbnail, nil
  62. }
  63. func GetThumbnailByWebPhoto(path string, width, height int) ([]byte, error) {
  64. src, err := imaging.Open(path)
  65. if err != nil {
  66. fmt.Println(err)
  67. return nil, err
  68. }
  69. img := imaging.Resize(src, width, 0, imaging.Lanczos)
  70. f, err := imaging.FormatFromFilename(path)
  71. if err != nil {
  72. return nil, err
  73. }
  74. buf := bytes.Buffer{}
  75. imaging.Encode(&buf, img, f)
  76. return buf.Bytes(), nil
  77. }
  78. func ImageExtArray() []string {
  79. ext := []string{
  80. "ase",
  81. "art",
  82. "bmp",
  83. "blp",
  84. "cd5",
  85. "cit",
  86. "cpt",
  87. "cr2",
  88. "cut",
  89. "dds",
  90. "dib",
  91. "djvu",
  92. "egt",
  93. "exif",
  94. "gif",
  95. "gpl",
  96. "grf",
  97. "icns",
  98. "ico",
  99. "iff",
  100. "jng",
  101. "jpeg",
  102. "jpg",
  103. "jfif",
  104. "jp2",
  105. "jps",
  106. "lbm",
  107. "max",
  108. "miff",
  109. "mng",
  110. "msp",
  111. "nitf",
  112. "ota",
  113. "pbm",
  114. "pc1",
  115. "pc2",
  116. "pc3",
  117. "pcf",
  118. "pcx",
  119. "pdn",
  120. "pgm",
  121. "PI1",
  122. "PI2",
  123. "PI3",
  124. "pict",
  125. "pct",
  126. "pnm",
  127. "pns",
  128. "ppm",
  129. "psb",
  130. "psd",
  131. "pdd",
  132. "psp",
  133. "px",
  134. "pxm",
  135. "pxr",
  136. "qfx",
  137. "raw",
  138. "rle",
  139. "sct",
  140. "sgi",
  141. "rgb",
  142. "int",
  143. "bw",
  144. "tga",
  145. "tiff",
  146. "tif",
  147. "vtf",
  148. "xbm",
  149. "xcf",
  150. "xpm",
  151. "3dv",
  152. "amf",
  153. "ai",
  154. "awg",
  155. "cgm",
  156. "cdr",
  157. "cmx",
  158. "dxf",
  159. "e2d",
  160. "egt",
  161. "eps",
  162. "fs",
  163. "gbr",
  164. "odg",
  165. "svg",
  166. "stl",
  167. "vrml",
  168. "x3d",
  169. "sxd",
  170. "v2d",
  171. "vnd",
  172. "wmf",
  173. "emf",
  174. "art",
  175. "xar",
  176. "png",
  177. "webp",
  178. "jxr",
  179. "hdp",
  180. "wdp",
  181. "cur",
  182. "ecw",
  183. "iff",
  184. "lbm",
  185. "liff",
  186. "nrrd",
  187. "pam",
  188. "pcx",
  189. "pgf",
  190. "sgi",
  191. "rgb",
  192. "rgba",
  193. "bw",
  194. "int",
  195. "inta",
  196. "sid",
  197. "ras",
  198. "sun",
  199. "tga",
  200. }
  201. return ext
  202. }
  203. /**
  204. * @description:get a image's ext
  205. * @param {string} path "file path"
  206. * @return {string} ext "file ext"
  207. * @return {error} err "error info"
  208. */
  209. func GetImageExt(p string) (string, error) {
  210. file, err := os.Open(p)
  211. if err != nil {
  212. return "", err
  213. }
  214. buff := make([]byte, 512)
  215. _, err = file.Read(buff)
  216. if err != nil {
  217. return "", err
  218. }
  219. filetype := http.DetectContentType(buff)
  220. ext := ImageExtArray()
  221. for i := 0; i < len(ext); i++ {
  222. if strings.Contains(ext[i], filetype[6:]) {
  223. return ext[i], nil
  224. }
  225. }
  226. return "", errors.New("invalid image type")
  227. }
  228. func GetImageExtByName(p string) (string, error) {
  229. extArr := ImageExtArray()
  230. ext := filepath.Ext(p)
  231. for i := 0; i < len(extArr); i++ {
  232. if strings.Contains(ext, extArr[i]) {
  233. return extArr[i], nil
  234. }
  235. }
  236. return "", errors.New("invalid image type")
  237. }