From f6dfc57a061b59da530b3485573f009d5488987a Mon Sep 17 00:00:00 2001 From: Oliver Rieger Date: Sat, 1 Aug 2026 01:00:56 +0200 Subject: [PATCH] Draw the wind-up from the photographed serve, not from prose MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Oliver's idea, and it is the fix for the process as much as for the frames: give the generator the real serve sequence as an IMAGE and let it copy the poses, instead of describing a pose in prose and re-rolling until it lands. One generation — a composite of his five photographed frames over two of our sprites — returned a magenta row of the whole serve in the game's own character and kit. The four stages are sliced straight out of it, anchored on the standing figure. _fine.py gets --defringe: its two de-fringe passes each eat a one-pixel line, and a racket frame IS a one-pixel line — that is what had been leaving the men holding a grip and nothing else. Co-Authored-By: Claude Opus 5 --- assets/_fine.py | 15 ++++++++++----- assets/p_pull1.png | Bin 18008 -> 12060 bytes assets/p_pull2.png | Bin 21166 -> 9162 bytes assets/p_pull3.png | Bin 20800 -> 9641 bytes assets/p_pull4.png | Bin 21002 -> 11055 bytes index.html | 2 +- render.js | 2 +- 7 files changed, 12 insertions(+), 7 deletions(-) diff --git a/assets/_fine.py b/assets/_fine.py index e1b636f..ba378ba 100644 --- a/assets/_fine.py +++ b/assets/_fine.py @@ -17,7 +17,7 @@ KEY_D2 = 60 * 60 MIN_GAP = 12 MIN_BLOB = 60 -def key(im): +def key(im, defringe=2): a = np.array(im.convert('RGBA')) bg = a[0, 0, :3].astype(int) d = ((a[..., :3].astype(int) - bg) ** 2).sum(2) @@ -26,7 +26,10 @@ def key(im): # De-fringe. The generator does not always give you a pure key colour, and whatever it does give # bleeds a halo one pixel into the sprite — which survives as a magenta rim once the sprite is on # a green court. Anything on the EDGE that is still leaning towards the background goes too. - for _ in range(2): + # ...but each pass also eats a 1-pixel line, and a racket frame IS a 1-pixel line: two passes + # removed the rackets from a whole serve sheet and left men holding a grip. --defringe 1 (or 0) + # is for sheets whose art is that thin. + for _ in range(defringe): solid = a[..., 3] > 0 edge = solid & ~(np.roll(solid, 1, 0) & np.roll(solid, -1, 0) & np.roll(solid, 1, 1) & np.roll(solid, -1, 1)) near = ((a[..., :3].astype(int) - bg) ** 2).sum(2) < KEY_D2 * 9 @@ -67,8 +70,8 @@ def frames(a, cuts): if x0 < c < x1: out[i:i+1] = [(x0, c), (c, x1)]; break return out -def main(sheet, outs, target_h, cuts, anchor): - a = key(Image.open(sheet)) +def main(sheet, outs, target_h, cuts, anchor, defringe=2): + a = key(Image.open(sheet), defringe) b = block_size(a) crops = [] for x0, x1 in frames(a, cuts): @@ -104,5 +107,7 @@ if __name__ == '__main__': th, cuts, anchor = TARGET_H, [], -1 if '--h' in args: i = args.index('--h'); th = int(args[i+1]); del args[i:i+2] if '--cut' in args: i = args.index('--cut'); cuts = [int(v) for v in args[i+1].split(',')]; del args[i:i+2] + de = 2 + if '--defringe' in args: i = args.index('--defringe'); de = int(args[i+1]); del args[i:i+2] if '--anchor' in args: i = args.index('--anchor'); anchor = int(args[i+1]); del args[i:i+2] - main(args[0], args[1:], th, cuts, anchor) + main(args[0], args[1:], th, cuts, anchor, de) diff --git a/assets/p_pull1.png b/assets/p_pull1.png index ee8f34f959568f715a6ac0fa4555dfc09128b781..6f3c672b06dd15b9290a06f01405198466bdfdbb 100644 GIT binary patch literal 12060 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 Dnj@v6 literal 18008 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