image.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package file
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "os"
  7. "github.com/disintegration/imaging"
  8. "github.com/dsoprea/go-exif/v3"
  9. exifcommon "github.com/dsoprea/go-exif/v3/common"
  10. )
  11. func GetImage(path string, width, height int) ([]byte, error) {
  12. if thumbnail, err := GetThumbnailByOwnerPhotos(path); err == nil {
  13. return thumbnail, nil
  14. } else {
  15. return GetThumbnailByWebPhoto(path, width, height)
  16. }
  17. }
  18. func GetThumbnailByOwnerPhotos(path string) ([]byte, error) {
  19. file, err := os.Open(path)
  20. if err != nil {
  21. return nil, err
  22. }
  23. buff := &bytes.Buffer{}
  24. defer file.Close()
  25. offset := 0
  26. offsets := []int{12, 30}
  27. head := make([]byte, 0xffff)
  28. r := io.TeeReader(file, buff)
  29. _, err = r.Read(head)
  30. if err != nil {
  31. return nil, err
  32. }
  33. for _, offset = range offsets {
  34. if _, err = exif.ParseExifHeader(head[offset:]); err == nil {
  35. break
  36. }
  37. }
  38. im, err := exifcommon.NewIfdMappingWithStandard()
  39. if err != nil {
  40. return nil, err
  41. }
  42. _, index, err := exif.Collect(im, exif.NewTagIndex(), head[offset:])
  43. if err != nil {
  44. return nil, err
  45. }
  46. ifd := index.RootIfd.NextIfd()
  47. if err != nil {
  48. return nil, err
  49. }
  50. thumbnail, err := ifd.Thumbnail()
  51. if err != nil {
  52. return nil, err
  53. }
  54. return thumbnail, nil
  55. }
  56. func GetThumbnailByWebPhoto(path string, width, height int) ([]byte, error) {
  57. src, err := imaging.Open(path)
  58. if err != nil {
  59. fmt.Println(err)
  60. return nil, err
  61. }
  62. img := imaging.Resize(src, width, 0, imaging.Lanczos)
  63. f, err := imaging.FormatFromFilename(path)
  64. if err != nil {
  65. return nil, err
  66. }
  67. buf := bytes.Buffer{}
  68. imaging.Encode(&buf, img, f)
  69. return buf.Bytes(), nil
  70. }