Cómo dibujar una imagen bonita con código

prefacio

Con el desarrollo gradual de la tecnología informática, se ha vuelto muy fácil realizar operaciones de pintura con las poderosas capacidades de las computadoras. El nivel de los trabajos de pintura también es cada vez más alto. Echemos un vistazo a las cosas interesantes que se pueden crear pintando con lenguajes de programación, y cuáles son las cosas en las que vale la pena pensar en comparación con la creación humana.

cuadro

La forma más primitiva de generar algo similar a pintar con código es usar la función de impresión directamente.

imprimir caracteres de salida

def do_print():
    print('''

        へ     /|
      /\7    ∠_/
      / │   / /
     │ Z _,< /   /`ヽ
     │     ヽ   /  〉
      Y     `  /  /
     イ● 、 ●  ⊂⊃〈  /
     ()  へ    | \〈
      >ー 、_  ィ  │ //
      / へ   / ノ<| \\
      ヽ_ノ  (_/  │//
      7       |/
      >―r ̄ ̄`ー―_
     ''')

Después de ejecutar este método, puede ver la siguiente pintura linda de Pikachu en la consola.

Por favor agregue la descripción de la imagen

Se puede decir que este enfoque no tiene ningún nivel técnico. Si desea dibujar algo, debe organizar los personajes de antemano, lo cual es demasiado problemático. Así que hay una versión actualizada.

Imagen al personaje

Este tipo de conversión de imágenes en personajes puede parecer sin sentido, pero de hecho, a veces se pueden crear obras inesperadas. Por ejemplo, el muelle de hielo de la corriente superior hace un tiempo.

Por favor agregue la descripción de la imagen

En general, la idea de este enfoque es tomar la información de píxeles de la imagen de muestra de la imagen y luego imprimir la información de brillo clave en la información de píxeles con una cadena especial, y el efecto es lo que finalmente vemos. .

public static void printImage(BufferedImage image) throws IOException {
    
    
    final char[] PIXEL_CHAR_ARRAY = {
    
    'W', '@', '#', '8', '&', '*', 'o', ':', '.', ' '};
    int width = image.getWidth();
    int height = image.getHeight();
    for (int i = 0; i < height; i++) {
    
    
        for (int j = 0; j < width; j++) {
    
    
            int rgb = image.getRGB(j, i);
            Color color = new Color(rgb);
            int red = color.getRed();
            int green = color.getGreen();
            int blue = color.getBlue();
            // 一个用于计算RGB像素点灰度的公式
            Double grayscale = 0.2126 * red + 0.7152 * green + 0.0722 * blue;
            double index = grayscale / (Math.ceil(255 / PIXEL_CHAR_ARRAY.length) + 0.5);
            System.out.print(PIXEL_CHAR_ARRAY[(int)(Math.floor(index))]);
        }
        System.out.println();
    }
}

Para una implementación más específica, consulte Pintura de personajes , usé el personaje para dibujar un hoyuelo de hielo .

Dibujo usando la biblioteca Python-turtle

Se puede decir que las siguientes respuestas de los usuarios de Zhihu son de muy alto nivel.

import random
import turtle
from turtle import *

t = turtle.Turtle()
w = turtle.Screen()


def tree(branchLen, t):
    if branchLen > 3:
        if 8 <= branchLen <= 12:
            if random.randint(0, 2) == 0:
                t.color('snow')
            else:
                t.color('lightcoral')
            t.pensize(branchLen / 3)
        elif branchLen < 8:
            if random.randint(0, 1) == 0:
                t.color('snow')
            else:
                t.color('lightcoral')
            t.pensize(branchLen / 2)
        else:
            t.color('sienna')
            t.pensize(branchLen / 10)

        t.forward(branchLen)
        a = 1.5 * random.random()
        t.right(20 * a)
        b = 1.5 * random.random()
        tree(branchLen - 10 * b, t)
        t.left(40 * a)
        tree(branchLen - 10 * b, t)
        t.right(20 * a)
        t.up()
        t.backward(branchLen)
        t.down()


