Menos de 100 linhas de código Python para fazer um gerador de imagem Jiugongge, círculo legal de amigos!

Este tipo de estilo de arranjo de imagens abaixo do círculo de amigos será familiar para todos, e há algo sobre o recrutamento de emprego

Snipaste_2020-08-02_19-48-58.png

Parabéns,

Snipaste_2020-08-02_19-49-57.png

Peneirando suas lindas fotos,

Snipaste_2020-08-02_19-51-37.png

Este tipo de imagem é chamado de estilo de imagem de 9 quadrados porque a imagem é organizada em 3 * 3. O princípio da geração de imagem é dividir uma imagem em 9 fragmentos em proporções iguais por área. Você só precisa de você mesmo quando está no círculo de amigos. Basta ajustar o posicionamento dos fragmentos de imagem.

Embora o princípio de fazer 9 grades quadradas seja relativamente simples, sua adição torna a dinâmica de apenas uma imagem no círculo de amigos visualmente melhorada a um nível

A seguir, este artigo apresentará como usar Python para converter uma imagem em uma grade de 9 quadrados e adicionar uma interface GUI para empacotá-la em um programa. Vamos dar uma olhada no efeito de visualização do programa:

Recording_2020_08_02_19_41_58_289.gif

A configuração do ambiente produzida desta vez é apresentada da seguinte forma:

  • Python 3.7;
  • Opencv: 3,4;
  • PyQt5: 5,9;

Etapas de produção

Primeiro, vamos primeiro converter a ideia básica da conversão de imagem Jiugongge:

  • 1. Transforme a imagem em um quadrado primeiro e preencha os lados insuficientes com pixels brancos;
  • 2. Encontre as três distâncias equidistantes da imagem, divida a imagem em 9 áreas na forma de recursiva e armazene-as como uma lista, porque a imagem aqui é representada na forma de uma matriz, por isso está bem dividida de acordo ao formulário de matriz;
  • 3. Armazene a lista de imagens obtida dividindo 2 separadamente e use o nome do arquivo para numeração;

O código principal é o seguinte:

 if self.open_file_path and self.save_file_path:
            try:
                img = cv2.imread(self.open_file_path)
                if len(img.shape) == 2: # 判断是否为灰度图
                    last_dim = 1
                else:
                    last_dim = 3
                if img.shape[0] != img.shape[1]:
                    # 长宽不一致
                    new_image = np.zeros((max(img.shape), max(img.shape), last_dim), dtype=np.uint8) + 255
                    # 图像填充
                    new_image[
                    int((new_image.shape[0] - img.shape[0]) / 2):img.shape[0] + int((new_image.shape[0] - img.shape[0]) / 2),
                    int((new_image.shape[1] - img.shape[1]) / 2):img.shape[1] + int((new_image.shape[1] - img.shape[1]) / 2),:] = img
                else:
                    new_image = img
                # 开始进行图像分割
                col_width = int(new_image.shape[0] / 3)

                # 得到九宫格图像
                image_list = [new_image[i * col_width:(i + 1) * col_width, j * (col_width):(j + 1) * col_width, :] for i in
                              range(3) for j in range(3)]
                for i in range(9):
                    image_name = str(i)
                    save_image_path = os.path.join(self.save_file_path, f'{image_name}.png')
                    cv2.imwrite(save_image_path, np.array(image_list[i]))
                    print(f'save {image_name} sucessfully!')
                QMessageBox.information(self,'info','转换完成!')
            except Exception as e:
                print(e)
                QMessageBox.warning(self,'error',f'转换失败{str(e)}')
        else:
            QMessageBox.information(self,'err','文件为空,请重新操作')

Encapsulamento GUI

A segunda parte é o encapsulamento da GUI. Aqui eu uso PyQt5 para criar um componente QWidgt, coloco três botões e dois LineEdit, um total de 5 componentes, porque não há atributos (cor, plano de fundo, efeitos interativos) definidos e nenhum layout. Portanto, o programa é relativamente simples

Snipaste_2020-08-02_20-31-59.png

No programa, a interface também é adicionada a algum processamento de informações incomuns, como endereço de abertura está vazio, a conversão falha, o programa dará um prompt, como o seguinte que, na ausência de clique em Selecionar pasta para iniciar a conversão botão , dada mensagem de erro

Snipaste_2020-08-02_20-39-06.png

A parte principal do código da interface GUI:

    def open_origin_file(self):
        open_file = QFileDialog.getOpenFileName(None,"Open File","C:/","Image (*.png)")
        if open_file[0]:
            print(open_file[0])
            self.open_file_path = open_file[0]
            self.line_edit.setText(self.open_file_path)
        else:
            QMessageBox.warning(self,"info","Fail to open file, please try it again!")

    def save_file(self):

        open_file = QFileDialog.getExistingDirectory(None,'Open File','C:/')
        if open_file:
            print(open_file)
            self.save_file_path = open_file
            self.line_edit1.setText(str(self.save_file_path))
        else:
            QMessageBox.warning(self,'info','Fail to open file, Please try it again!')

Aqui encontrei uma imagem para testar este pequeno programa, a imagem é um personagem de anime-Pikachu, o efeito é o seguinte,

Snipaste_2020-08-02_20-55-46.png

Finalmente, encontrei uma imagem aleatoriamente e enviei para o círculo de amigos. O resultado é a segunda imagem abaixo (a imagem original é a primeira). Objetivamente falando, o efeito visual de uma única imagem não melhorou. O principal motivo é A proporção de comprimento, largura e altura da imagem original é inconsistente, ou seja, para algumas imagens com inconsistências de comprimento e largura, é melhor recortar a imagem antes de convertê-la em uma grade de nove quadrados, caso contrário, é não é adequado para conversão em uma grade de nove quadrados.

Imagem original

1.png

Imagens convertidas diretamente, sem cortes

WeChat Picture_20200807235727.jpg

Imagem convertida após corte

WeChat image_20200808001007.jpg

Depois de cortar os efeitos visuais convertidos melhoraram significativamente, pequenos parceiros também estão interessados ​​em tentar, o código-fonte completo do artigo, Sr. público No. [Z] pontos de fundo em quadrados de resposta de mente pode obter.

Ok, o acima é todo o conteúdo deste artigo, e obrigado a todos pela leitura!

Acho que você gosta

Origin blog.csdn.net/weixin_42512684/article/details/107904375
Recomendado
Clasificación