es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo implementar el recorte personalizado utilizando Golang

Estoy buscando hacer un recorte personalizado en un conjunto de imágenes. En lugar de recortar de forma normal utilizando altura y anchura, quiero la flexibilidad de obtener una imagen de salida que esté recortada como un polígono o un hexágono, por ejemplo. Estoy utilizando la biblioteca “github.com/fogleman/gg” y el módulo incorporado “image”, y “github.com/disintegration/imaging”, pero no encontré una forma de personalizar el recorte. También he buscado un servicio en línea (SaaS) para hacer esto, como imgix o imageresizer.io, pero parece que no ofrecen esa opción. Sé que Golang es el lenguaje adecuado para esto, tal vez no busqué lo suficiente, por favor, ayuda.

Mi código de muestra se ve así:

var image image.Image
dc := NewContext(1000, 1000)
image = imaging.Fill(profile, 800, 750, imaging.Center, imaging.Lanczos)
// El recorte debe ocurrir aquí
dc.DrawImage(image, 123, 250)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el recorte personalizado en un conjunto de imágenes en Golang, puedes utilizar la biblioteca github.com/fogleman/gg junto con la biblioteca github.com/disintegration/imaging. Sin embargo, estas bibliotecas no proporcionan la flexibilidad de recortar imágenes en forma de polígono o hexágono.

    Una posible solución es utilizar la biblioteca github.com/golang/freetype para dibujar una máscara de polígono o hexágono y luego aplicar la máscara a la imagen original para lograr un recorte personalizado. A continuación, se muestra un fragmento de código que demuestra este enfoque:

    package main
    
    import (
        "image"
        "image/color"
        "image/draw"
        "math"
        "os"
    
        "github.com/disintegration/imaging"
        "github.com/fogleman/gg"
        "golang.org/x/image/font"
        "golang.org/x/image/font/gofont/goregular"
        "golang.org/x/image/math/fixed"
    )
    
    func main() {
        // Cargar la imagen de entrada
        inputImg, err := imaging.Open("input.jpg")
        if err != nil {
            panic(err)
        }
    
        // Crear una máscara cuadrada con un hexágono en el interior
        maskSize := inputImg.Bounds().Size()
        mask := gg.NewContext(maskSize.X, maskSize.Y)
        mask.DrawPolygon(hextagonPoints(maskSize.X/2, maskSize.Y/2, maskSize.Y/2.5), 0)
    
        // Aplicar la máscara a la imagen de entrada
        outputImg := imaging.Overlay(inputImg, mask.Image(), image.Point{}, 0.5)
    
        // Guardar la imagen de salida en disco
        err = imaging.Save(outputImg, "output.jpg")
        if err != nil {
            panic(err)
        }
    }
    
    func hextagonPoints(cx, cy int, r float64) []gg.Point {
        const n = 6
        var points []gg.Point
        for i := 0; i < n; i++ {
            rad := float64(i)/float64(n)*2*math.Pi - math.Pi/2
            x := float64(cx) + r*math.Cos(rad)
            y := float64(cy) + r*math.Sin(rad)
            points = append(points, gg.Point{int(x), int(y)})
        }
        return points
    }
    

    El código anterior carga la imagen de entrada, crea una máscara de hexágono utilizando la biblioteca gg y aplica la máscara a la imagen de entrada utilizando la biblioteca imaging. La imagen de salida resultante se guarda en disco.

    Para personalizar la forma de recorte, puedes modificar la función hextagonPoints para que devuelva los puntos del polígono o hexágono deseados. También puedes ajustar la variable maskSize para cambiar el tamaño de la máscara y la imagen de salida.

    ¡Espero que esto te ayude! Hazme saber si tienes alguna pregunta.

Comments are closed.