diff options
Diffstat (limited to 'utils/transformers')
| -rw-r--r-- | utils/transformers/image.go | 73 | ||||
| -rw-r--r-- | utils/transformers/tokens.go | 7 |
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)) +} |
