package main import ( "github.com/fogleman/gg" "image"; "image/png"; "image/color" "fmt"; "os" "bufio"; "strings" "math/rand"; "time" ) // Pagina A4 (2480 x 3508) var pagAncho = 2480 var pagAlto = 3508 var portada = gg.NewContext(pagAncho, pagAlto) // Tamaño de Portada A4 para la Imagen (Ancho x Alto) var AltoAreaTitulo = 920 // Altura en pixeles del Area de Titulo // Colores/Temas var colorTema = color.RGBA{60, 92, 153, 255} // Color del Tema del Libro (defectoa es Azul) var colorRojo = color.RGBA{202, 31, 0, 255} var colorVerde = color.RGBA{29, 149, 27, 255} var colorAzul = color.RGBA{60, 92, 153, 255} // Azul con transparencia var colorAmarillo = color.RGBA{223, 217, 26, 255} var colorBlanco = color.RGBA{255, 255, 255, 255} // Blanco con transparencia var colorNegro = color.RGBA{0, 0, 0, 255} // Negro con transparencia // Texto var colorTextoTitulo = (color.RGBA{255, 255, 255, 230}) // Blanco con transparencia reducida var colorTextoResumen = (color.RGBA{0, 0, 0, 230}) // Negro con transparencia reducida func main() { // Generador de Portadas de Libro fmt.Println("GENERADOR DE PORTADAS PARA LIBROS") // Pedir datos leer := bufio.NewReader(os.Stdin) fmt.Println("Título: ") inTitulo, _ := leer.ReadString('\n') inTitulo = strings.Replace(inTitulo, "\n", "", -1) fmt.Println("SubTítulo: ") inSubtitulo, _ := leer.ReadString('\n') inSubtitulo = strings.Replace(inSubtitulo, "\n", "", -1) fmt.Println("Autor: ") inAutor, _ := leer.ReadString('\n') inAutor = strings.Replace(inAutor, "\n", "", -1) fmt.Println("Editorial: ") inEditorial, _ := leer.ReadString('\n') inEditorial = strings.Replace(inEditorial, "\n", "", -1) // Color Portada fmt.Println("Color de Portada [ N:Negro, R:Rojo, V:Verde, A:Azul, M:Amarillo ] ") inColor, _ := leer.ReadString('\n') inColor = strings.Replace(inColor, "\n", "", -1) switch inColor { case "N": // Negro colorTema = colorNegro //colorTema = color.RGBA{0, 0, 0, 255} case "R": // Rojo colorTema = colorRojo //colorTema = color.RGBA{202, 31, 0, 255} case "V": // Verde colorTema = colorVerde //colorTema = color.RGBA{29, 149, 27, 255} case "A": // Azul colorTema = colorAzul //colorTema = color.RGBA{60, 92, 153, 255} case "M": // Amarillo colorTema = colorAmarillo //colorTema = color.RGBA{223, 217, 26, 255} default: // defecto es Azul colorTema = colorAzul } fmt.Println("Generando Portada. Espere por favor....") // Fondo portada (x, y, ancho/width, alto/height) DibujaRectanguloColor(colorBlanco, 0, 0, portada.Width(), portada.Height()) DibujaRectanguloColor(colorTema, 0, 200, portada.Width(), AltoAreaTitulo) // Localizar imagen deseada: imagen.png -es un link de imagen en ruta ./imagen/ // Si no existe escoger imagen al azar if _, err := os.Stat("./imagen.png"); err == nil { LeerIncluirImagen("./imagen.png", 200, AltoAreaTitulo+400) } else { // imagen random f, err := os.Open("./imagenes") if err != nil { fmt.Println(err) return } files, err := f.Readdir(0) if err != nil { fmt.Println(err) return } // Random rand.Seed(time.Now().UnixNano()) min := 0 max := len(files)-1 posRandom := rand.Intn(max - min) + min LeerIncluirImagen("./imagenes/"+files[posRandom].Name(), 200, AltoAreaTitulo+400) } PonerTextoTitulo(inTitulo, 150, 135) PonerTextoResumen(inSubtitulo, 150, 72) PonerTextoEditorial(inEditorial, 100) PonerTextoAutor(inAutor, 72) // Banda superior DibujaRectanguloColor(colorTema, 60, 0, portada.Width()-120, 20) // Banda inferior DibujaRectanguloColor(colorTema, 60, pagAlto-20, portada.Width()-120, 20) portada.SavePNG("portada.png") fmt.Println("Se ha generado 'portada.png") } func DibujaRectanguloColor(c color.Color, x, y, w, h int) { portada.SetColor(c) portada.DrawRectangle(float64(x), float64(y), float64(w), float64(h)) portada.Fill() } func LeerIncluirImagen(fichImagen string, x, y int) { backgroundImage, err := gg.LoadImage(fichImagen) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } portada.DrawImage(backgroundImage, x, y) } func PonerTextoTitulo(titulo string, margin int, size int) { // Leer el fichero de la fuente ttf y fijar tamaño fuente if err := portada.LoadFontFace("./fuentes/Roboto.ttf", float64(size)); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } // Fijar color del texto y mostrar el titulo // usando un margen definido - centrando el texto mostrado // area con el Area del Titulo portada.SetColor(colorTextoTitulo) portada.DrawStringWrapped(titulo, float64(portada.Width())/2, float64(AltoAreaTitulo)/2+200, // x, y 0.5, 0.5, float64(portada.Width()-(margin*2)), 1.5, // alto linea gg.AlignLeft) } func PonerTextoResumen(resumen string, margin int, size int) { // Leer el fichero de la fuente ttf y fijar tamaño fuente if err := portada.LoadFontFace("./fuentes/Roboto.ttf", float64(size)); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } // Fijar color del texto y mostrar el titulo // usando un margen definido - centrando el texto mostrado // area con el Area del Titulo portada.SetColor(colorTextoResumen) portada.DrawStringWrapped(resumen, float64(portada.Width())/2, float64(80), // x, y 0.5, 0.5, float64(portada.Width()-(margin*2)), 1.5, // alto linea gg.AlignLeft) } func PonerTextoAutor(autor string, size int) { // Leer el fichero de la fuente ttf y fijar tamaño fuente if err := portada.LoadFontFace("./fuentes/Bebas.ttf", float64(size)); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } // Fijar color y situarlo (si amarillo autor en negro) if colorTema == colorAmarillo { portada.SetColor(colorNegro) } else { portada.SetColor(colorTema) } portada.DrawString(autor, float64(pagAncho/3*2), float64(pagAlto-130)) } func PonerTextoEditorial(editorial string, size int) { // Leer el fichero de la fuente ttf y fijar tamaño fuente if err := portada.LoadFontFace("./fuentes/Sketch.ttf", float64(size)); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } // Fijar color y situarlo portada.SetColor(colorTema) portada.DrawString(editorial, float64(140), float64(pagAlto-130)) } func SavePNG(imagen image.Image, fichero string) error { f, err := os.Create(fichero) if err != nil { return err } defer f.Close() if err := png.Encode(f, imagen); err != nil { return err } if err := f.Close(); err != nil { return err } return nil }