photoprism/thumbnails.go

143 lines
3.3 KiB
Go
Raw Normal View History

2018-02-04 16:34:07 +00:00
package photoprism
import (
2018-07-18 13:17:56 +00:00
"fmt"
2018-02-04 16:34:07 +00:00
"github.com/disintegration/imaging"
"log"
2018-06-17 10:56:02 +00:00
"os"
"path/filepath"
"strings"
2018-08-09 21:10:05 +00:00
"image"
2018-02-04 16:34:07 +00:00
)
2018-06-17 10:56:02 +00:00
func CreateThumbnailsFromOriginals(originalsPath string, thumbnailsPath string, size int, square bool) {
err := filepath.Walk(originalsPath, func(filename string, fileInfo os.FileInfo, err error) error {
if err != nil || fileInfo.IsDir() || strings.HasPrefix(filepath.Base(filename), ".") {
return nil
}
mediaFile := NewMediaFile(filename)
if !mediaFile.Exists() || !mediaFile.IsJpeg() {
return nil
}
if square {
log.Printf("Creating square %dpx thumbnail for %s", size, filename)
if _, err := mediaFile.GetSquareThumbnail(thumbnailsPath, size); err != nil {
log.Print(err.Error())
}
} else {
log.Printf("Creating %dpx thumbnail for %s", size, filename)
2018-07-18 13:17:56 +00:00
if _, err := mediaFile.GetThumbnail(thumbnailsPath, size); err != nil {
2018-06-17 10:56:02 +00:00
log.Print(err.Error())
}
}
return nil
})
if err != nil {
log.Print(err.Error())
}
}
func (m *MediaFile) GetThumbnail(path string, size int) (result *MediaFile, err error) {
canonicalName := m.GetCanonicalName()
dateCreated := m.GetDateCreated()
thumbnailPath := fmt.Sprintf("%s/%dpx/%s", path, size, dateCreated.UTC().Format("2006/01"))
os.MkdirAll(thumbnailPath, os.ModePerm)
thumbnailFilename := fmt.Sprintf("%s/%s_%dpx.jpg", thumbnailPath, canonicalName, size)
if fileExists(thumbnailFilename) {
return NewMediaFile(thumbnailFilename), nil
}
return m.CreateThumbnail(thumbnailFilename, size)
}
2018-08-09 21:10:05 +00:00
func (m *MediaFile) fixImageOrientation(img image.Image) image.Image {
switch orientation := m.GetOrientation(); orientation {
case 3:
img = imaging.Rotate180(img)
case 6:
img = imaging.Rotate270(img)
case 8:
img = imaging.Rotate90(img)
}
return img
}
2018-06-17 10:56:02 +00:00
// Resize preserving the aspect ratio
func (m *MediaFile) CreateThumbnail(filename string, size int) (result *MediaFile, err error) {
2018-08-09 21:10:05 +00:00
img, err := imaging.Open(m.filename)
2018-06-17 10:56:02 +00:00
if err != nil {
log.Printf("open failed: %s", err.Error())
return nil, err
}
2018-08-09 21:10:05 +00:00
img = m.fixImageOrientation(img)
img = imaging.Fit(img, size, size, imaging.Lanczos)
2018-06-17 10:56:02 +00:00
2018-08-09 21:10:05 +00:00
err = imaging.Save(img, filename)
2018-06-17 10:56:02 +00:00
if err != nil {
2018-08-09 21:10:05 +00:00
log.Fatalf("failed to save img: %v", err)
2018-06-17 10:56:02 +00:00
return nil, err
}
result = NewMediaFile(filename)
return result, nil
}
func (m *MediaFile) GetSquareThumbnail(path string, size int) (result *MediaFile, err error) {
canonicalName := m.GetCanonicalName()
dateCreated := m.GetDateCreated()
thumbnailPath := fmt.Sprintf("%s/square/%dpx/%s", path, size, dateCreated.UTC().Format("2006/01"))
os.MkdirAll(thumbnailPath, os.ModePerm)
thumbnailFilename := fmt.Sprintf("%s/%s_square_%dpx.jpg", thumbnailPath, canonicalName, size)
if fileExists(thumbnailFilename) {
return NewMediaFile(thumbnailFilename), nil
}
return m.CreateSquareThumbnail(thumbnailFilename, size)
}
// Resize and crop to square format
func (m *MediaFile) CreateSquareThumbnail(filename string, size int) (result *MediaFile, err error) {
2018-08-09 21:10:05 +00:00
img, err := imaging.Open(m.filename)
2018-06-17 10:56:02 +00:00
if err != nil {
log.Printf("open failed: %s", err.Error())
return nil, err
}
2018-08-09 21:10:05 +00:00
img = m.fixImageOrientation(img)
img = imaging.Fill(img, size, size, imaging.Center, imaging.Lanczos)
2018-06-17 10:56:02 +00:00
2018-08-09 21:10:05 +00:00
err = imaging.Save(img, filename)
2018-02-28 09:04:24 +00:00
2018-02-04 16:34:07 +00:00
if err != nil {
2018-08-09 21:10:05 +00:00
log.Fatalf("failed to save img: %v", err)
2018-06-17 10:56:02 +00:00
return nil, err
2018-02-04 16:34:07 +00:00
}
2018-06-17 10:56:02 +00:00
result = NewMediaFile(filename)
2018-02-04 16:34:07 +00:00
2018-06-17 10:56:02 +00:00
return result, nil
2018-02-28 09:08:49 +00:00
}