from pathlib import Path
from PIL import Image, ImageOps
import hashlib, json
root=Path(__file__).resolve().parent
out=root/'experiment-2026-10-20'
out.mkdir(exist_ok=True)
base=Image.open(root/'astronaut.png').convert('RGB')
rows=[]
def save(name,group,condition,image,ext='png',**options):
    path=out/(name+'.'+ext)
    image.save(path,**options)
    rows.append(dict(id=name,group=group,condition=condition,file=path.name,width=image.width,height=image.height,bytes=path.stat().st_size,sha256=hashlib.sha256(path.read_bytes()).hexdigest()))
save('baseline','Baseline','Original decoded RGB pixels, lossless PNG, 512 × 512',base)
for angle in [-10,10]:
    save('rotate-'+str(angle).replace('-','minus'),'Rotation',f'{angle:+d}° image-plane rotation; Pillow bicubic; fixed 512 × 512 canvas; white fill',base.rotate(angle,resample=Image.Resampling.BICUBIC,expand=False,fillcolor='white'))
for quality in [90,50,20]:
    save('jpeg-q'+str(quality),'JPEG encoding',f'JPEG quality={quality}; subsampling=2; 512 × 512; no resize',base,'jpg',quality=quality,subsampling=2,optimize=False)
for margin in [26,51]:
    box=(margin,margin,512-margin,512-margin)
    save('crop-'+str(margin),'Crop',f'Centered crop box={box}; no resize; lossless PNG',base.crop(box))
save('horizontal-flip','Horizontal flip','Horizontal reflection only; lossless PNG; 512 × 512',ImageOps.mirror(base))
manifest=dict(date='2026-10-20',source='https://github.com/scikit-image/scikit-image/blob/v0.25.2/skimage/data/astronaut.png',source_description='https://scikit-image.org/docs/stable/api/skimage.data.html#skimage.data.astronaut',source_sha256=hashlib.sha256((root/'astronaut.png').read_bytes()).hexdigest(),pillow_version=Image.__version__,app_sha256=hashlib.sha256((root.parent/'dist/app.js').read_bytes()).hexdigest(),conditions=rows)
(out/'manifest.json').write_text(json.dumps(manifest,ensure_ascii=False,indent=2),encoding='utf-8')
print(json.dumps(manifest,ensure_ascii=False,indent=2))
