Migrate to bimg & remove exif dependency

This commit is contained in:
2021-03-01 11:49:28 -05:00
parent 745d843af7
commit eba444459b
6 changed files with 100 additions and 133 deletions

View File

@@ -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)
}