Er det en Python bibliotek for å generere Ico filer?

stemmer
13

Jeg ønsker å lage favicon.icofiler auto fra Python, men PIL har bare støtte for lesing icofiler.

Publisert på 05/09/2008 klokken 08:26
kilden bruker
På andre språk...                            


6 svar

stemmer
7

Kanskje følgende ville fungere:

  • Generere ikonet bilde ved hjelp av PIL
  • Konverter bildet til ICO format ved hjelp av python grensesnitt til ImageMagick, PythonMagick

Jeg har ikke prøvd denne tilnærmingen. ImageMagick konvertere kommandolinje program var i stand til å konvertere en PNG-fil til ICO format, så i hvert fall ImageMagick støtter ICO format.

Svarte 05/09/2008 kl. 08:36
kilden bruker

stemmer
3

Jeg vet ikke om dette gjelder for alle tilfeller, men på WinXP en Ico kan være en bmp størrelse 16x16, 32x32 eller 64x64. Bare endre filtypen til ICO fra bmp og du er klar til å gå.

Svarte 05/09/2008 kl. 08:38
kilden bruker

stemmer
7

Ifølge Wikipedia moderne nettlesere kan håndtere favicon i PNG-format, så kanskje du bare kunne generere det?

Alternativt ICO artikkelen beskriver formatet ...

Svarte 05/09/2008 kl. 11:35
kilden bruker

stemmer
11

Du kan bruke Pillow :

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

Eventuelt kan du angi ikonstørrelser du ønsker:

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

De Pillow docs si at som standard vil det generere størrelser [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (255, 255)]og alle størrelser større enn den opprinnelige størrelse eller 255 vil bli ignorert.

Ja, det er i lese- delen av docs, men det fungerer til en viss grad.

Svarte 22/03/2016 kl. 23:49
kilden bruker

stemmer
0

Hvis du har ImageIOs , (sannsynligvis den beste bibliotek for å lese / skrive bilder i Python), kan du bruke det:

import imageio

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

Installer er like enkelt som

pip install imageio
Svarte 14/09/2018 kl. 13:25
kilden bruker

stemmer
0

Selv om dette spørsmålet er ganske gamle, er det en fremtredende søkeresultatet for å bruke Python til å konvertere PNG-filer til ICO, så jeg tenkte jeg vil legge mine to cents.

Hvis alt du ønsker er en favicon, virker Douglas Leeder svar helt greit for meg. Hvis du har en høy oppløsning PNG-fil av din logo og ønsker å konvertere den til en ICO-fil, er svaret fra Ronan Paixão trolig den enkleste veien å gå.

Men en ICO-fil kan inneholde flere bilder, ment for forskjellige oppløsninger, og jeg ofte fant meg selv i den situasjonen av å ville ha finkornet kontroll over disse forskjellige oppløsninger, for å unngå uheldige anti-aliasing effekter, noe som betyr at jeg ønsker å gi hvert bildeoppløsning individuelt. Hvilket betyr at jeg ønsker å konvertere ikke en enkelt, men flere PNG-filer i en enkelt ICO fil. Så vidt jeg kan se, ikke Pillow pakken ikke gi denne muligheten. Heldigvis kan en moderne ICO-fil inneholder flere PNG-filer inne, så oppgaven koker ned til det enkle utfordringen med å skrive noen header oppføringer. Avhengig av situasjonen, skrev jeg to funksjoner, den første i utgangspunktet løsningen av Ronan Paixão, mens den andre gir funksjonalitet for å slå sammen flere PNG-filer til en ICO-fil:

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)

Koden forutsetter at PNG-filer er 32-Bit-per-pixel RGBA bilder. Ellers ville nummer 32 i koden ovenfor må endres og bør byttes ut med noen Pillow-image-sniffing.

Svarte 08/11/2019 kl. 17:47
kilden bruker

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