23 lines
1.2 KiB
Python
23 lines
1.2 KiB
Python
"""Preserve generated editorial photographs and export responsive WebP versions."""
|
|
from pathlib import Path
|
|
from PIL import Image, ImageDraw, ImageOps
|
|
import json
|
|
ROOT=Path(__file__).resolve().parent
|
|
manifest=json.loads((ROOT/'content/photo-manifest.json').read_text(encoding='utf-8'))
|
|
originals=ROOT/'artwork/photos-selected'; originals.mkdir(parents=True,exist_ok=True)
|
|
tiles=[]
|
|
for item in manifest:
|
|
slug=item['slug']; source=ROOT/item['path']; asset=item.get('asset','photo-'+slug)
|
|
picture=Image.open(source).convert('RGB')
|
|
picture=ImageOps.fit(picture,(1536,1024),method=Image.Resampling.LANCZOS,centering=(.5,.5))
|
|
for width in (480,960,1536):
|
|
picture.resize((width,round(width*2/3)),Image.Resampling.LANCZOS).save(ROOT/'assets'/f'{asset}-{width}.webp',quality=83,method=6)
|
|
tile=Image.new('RGB',(384,280),'#05070f')
|
|
tile.paste(picture.resize((384,256)),(0,0))
|
|
ImageDraw.Draw(tile).text((12,263),slug,fill='#67e8f9')
|
|
tiles.append(tile)
|
|
sheet=Image.new('RGB',(1152,280*((len(tiles)+2)//3)),'#05070f')
|
|
for index,tile in enumerate(tiles):sheet.paste(tile,((index%3)*384,(index//3)*280))
|
|
sheet.save(originals/'contact-sheet.jpg',quality=88)
|
|
print('Prepared',len(manifest),'warm editorial photographs in 3 responsive sizes')
|