codinggames

Transformando páginas de mangá para leitores ocidentais preguiçosos

Quando ser preguiçoso é a única opção

Escrito em 1 de maio de 2024 - 🕒 8 min. de leitura

Navegar pelas complexidades do mangá como um leitor ocidental pode ser comparável a depurar código assembly: frustrante e com um alto risco de errar completamente. Mas não tema, meus companheiros desajustados de mangá! Com uma pitada de código Python e uma boa dose de habilidade em programação, criei um script magistral para adaptar as páginas de mangá para o consumo ocidental.

Então, se você é meio preguiçoso, como eu, este script é para você.

Aviso: Este projeto é uma exploração divertida no processamento de imagens com Python. Não tem a intenção de depreciar a experiência tradicional de mangá, mas sim oferecer uma alternativa para aqueles que possam ter dificuldades com ela.

Mas… por quê?

Como um fã colossal de Dragon Ball, esperar pela nova temporada de “Dragon Ball Super” tem se sentido como uma tarefa impossível, mesmo já tendo esperado por sete anos. Com a nova temporada ainda sem confirmação de que vai acontecer, e Dragon Ball Daima logo ali, minha única alternativa para finalmente descobrir quem é Moro foi o mangá. No entanto, o formato tradicional do mangá, lido da direita para a esquerda, destrói completamente meu cérebro de macaco (talvez com algumas tendências disléxicas) e hábitos de leitura ocidentais.

Este projeto FOSS é apresentado por

easyOCR

Vamos reservar um momento para cantar os louvores do easyOCR, o herói deste projeto. Ele não apenas lê texto de imagens — ele fornece as coordenadas precisas (x, y) junto com largura e altura.

Isso é crucial porque, em nosso script, saber onde o texto está localizado é o primeiro passo no processo mágico de virá-lo corretamente, e a maioria das ferramentas de OCR não oferece esse nível de detalhe. Com essa informação, podemos espelhar a imagem mantendo o texto no lugar certo, para que seja lido da esquerda para a direita.

Você pode ler mais sobre o easyOCR aqui.

ChatGPT

ChatGPT é como aquele amigo que insiste em ler as instruções quando você só quer montar os móveis e ver o que acontece.

Foi ótimo trabalhar com o easyOCR e o PIL para ler os dados e manipular as imagens, mas quando chegou a hora de virar o texto para a posição correta, eu precisei de um pouco mais de ajuda.

Além disso, coisas como fazer o script funcionar com diferentes parâmetros da linha de comando e escrever o arquivo README.md, o ChatGPT estava lá para me ajudar.

Bem, na verdade para o arquivo README.md, eu apenas usei o Copilot, já que ele tinha o contexto completo do código e do projeto. Mas eu acho que dá no mesmo, né?

A arte da procrastinação

Eu poderia ter gastado meu tempo aprendendo a ler mangá do modo tradicional, mas onde está a diversão nisso? Em vez disso, decidi criar um script Python que fizesse o trabalho pesado por mim. E assim nasceu o Manga to Comics Converter.

O Espelho Mágico ✨

Ok, mas como podemos fazer isso sem ter que redesenhar toda a página do mangá? Vamos realmente contratar alguém no Fiverr para fazer isso por nós? Não, não vamos. Vamos usar Python.

Imagine espelhar uma página de mangá de uma maneira que não faça seu cérebro doer. É isso que estamos fazendo aqui.

Viramos toda a imagem horizontalmente, mas reposicionamos cuidadosamente o texto, para que ele seja lido da esquerda para a direita, assim como um quadrinho ocidental. É um pouco como um livro de adesivos, onde você pode descolar o texto, usar Python para virar a página horizontalmente e colá-lo de volta do outro lado. Era assim que funcionava antigamente, certo?

Um garoto colocando adesivos em um livro de adesivos, de onde emerge uma cobra Python para ajudar
Um garoto colocando adesivos em um livro de adesivos, de onde emerge uma cobra Python para ajudar

(isso é o que a DALL·E acha que a piada acima parece)

Programando

Como mencionado anteriormente, graças ao mapeamento meticuloso de texto do easyOCR, podemos identificar onde os blocos de texto começam e terminam. Usamos essa informação para evitar que nosso texto se torne uma bagunça espelhada ilegível após ser virado.

Então, primeiro criamos uma função chamada extract_text_from_manga que carrega a imagem e usa o easyOCR para detectar os blocos de texto e suas coordenadas, e retorna um JSON com os dados.

def extract_text_from_manga(base_image):
    reader = easyocr.Reader(['en'])
    if isinstance(base_image, Image.Image):
        base_image = np.array(base_image)

    results = reader.readtext(base_image, detail=1)
    extracted_data = []
    for result in results:
        data = {
            "text": result[1],
            "location": [int(point) for point in result[0][0]],
            "width": int(result[0][2][0] - result[0][0][0]),
            "height": int(result[0][2][1] - result[0][0][1])
        }
        extracted_data.append(data)
    return json.dumps(extracted_data, ensure_ascii=False)

Com esses dados, agora podemos reposicionar os textos criando uma nova função, create_image_with_inverted_text_placement, que recebe os dados de posição do texto e cria uma nova imagem.

Esta função adiciona os textos às suas respectivas posições, mas os inverte horizontalmente. Por exemplo, se um texto está originalmente posicionado em 10 em uma imagem com uma largura de 100, sua nova posição torna-se 90 devido à inversão (calculada como 100 - 10 = 90).

