Como desenhar uma bela imagem com código

prefácio

Com o desenvolvimento gradual da tecnologia informática, tornou-se muito fácil realizar operações de pintura com as poderosas capacidades dos computadores. O nível dos trabalhos de pintura também está ficando cada vez mais alto. Vamos dar uma olhada em quais coisas interessantes podem ser criadas pintando com linguagens de programação e quais são as coisas que vale a pena pensar em comparação com a criação humana.

quadro

A maneira mais primitiva de produzir algo semelhante a pintar com código é usar a função de impressão diretamente.

imprimir caracteres de saída

def do_print():
    print('''

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

Depois que esse método for executado, você poderá ver a seguinte pintura fofa do Pikachu no console.

Por favor, adicione a descrição da imagem

Pode-se dizer que esta abordagem não tem nenhum nível técnico. Se você quer desenhar alguma coisa, você tem que organizar os personagens com antecedência, o que é muito problemático. Portanto, há uma versão atualizada.

Imagem para personagem

Esse tipo de conversão de imagens em personagens pode parecer sem sentido, mas na verdade, às vezes, trabalhos inesperados podem ser criados. Por exemplo, o píer de gelo da corrente superior há um tempo atrás.

Por favor, adicione a descrição da imagem

Em geral, a ideia dessa abordagem é pegar as informações de pixel da imagem amostrada da imagem e, em seguida, imprimir as principais informações de brilho nas informações de pixel com uma string especial, e o efeito é o 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 uma implementação mais específica, consulte Pintura de Personagem , usei o personagem para desenhar uma covinha de gelo .

Desenhando usando a biblioteca Python-turtle

As respostas de alguns usuários de Zhihu a seguir podem ser consideradas de alto nível.

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 você pode ver, usando a biblioteca turtle com um forte conhecimento de geometria matemática, você pode criar imagens muito bonitas. Para obter mais informações, consulte esta pergunta

Pintando com IA

ERNIE-ViLG Vincent Chart

O conteúdo desenhado usando o esquema acima é geralmente mais rígido e carece de algum sabor humanístico. Faltam algumas das características que os humanos só podem ter. No entanto, com a melhoria do poder de computação da IA ​​e o desenvolvimento gradual do big data, já existem muitas plataformas que podem usar a IA para pintar. Por exemplo, Baidu Feizo Wenxin grande modelo 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 o código acima, você pode criar um estilo de pintura a óleo de verão , você pode ver os resultados gerados pela 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']}

Pode-se ver que a velocidade ainda é muito rápida e isso será feito em menos de um minuto. Você pode visualizar o resultado






Pode-se ver que ainda é muito poderoso, e o nível deve ser capaz de alcançar os graduados das faculdades, mas a velocidade da pintura é um golpe de redução de dimensionalidade.

O uso de ERNIe-ViLG com palavras-chave personalizadas pode gerar imagens em vários estilos, como aquarela, pintura a óleo, pintura com giz, desenho animado, pintura com giz de cera, pintura infantil e assim por diante.

Você pode experimentar o Tianlong Babu no estilo aquarela novamente .






Ainda é um sentimento.

DE E 2

Claro, quando se trata de pintura de IA, também existem grandes empresas estrangeiras. Como o DALL ·E 2 da OpenAI .

Por exemplo, crie uma imagem de um astronauta andando a cavalo em um estilo realista

Por favor, adicione a descrição da imagem

mudando o estilo de desenho a lápis

Por favor, adicione a descrição da imagem

Usando DALL·E 2, você pode criar trabalhos muito imaginativos por IA de acordo com o estilo criativo e mais palavras-chave. Você pode acessar a página inicial do DALL·E 2 para obter mais detalhes.

Resumir

Na verdade, usando código para desenhar gráficos diretamente, existem muitas outras soluções. Por exemplo, o famoso MATLAB pode criar geometria matemática muito sofisticada.

Mas comparando os esquemas acima, pode-se dizer que o nível de pintura de IA melhorou vários níveis ao mesmo tempo. A entrada necessária para a criação está se tornando cada vez mais clara, mais concisa e mais humanizada. No entanto, o conteúdo da produção começou a se aproximar ou mesmo superar o nível dos seres humanos.

Documentação de referência

Acho que você gosta

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