aboutsummaryrefslogtreecommitdiff
path: root/utils/transformers
diff options
context:
space:
mode:
Diffstat (limited to 'utils/transformers')
-rw-r--r--utils/transformers/image.go73
-rw-r--r--utils/transformers/tokens.go7
2 files changed, 79 insertions, 1 deletions
diff --git a/utils/transformers/image.go b/utils/transformers/image.go
index a88d8bb..e392f7f 100644
--- a/utils/transformers/image.go
+++ b/utils/transformers/image.go
@@ -1,6 +1,77 @@
package transformers
-import "imageboard/config"
+import (
+ "image"
+ "imageboard/config"
+ "imageboard/models"
+ "imageboard/utils/format"
+ "imageboard/utils/validators"
+ "strings"
+)
+
+func TransformImageToVariant(img image.Image, variant config.ImageSizeType) (models.ImageSize, image.Image, error) {
+ variantSizeMap := map[config.ImageSizeType]int{
+ config.ImageSizeTypeIcon: 64,
+ config.ImageSizeTypeThumbnail: 256,
+ config.ImageSizeTypeSmall: 512,
+ config.ImageSizeTypeMedium: 1024,
+ config.ImageSizeTypeLarge: 2048,
+ config.ImageSizeTypeOriginal: 0, // Original size, no resizing
+ }
+
+ maxWidth := variantSizeMap[variant]
+ if maxWidth > 0 {
+ img = ResizeImage(img, maxWidth)
+ }
+
+ fileSize := format.GetImageFileSize(img)
+
+ return models.ImageSize{
+ SizeType: variant,
+ Width: img.Bounds().Dx(),
+ Height: img.Bounds().Dy(),
+ FileSize: fileSize,
+ }, img, nil
+}
+
+func ResizeImage(img image.Image, maxWidth int) image.Image {
+ if maxWidth <= 0 || img.Bounds().Dx() <= maxWidth {
+ return img
+ }
+
+ ratio := float64(maxWidth) / float64(img.Bounds().Dx())
+ newWidth := int(float64(img.Bounds().Dx()) * ratio)
+ newHeight := int(float64(img.Bounds().Dy()) * ratio)
+ newImg := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight))
+ for y := 0; y < newHeight; y++ {
+ for x := 0; x < newWidth; x++ {
+ srcX := int(float64(x) / ratio)
+ srcY := int(float64(y) / ratio)
+ if srcX < img.Bounds().Dx() && srcY < img.Bounds().Dy() {
+ newImg.Set(x, y, img.At(srcX, srcY))
+ }
+ }
+ }
+ return newImg
+}
+
+func CreateUniqueFileName(sourceURLOrOriginalName, imageFormat string) string {
+ fileName := sourceURLOrOriginalName
+ if validators.IsValidURL(sourceURLOrOriginalName) {
+ parts := strings.Split(sourceURLOrOriginalName, "/")
+ fileName = parts[len(parts)-1]
+ }
+
+ currentTime := format.GetCurrentTimeAsTimestamp()
+ fileNameWithoutExtension := format.RemoveExtension(fileName)
+ fileName = GenerateTokenFromString(fileNameWithoutExtension + "_" + format.Int64ToString(currentTime))
+
+ if len(fileName) > 32 {
+ mid := len(fileName) / 2
+ fileName = fileName[mid-16 : mid+16]
+ }
+ return fileName + "." + imageFormat
+}
func ConvertStringRatingToType(rating string) (config.Rating, error) {
switch rating {
diff --git a/utils/transformers/tokens.go b/utils/transformers/tokens.go
index 7ad36ed..f2f2e0b 100644
--- a/utils/transformers/tokens.go
+++ b/utils/transformers/tokens.go
@@ -1,6 +1,7 @@
package transformers
import (
+ "crypto"
"crypto/rand"
"encoding/hex"
)
@@ -12,3 +13,9 @@ func GenerateRandomToken() (string, error) {
}
return hex.EncodeToString(bytes), nil
}
+
+func GenerateTokenFromString(input string) string {
+ hasher := crypto.SHA256.New()
+ hasher.Write([]byte(input))
+ return hex.EncodeToString(hasher.Sum(nil))
+}