image.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. if err != nil {
  39. return nil, err
  40. }
  41. im, err := exifcommon.NewIfdMappingWithStandard()
  42. if err != nil {
  43. return nil, err
  44. }
  45. _, index, err := exif.Collect(im, exif.NewTagIndex(), head[offset:])
  46. if err != nil {
  47. return nil, err
  48. }
  49. ifd := index.RootIfd.NextIfd()
  50. if ifd == nil {
  51. return nil, exif.ErrNoThumbnail
  52. }
  53. thumbnail, err := ifd.Thumbnail()
  54. if err != nil {
  55. return nil, err
  56. }
  57. return thumbnail, nil
  58. }
  59. func GetThumbnailByWebPhoto(path string, width, height int) ([]byte, error) {
  60. src, err := imaging.Open(path)
  61. if err != nil {
  62. fmt.Println(err)
  63. return nil, err
  64. }
  65. img := imaging.Resize(src, width, 0, imaging.Lanczos)
  66. f, err := imaging.FormatFromFilename(path)
  67. if err != nil {
  68. return nil, err
  69. }
  70. buf := bytes.Buffer{}
  71. imaging.Encode(&buf, img, f)
  72. return buf.Bytes(), nil
  73. }