seekia/internal/imageEffects/imageEffects.go

156 lines
4.2 KiB
Go

// imageEffects provides functions to perform image effects
package imageEffects
import "seekia/imported/goeffects"
import "seekia/internal/imagery"
import "seekia/internal/helpers"
import "image"
import "image/draw"
import "errors"
func ApplyCartoonEffect(inputImage image.Image, effectStrength int) (image.Image, error){
if (inputImage == nil){
return nil, errors.New("ApplyCartoonEffect called with nil inputImage")
}
if (effectStrength <= 0){
return inputImage, nil
}
if (effectStrength > 100) {
effectStrength = 100
}
result, err := goeffects.ApplyCartoonEffect(inputImage, effectStrength)
return result, err
}
func ApplyPencilEffect(inputImage image.Image, effectStrength int) (image.Image, error){
if (inputImage == nil){
return nil, errors.New("ApplyPencilEffect called with nil inputImage")
}
if (effectStrength <= 0){
return inputImage, nil
}
if (effectStrength > 100) {
effectStrength = 100
}
result, err := goeffects.ApplyPencilEffect(inputImage, effectStrength)
return result, err
}
func ApplyOilPaintingEffect(inputImage image.Image, effectStrength int) (image.Image, error){
if (inputImage == nil){
return nil, errors.New("ApplyOilPaintingEffect called with nil inputImage")
}
if (effectStrength <= 0){
return inputImage, nil
}
if (effectStrength > 100) {
effectStrength = 100
}
result, err := goeffects.ApplyOilPaintingEffect(inputImage, effectStrength)
return result, err
}
func ApplyWireframeEffect(inputImage image.Image, effectStrength int) (image.Image, error){
if (inputImage == nil){
return nil, errors.New("ApplyWireframeEffect called with nil inputImage")
}
if (effectStrength <= 0){
return inputImage, nil
}
if (effectStrength > 100) {
effectStrength = 100
}
result, err := goeffects.ApplyWireframeEffect(inputImage, effectStrength, false)
return result, err
}
func ApplyStrokeEffect(inputImage image.Image, effectStrength int) (image.Image, error){
if (inputImage == nil){
return nil, errors.New("ApplyStrokeEffect called with nil inputImage")
}
if (effectStrength <= 0){
return inputImage, nil
}
if (effectStrength > 100) {
effectStrength = 100
}
result, err := goeffects.ApplyWireframeEffect(inputImage, effectStrength, true)
return result, err
}
func GetImageWithEmojiOverlay(inputImage image.Image, emojiImage image.Image, emojiScale int, xAxisPercentage int, yAxisPercentage int)(image.Image, error){
if (inputImage == nil) {
return nil, errors.New("GetImageWithEmojiOverlay called with nil inputImage.")
}
if (emojiImage == nil) {
return nil, errors.New("GetImageWithEmojiOverlay called with nil emojiImage.")
}
newImageRGBA := image.NewRGBA(inputImage.Bounds())
draw.Draw(newImageRGBA, inputImage.Bounds(), inputImage, image.Point{}, draw.Over)
imageWidth, imageHeight, err := imagery.GetImageWidthAndHeightPixels(inputImage)
if (err != nil) { return nil, err }
imageLongerSideLength := max(imageWidth, imageHeight)
// This is the length of the longest side of the emoji we will draw
emojiLongerSideMaximumLength, err := helpers.ScaleIntProportionally(true, emojiScale, 0, 100, 1, imageLongerSideLength)
if (err != nil) { return nil, err }
newEmoji, err := imagery.ResizeGolangImage(emojiImage, emojiLongerSideMaximumLength)
if (err != nil) { return nil, err }
// Now we get the X and Y Coordinate point for where we will draw the emoji
// We first find the center coordinate of the emoji we are drawing
emojiCenterXCoordinate, err := helpers.ScaleIntProportionally(true, xAxisPercentage, 0, 100, 0, imageWidth)
if (err != nil) { return nil, err }
emojiCenterYCoordinate, err := helpers.ScaleIntProportionally(false, yAxisPercentage, 0, 100, 0, imageHeight)
if (err != nil) { return nil, err }
emojiWidth, emojiHeight, err := imagery.GetImageWidthAndHeightPixels(newEmoji)
if (err != nil) { return nil, err }
// Now we find the coordinates of the top left corner of the emoji we are drawing.
pointXCoordinate := -(emojiCenterXCoordinate - (emojiWidth/2))
pointYCoordinate := -(emojiCenterYCoordinate - (emojiHeight/2))
emojiDrawPoint := image.Point{ X : pointXCoordinate, Y : pointYCoordinate }
draw.Draw(newImageRGBA, inputImage.Bounds(), newEmoji, emojiDrawPoint, draw.Over)
return newImageRGBA, nil
}