Existe uma biblioteca Python para gerar .ico arquivos?

votos
13

Eu estou olhando para criar favicon.icoarquivos de programação do Python, mas PIL só tem suporte para leitura de icoarquivos.

Publicado 05/09/2008 em 09:26
fonte usuário
Em outras línguas...                            


6 respostas

votos
7

Talvez a seguir funcionaria:

  • Gerar sua imagem ícone usando PIL
  • Converter a imagem para .ico formato usando a interface python para ImageMagick, PythonMagick

Eu não tentei esta abordagem. O ImageMagick converter programa de linha de comando foi capaz de converter um arquivo PNG para .ico formato, assim pelo menos ImageMagick suporta o formato .ico.

Respondeu 05/09/2008 em 09:36
fonte usuário

votos
3

Eu não sei se isto se aplica a todos os casos, mas em WinXP um ico pode ser uma bmp de tamanho 16x16, 32x32 ou 64x64. Basta alterar a extensão para ico de bmp e você está pronto para ir.

Respondeu 05/09/2008 em 09:38
fonte usuário

votos
7

De acordo com a Wikipédia navegadores modernos podem lidar com favicons em formato PNG, então talvez você poderia simplesmente gerar isso?

Alternativamente, o artigo ICO descreve o formato ...

Respondeu 05/09/2008 em 12:35
fonte usuário

votos
9

Você pode usar Pillow :

from PIL import Image
filename = r'logo.png'
img = Image.open(filename)
img.save('logo.ico')

Opcionalmente, você pode especificar os tamanhos de ícones que você quer:

icon_sizes = [(16,16), (32, 32), (48, 48), (64,64)]
img.save('logo.ico', sizes=icon_sizes)

Os docs almofada dizer que por padrão ele irá gerar tamanhos [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (255, 255)]e qualquer tamanho maior do que o tamanho original ou 255 será ignorado.

Sim, é na leitura apenas parte dos documentos, mas funciona até certo ponto.

Respondeu 22/03/2016 em 23:49
fonte usuário

votos
0

Se você tem ImageIO , (provavelmente a melhor biblioteca para leitura / gravação de imagens em Python), você pode usá-lo:

import imageio

img = imageio.imread('logo.png')
imageio.imwrite('logo.ico', img)

Instalar é tão fácil como

pip install imageio
Respondeu 14/09/2018 em 13:25
fonte usuário

votos
0

Embora esta questão é bastante velho, é resultado de uma pesquisa proeminente para usar Python para converter arquivos PNG para ICO, então eu pensei que vai adicionar meus dois centavos.

Se tudo que você quer é um favicon, a resposta de Douglas Leeder parece perfeitamente bem para mim. Se você tem um arquivo PNG de alta resolução de seu logotipo e quer convertê-lo em um arquivo ICO, a resposta de Ronan Paixão é, provavelmente, a maneira mais fácil de ir.

Mas um arquivo ICO pode conter várias imagens, destinados a diferentes resoluções, e muitas vezes eu me vi na situação de querer ter o controle de grão fino sobre essas resoluções diferentes, para evitar infelizes efeitos anti-aliasing, o que significa que eu quero para fornecer cada resolução da imagem individualmente. O que significa que eu quero converter não um único, mas vários arquivos PNG em um único arquivo ICO. Tanto quanto eu posso ver, o pacote Pillow não fornece esta capacidade. Felizmente, um arquivo ICO moderna pode conter vários arquivos PNG dentro, assim que a tarefa se resume ao simples desafio de escrever algumas entradas de cabeçalho. Dependendo da situação, eu escrevi duas funções, o primeiro basicamente a solução de Ronan Paixão, enquanto o segundo fornece a funcionalidade para juntar vários arquivos PNG em um arquivo ICO:

from pathlib import Path
from PIL import Image


def bake_one_big_png_to_ico(sourcefile, targetfile, sizes=None):
    """Converts one big PNG into one ICO file.

    args:
        sourcefile (str): Pathname of a PNG file.
        targetfile (str): Pathname of the resulting ICO file.
        sizes (list of int): Requested sizes of the resulting
            icon file, defaults to [16, 32, 48].

    Use this function if you have one big, square PNG file
    and don’t care about fine-tuning individual icon sizes.

    Example::

        sourcefile = "Path/to/high_resolution_logo_512x512.png"
        targetfile = "Path/to/logo.ico"
        sizes = [16, 24, 32, 48, 256]
        bake_one_big_png_to_ico(sourcefile, targetfile, sizes)
    """
    if sizes is None:
        sizes = [16, 32, 48]
    icon_sizes = [(x, x) for x in sizes]
    Image.open(sourcefile).save(targetfile, icon_sizes=icon_sizes)


def bake_several_pngs_to_ico(sourcefiles, targetfile):
    """Converts several PNG files into one ICO file.

    args:
        sourcefiles (list of str): A list of pathnames of PNG files.
        targetfile (str): Pathname of the resulting ICO file.

    Use this function if you want to have fine-grained control over
    the resulting icon file, providing each possible icon resolution
    individually.

    Example::

        sourcefiles = [
            "Path/to/logo_16x16.png",
            "Path/to/logo_32x32.png",
            "Path/to/logo_48x48.png"
        ]
        targetfile = "Path/to/logo.ico"
        bake_several_pngs_to_ico(sourcefiles, targetfile)
    """

    # Write the global header
    number_of_sources = len(sourcefiles)
    data = bytes((0, 0, 1, 0, number_of_sources, 0))
    offset = 6 + number_of_sources * 16

    # Write the header entries for each individual image
    for sourcefile in sourcefiles:
        img = Image.open(sourcefile)
        data += bytes((img.width, img.height, 0, 0, 1, 0, 32, 0, ))
        bytesize = Path(sourcefile).stat().st_size
        data += bytesize.to_bytes(4, byteorder="little")
        data += offset.to_bytes(4, byteorder="little")
        offset += bytesize

    # Write the individual image data
    for sourcefile in sourcefiles:
        data += Path(sourcefile).read_bytes()

    # Save the icon file
    Path(targetfile).write_bytes(data)

Os pressupostos de código que seus arquivos PNG são imagens RGBA de 32 bits-por-pixel. Caso contrário, o número 32 no código acima teria de ser alterado e deve ser substituído por alguns Pillow-image-sniffing.

Respondeu 08/11/2019 em 17:47
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more