def petal(m, t):  # 树下花瓣
    for i in range(m):
        a = 200 - 400 * random.random()
        b = 10 - 20 * random.random()
        t.up()
        t.forward(b)
        t.left(90)
        t.forward(a)
        t.down()
        t.color("lightcoral")
        t.circle(1)
        t.up()
        t.backward(a)
        t.right(90)
        t.backward(b)


def main():
    t = turtle.Turtle()
    myWin = turtle.Screen()
    getscreen().tracer(5, 0)
    turtle.screensize(bg='wheat')
    t.left(90)
    t.up()
    t.backward(150)
    t.down()
    t.color('sienna')
    tree(60, t)
    petal(100, t)

    myWin.exitonclick()


if __name__ == '__main__':
    main()


Como puede ver, utilizando la biblioteca de tortugas con un sólido conocimiento de la geometría matemática, puede crear imágenes muy atractivas. Para obtener más información, consulte esta pregunta

Pintar con IA

Gráfico ERNIE-ViLG Vincent

El contenido elaborado con el esquema anterior es generalmente más rígido y carece de cierto sabor humanista. Faltan algunas de las características que solo los humanos pueden tener. Sin embargo, con la mejora de la potencia informática de la IA y el desarrollo gradual del big data, ya existen muchas plataformas que pueden utilizar la IA para pintar. Por ejemplo, Baidu Feizo Wenxin modelo grande plataforma ERNIE-ViLG Wenshengtu.

import wenxin_api
from wenxin_api.tasks.text_to_image import TextToImage
import secret


def draw(t, s):
    wenxin_api.ak = secret.ak
    wenxin_api.sk = secret.sk
    input_dict = {
    
    
        "text": t,
        "style": s
    }
    rst = TextToImage.create(**input_dict)
    print(rst)


if __name__ == '__main__':
    text = "夏天"
    style = "油画"
    draw(text, style)

Usando el código anterior, puede crear un estilo de pintura al óleo de verano , puede ver los resultados generados por IA.

2022-08-28 12:20:06,785 - model is painting now!, 
- taskId: 1062408, waiting: 30s
{
    
    'imgUrls': ['https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828fex', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828fi4', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828f5q', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828f30', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828fv9', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/89df26b9853d837d331d626ffa62828fa2']}

Se puede ver que la velocidad sigue siendo muy rápida y se hará en menos de un minuto. Puedes previsualizar el resultado






Se puede ver que todavía es muy poderoso, y el nivel debería poder alcanzar a los graduados de colegios universitarios, pero la velocidad de pintura es un golpe de reducción de dimensionalidad.

El uso de ERNIe-ViLG con palabras clave personalizadas puede generar imágenes en varios estilos, como acuarela, pintura al óleo, pintura con tiza, dibujos animados, pintura con crayones, pintura infantil, etc.

Puedes volver a probar el Tianlong Babu en el estilo de acuarela .






¿Sigue siendo un sentimiento?

DESDE Y 2

Por supuesto, cuando se trata de pintura de IA, también hay grandes empresas extranjeras. Como DALL·E 2 de OpenAI .

Por ejemplo, cree una imagen de un astronauta montando a caballo con un estilo realista.

Por favor agregue la descripción de la imagen

cambiar el estilo de dibujo a lápiz

Por favor agregue la descripción de la imagen

Usando DALL·E 2, puede crear trabajos muy imaginativos por IA de acuerdo con el estilo creativo y más palabras clave. Puede ir a la página de inicio de DALL·E 2 para obtener más detalles.

Resumir

De hecho, usando código para dibujar gráficos directamente, hay muchas otras soluciones. Por ejemplo, el famoso MATLAB puede crear una geometría matemática muy sofisticada.

Pero comparando los esquemas anteriores, se puede decir que el nivel de pintura de IA ha mejorado varios niveles a la vez. El input requerido para la creación es cada vez más claro, más conciso y más humanizado. Sin embargo, el contenido de la producción ha comenzado a acercarse o incluso superar el nivel de los seres humanos.

Documentación de referencia

Supongo que te gusta

Origin blog.csdn.net/TOYOTA11/article/details/126575202
Recomendado
Clasificación