Migrate to bimg & remove exif dependency
This commit is contained in:
@@ -3,14 +3,13 @@ package api
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/davidbyttow/govips/v2/vips"
|
||||
"github.com/h2non/bimg"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"reichard.io/imagini/graph/model"
|
||||
)
|
||||
@@ -50,7 +49,8 @@ func (api *API) mediaHandler(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
mediaFile, err := resizeAndConvertImage(mediaPath, width)
|
||||
mediaFile, err := resizeAndConvertImageBIMG(mediaPath, width)
|
||||
//mediaFile, err := resizeAndConvertImage(mediaPath, width)
|
||||
if err != nil {
|
||||
log.Warn("[media] Image conversion failed:", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
@@ -62,42 +62,37 @@ func (api *API) mediaHandler(w http.ResponseWriter, r *http.Request) {
|
||||
http.ServeContent(w, r, fileName, time.Time{}, bytes.NewReader(mediaFile))
|
||||
}
|
||||
|
||||
func resizeAndConvertImage(path string, desiredWidth int) ([]byte, error) {
|
||||
inputImage, err := vips.NewImageFromFile(path)
|
||||
func resizeAndConvertImageBIMG(path string, desiredWidth int) ([]byte, error) {
|
||||
buffer, err := bimg.Read(path)
|
||||
if err != nil {
|
||||
return nil, errors.New("[media] Unable to read image")
|
||||
}
|
||||
inputImage := bimg.NewImage(buffer)
|
||||
|
||||
// If we're viewing full image, we want full quality
|
||||
desiredQuality := 100
|
||||
|
||||
// Do we need to scale?
|
||||
if desiredWidth != 0 && inputImage.Width() > desiredWidth {
|
||||
desiredQuality = 50
|
||||
desiredScale := float64(desiredWidth) / float64(inputImage.Width())
|
||||
err := inputImage.Resize(desiredScale, vips.KernelLanczos3)
|
||||
if err != nil {
|
||||
return nil, errors.New("[media] Unable to resize")
|
||||
}
|
||||
} else if inputImage.Format() == vips.ImageTypeJPEG {
|
||||
// Return raw file
|
||||
return ioutil.ReadFile(path)
|
||||
// Return RAW
|
||||
if inputImage.Type() == "jpeg" && desiredWidth == 0 {
|
||||
return buffer, nil
|
||||
}
|
||||
|
||||
// Return non-converted but scaled image
|
||||
if inputImage.Format() == vips.ImageTypeJPEG {
|
||||
imageBytes, _, err := inputImage.ExportNative()
|
||||
return imageBytes, err
|
||||
imageSize, err := inputImage.Size()
|
||||
|
||||
options := bimg.Options{
|
||||
Quality: 100,
|
||||
// NoAutoRotate: true,
|
||||
Background: bimg.Color{R: 255, G: 255, B: 255},
|
||||
}
|
||||
|
||||
// Convert Alpha Channel to White (if applicable)
|
||||
if inputImage.HasAlpha() {
|
||||
inputImage.Flatten(&vips.Color{R: 255, G: 255, B: 255})
|
||||
// Set dimensions
|
||||
if desiredWidth != 0 && imageSize.Width > desiredWidth {
|
||||
options.Width = desiredWidth
|
||||
options.Quality = 50
|
||||
}
|
||||
|
||||
// Convert
|
||||
ep := vips.NewJpegExportParams()
|
||||
ep.Quality = desiredQuality
|
||||
imageBytes, _, err := inputImage.ExportJpeg(ep)
|
||||
return imageBytes, err
|
||||
// Convert to JPEG
|
||||
if inputImage.Type() != "jpeg" {
|
||||
options.Type = bimg.JPEG
|
||||
}
|
||||
|
||||
// Process image
|
||||
return inputImage.Process(options)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user