gitlab_snippets/mmozeiko/images2ico.py

36 lines
1.0 KiB
Python

#!/usr/bin/env python3
# packs multiple images (bmp/png/...) into ico file
# width and height of images must be <= 256
# pixel format of images must be 32-bit RGBA
import argparse
import struct
import os
from PIL import Image # https://python-pillow.org/
def pack(output, inp):
count = len(inp)
with open(output, "wb") as f:
f.write(struct.pack("HHH", 0, 1, count))
offset = struct.calcsize("HHH") + struct.calcsize("BBBBHHII")*count
for i in inp:
size = os.stat(i).st_size
img = Image.open(i)
w = 0 if img.width == 256 else img.width
h = 0 if img.height == 256 else img.height
f.write(struct.pack("BBBBHHII", w, h, 0, 0, 1, 32, size, offset))
offset += size
for i in inp:
f.write(open(i, "rb").read())
if __name__ == "__main__":
ap = argparse.ArgumentParser(description="pack multiple images into ico file")
ap.add_argument("-o", "--out", help="output file")
ap.add_argument("input", type=str, nargs='+', help="input images")
args = ap.parse_args()
pack(args.out, args.input)