def create_image_with_inverted_text_placement(base_image, data):
    width, height = base_image.size
    new_image = Image.new('RGBA', (width, height), (255, 255, 255, 0))

    data = json.loads(data)
    for index, item in enumerate(data):
        x, y = item['location']
        box_width, box_height = item['width'], item['height']
        if box_width <= 0 or box_height <= 0:
            continue

        new_x = width - x - box_width
        cropped_image = base_image.crop((x, y, x + box_width, y + box_height))
        cropped_image = cropped_image.convert('RGBA')
        new_image.paste(cropped_image, (new_x, y), cropped_image)

    return new_image

Agora o último passo é pegar a imagem original, virá-la horizontalmente e colar a imagem transparente com os textos em cima dela. Isso é feito pela função overlay_flipped_with_transparent, que recebe a imagem base, a imagem transparente com o texto e o caminho para salvar a imagem de saída final.

A função vira a imagem base, a converte para RGBA e então usa Image.alpha_composite para sobrepor a imagem virada com a imagem transparente. Por fim, ela salva a imagem de saída no caminho especificado.

def overlay_flipped_with_transparent(base_image, transparent_image, final_output_image_path='final_output_image.png'):
    flipped_base_image = base_image.transpose(Image.FLIP_LEFT_RIGHT).convert('RGBA')

    if transparent_image.mode != 'RGBA':
        transparent_image = transparent_image.convert('RGBA')

    combined_image = Image.alpha_composite(flipped_base_image, transparent_image)

    if final_output_image_path.lower().endswith('.jpg') or final_output_image_path.lower().endswith('.jpeg'):
        combined_image = combined_image.convert('RGB')

    combined_image.save(final_output_image_path)

Então, juntando tudo, agora podemos extrair o texto da imagem do mangá, inverter as posições do texto e sobrepor a imagem virada com o texto na posição correta. O resultado é uma página de mangá que se lê da esquerda para a direita, assim como um quadrinho ocidental.

def do_task(base_image, final_output_image_path):
    if isinstance(base_image, str):
        base_image = Image.open(base_image)
    extracted_text = extract_text_from_manga(base_image)
    base_image = Image.open(base_image) if isinstance(base_image, str) else base_image
    transparent_image = create_image_with_inverted_text_placement(base_image, extracted_text)
    overlay_flipped_with_transparent(base_image, transparent_image, final_output_image_path)

E é isso! Claro, há mais código para lidar com diferentes cenários, como processar várias imagens ou arquivos CBR, mas a lógica principal permanece a mesma. Você pode conferir o script completo aqui.

Como usar

Para começar com o Manga to Comics Converter, você primeiro precisa garantir que seu ambiente esteja configurado corretamente:

  1. Clone ou Baixe o Script: Obtenha uma cópia do script de nosso repositório. Se você está familiarizado com o Git, pode cloná-lo; caso contrário, basta baixar o arquivo zip e extrair para um local conveniente em seu computador.

  2. Instale as Dependências: Abra seu terminal e navegue até o diretório do script. Instale todas as dependências necessárias executando:

    pip install -r requirements.txt
  3. Prepare seus arquivos de mangá: Certifique-se de que suas páginas de mangá estejam em um formato suportado (formatos comuns de imagem como JPG, PNG são perfeitos). Organize as páginas em um único diretório se você tiver vários arquivos.

  4. Execute o Script: Use a linha de comando para especificar o diretório de origem e o diretório de saída. Se você não especificar um diretório de saída, o script criará um automaticamente. Veja como você pode executar o script:

    • Para converter uma única página de mangá:
      python3 script.py --source manga_page.jpg --output comic_folder
    • Para converter várias páginas armazenadas em uma pasta:
      python3 script.py --source manga_folder --output comic_folder
    • Para converter um arquivo CBR:
      python3 script.py --source manga.cbr --output comic_folder
  5. Verifique os resultados: Depois que o script terminar de processar, verifique o diretório de saída para suas novas páginas de quadrinhos transformadas.

Considerações

Embora o Manga to Comics Converter tenha como objetivo simplificar sua experiência de leitura de mangá, há alguns pontos a serem considerados:

  • Qualidade do Reconhecimento de Texto: A precisão da detecção de texto pode variar com base na qualidade das imagens do mangá. Imagens de alta resolução tendem a produzir melhores resultados.
  • Nuanças Culturais: A inversão das imagens às vezes pode perturbar a intenção artística original ou o fluxo da história. Certos elementos visuais destinados a estar em um lado da página podem não se traduzir bem quando espelhados.
  • Desempenho: O processamento de várias páginas de mangá ou de alta resolução pode ser intensivo computacionalmente, especialmente se você não estiver usando uma GPU.
  • Falhas Específicas: Se o texto sobrepuser elementos visuais significativos (como um “BOOOM” no meio de um desenho de personagem), a parte da imagem sob o texto será virada, o que poderia resultar em uma visualização com falha. Isso ocorre devido ao script virar a página inteira, exceto as áreas de texto.

página de mangá com falha
página de mangá com falha

Conclusão

Nós construímos uma ponte entre Oriente e Ocidente com algumas linhas de Python, transformando mangás de leitura da direita para a esquerda em quadrinhos de leitura da esquerda para a direita. Agora, você pode desfrutar de “Dragon Ball Super” sem sentir que está lendo um livro em um espelho.

Tags:


Publicar um comentário

Comentários

Nenhum comentário.