Переглянути джерело

Added support for webp thumbnail generation

Toby Chui 1 тиждень тому
батько
коміт
2785b917fc

+ 37 - 11
src/mod/filesystem/metadata/image.go

@@ -10,6 +10,7 @@ import (
 
 	"github.com/nfnt/resize"
 	"github.com/oliamb/cutter"
+	"golang.org/x/image/webp"
 	"imuslab.com/arozos/mod/filesystem"
 )
 
@@ -27,25 +28,41 @@ func generateThumbnailForImage(fsh *filesystem.FileSystemHandler, cacheFolder st
 		//This file is too large to convert
 		return "", errors.New("image file too large")
 	}
-	if fsh.RequireBuffer {
-		//This fsh is remote. Buffer to RAM
+
+	if filepath.Ext(file) == ".webp" {
+		//Webp image format
 		imageBytes, err := fshAbs.ReadFile(file)
 		if err != nil {
 			return "", err
 		}
-		img, _, err = image.Decode(bytes.NewReader(imageBytes))
+		img, err = handleWebpDecoding(imageBytes)
 		if err != nil {
 			return "", err
 		}
 	} else {
-		srcImage, err := fshAbs.OpenFile(file, os.O_RDONLY, 0775)
-		if err != nil {
-			return "", err
-		}
-		defer srcImage.Close()
-		img, _, err = image.Decode(srcImage)
-		if err != nil {
-			return "", err
+		//Other image formats
+		if fsh.RequireBuffer {
+			//This fsh is remote. Buffer to RAM
+			imageBytes, err := fshAbs.ReadFile(file)
+			if err != nil {
+				return "", err
+			}
+
+			img, _, err = image.Decode(bytes.NewReader(imageBytes))
+
+			if err != nil {
+				return "", err
+			}
+		} else {
+			srcImage, err := fshAbs.OpenFile(file, os.O_RDONLY, 0775)
+			if err != nil {
+				return "", err
+			}
+			defer srcImage.Close()
+			img, _, err = image.Decode(srcImage)
+			if err != nil {
+				return "", err
+			}
 		}
 	}
 
@@ -69,6 +86,10 @@ func generateThumbnailForImage(fsh *filesystem.FileSystemHandler, cacheFolder st
 		Mode:   cutter.Centered,
 	})
 
+	if err != nil {
+		return "", err
+	}
+
 	//Create the thumbnail
 	out, err := fshAbs.Create(cacheFolder + filepath.Base(file) + ".jpg")
 	if err != nil {
@@ -87,3 +108,8 @@ func generateThumbnailForImage(fsh *filesystem.FileSystemHandler, cacheFolder st
 		return "", nil
 	}
 }
+
+func handleWebpDecoding(fileContent []byte) (image.Image, error) {
+	img, err := webp.Decode(bytes.NewReader(fileContent))
+	return img, err
+}

+ 1 - 1
src/mod/filesystem/metadata/metadata.go

@@ -161,7 +161,7 @@ func (rh *RenderHandler) generateCache(fsh *filesystem.FileSystemHandler, cacheF
 	}
 
 	//Generate resized image for images
-	imageFormats := []string{".png", ".jpeg", ".jpg"}
+	imageFormats := []string{".png", ".jpeg", ".jpg", ".webp"}
 	if utils.StringInArray(imageFormats, strings.ToLower(filepath.Ext(rpath))) {
 		img, err := generateThumbnailForImage(fsh, cacheFolder, rpath, generateOnly)
 		rh.renderingFiles.Delete(rpath)

+ 0 - 1
src/mod/filesystem/metadata/raw_test.go

@@ -2,7 +2,6 @@ package metadata
 
 import (
 	"encoding/binary"
-	"fmt"
 	"os"
 	"testing"
 )

BIN
src/web/Photo/img/pwa/2f772464-d2e6-4e31-9b2a-7ee56d757181.png