CommunityImagegithub.com

onemanylov/phone-screen

Transformez la photo d'un téléphone en un modèle réutilisable et placez n'importe quelle image sur son écran, par code, sans générateur d'image. Utilisez-le pour une nouvelle photo de téléphone, un nouveau modèle, ou une vérification.

Qu'est-ce que phone-screen ?

Cette compétence permet de remplacer l'écran d'un téléphone réel sur une photo par n'importe quelle image, entièrement par code, sans utiliser de générateur d'image. Elle est utile pour créer des visuels publicitaires, des maquettes ou des démonstrations où un écran de téléphone doit afficher un contenu personnalisé. La compétence prend en charge les iPhones (avec encoche ou îlot dynamique) et rejette les inclinaisons excessives ou les photos avec des doigts ou des manches sur l'écran. Le processus implique plusieurs étapes : rognage des coins, ajustement des bords droits, tracé du contour, vérification de l'étanchéité, mesure de l'encoche, ajout de l'heure et des icônes, et enfin construction. Une fois le modèle créé, une simple commande `python3 swap.py <image>` permet d'appliquer n'importe quelle image. La compétence inclut des vérifications rigoureuses (frame check, leak map, zoom) pour garantir un résultat réaliste et exempt d'artefacts. Elle est conçue pour fonctionner avec des photos réelles, en respectant la perspective, la distorsion de l'objectif et les bords incurvés du verre.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/onemanylov/phone-screen-swap/tree/HEAD/.claude/skills/phone-screen

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Remplacement d'écran de téléphone

Photo : $ARGUMENTS. S'il n'y en a pas, demandez-en une, ou trouvez-en avec find_photos.py. Toute la face avant du téléphone est remplacée par du code : l'écran, le cadre noir, et l'encoche ou l'îlot. En dehors du verre, la photo est inchangée.

Pour un modèle qui existe déjà, cette compétence n'est pas nécessaire : python3 swap.py <image>.

Nouveau modèle

Prenez : une vraie photo d'un iPhone, l'écran face à l'appareil photo. Évitez : Android, une inclinaison supérieure à 25°, un côté plus de 1,2 fois l'autre (le recadrage les refuse). Évitez les photos avec un doigt ou une manche sur l'écran : sans cadre gris, ils seront repeints. Tout le verre nous appartient, même un reflet. Seule la peau qui vient de l'extérieur reste sur la photo.

P=<nom, 8 caractères, unique>; D=templates/corners
mkdir -p out
# 1. Regardez la photo et lisez les coins approximatifs de l'écran, TG,TD,BD,BG
python3 tools/slide_crop.py --q '<coins>' <photo.jpg> templates/crop/$P.jpg       # imprime les coins sur le recadrage
# 2. Les bords droits exacts. Si `live` est bas : R=34
python3 tools/slide_lines.py $P '<coins sur le recadrage>' out/l.jpg                    # coins affinés à la fin de la sortie
# 3. Le contour : perspective, distorsion de lentille, rayon, contour du verre
python3 tools/slide_trace.py $P '<coins>' out/t.jpg $D/$P.json
# 4. Preuve de ce que l'ajustement n'a pas vu. Regardez toujours l'image
python3 tools/slide_proof.py $P $D/$P.json out/$P-proof.jpg
# 5. La pose, utilisée uniquement par le reflet
python3 tools/slide_sheet.py $P $D/$P.pose.json init
# 6. Mesurez l'encoche ou l'îlot, les icônes de statut, les noirs
python3 tools/slide_check.py $P measure
# Recette $D/$P.recipe.json : copiez a841f108 (encoche) ou f5dad639 (îlot), puis définissez frame=$P, pose, coins et les options mesurées
# 7. Heure et icônes à l'emplacement de ce téléphone
python3 tools/slide_status.py $P init <ligne de measure>; python3 tools/slide_status.py $P build
# 8. Construction et test rouge
python3 tools/slide_check.py $P build
# 9. Carte thermique des fuites
python3 tools/slide_check.py $P leak
# 10. Largeur du cadre
python3 tools/slide_check.py $P frame

Après cela, c'est un modèle : python3 swap.py <image> -t $P.

Vérifiez avant de faire confiance

  1. out/$P-split.jpg : photo, rouge, résultat. Le rouge correspond, le cadre se termine au boîtier, tout ce qui vient du corps vers l'intérieur nous appartient.
  2. out/$P-leak.jpg : le cadre sur un écran noir, la luminosité en échelle logarithmique. Tout ce qui est éclairé provient de la photo : une ligne autour d'une découpe, des points, des reflets. Seul un haut-parleur et ce qui se trouve vraiment devant peuvent apparaître.
  3. out/$P-top.jpg : le contour vert de la découpe sur la photo, les icônes en place.
  4. out/$P-zoom.jpg : coins et cadre, agrandis, à côté de la photo.
  5. Le modèle avec une image blanche via swap.py : une page sombre cache les mauvais coins et bords.
  6. out/$P-frame.jpg : les quatre coins sur un écran blanc. Un modèle n'est pas terminé tant que la vérification du cadre ci-dessous n'est pas réussie.

Vérification du cadre

Le cadre noir est du matériel, une largeur uniforme tout autour. slide_check.py $P frame construit sur un écran blanc, le redresse et mesure le noir au milieu de chaque côté, en pixels d'écran (591 de large). Il imprime ours et photo par côté, l'écart et un verdict : jusqu'à 4 px c'est OK, plus c'est FIX. La limite de 4 px est choisie d'après ces téléphones : un écart de 7,5 px était clairement visible, et 4 px ne l'était pas. S'il dit FIX sur un nouveau modèle :

  1. Relancez slide_trace.py : il lit le noir visible et donne à chaque côté la médiane (la ligne frame:).
  2. Reconstruisez, puis relancez frame.
  3. Toujours FIX : comparez ours avec photo. S'ils correspondent, un reflet, un étui ou une main cache le cadre de ce côté sur la photo. Sinon, le contour est erroné : regardez -frame.jpg et -split.jpg.
  4. Si ça ne converge pas, ne déclarez pas le modèle terminé. Dites quel côté est décalé, et de combien de px. Vérifiez aussi -frame.jpg à l'œil : le haut et le côté doivent correspondre. Les modèles livrés : f38fe44a 2.2, 79186658 3.2 et 895d3ee8 3.8 réussissent. f5dad639 5.8, a841f108 6.2 et 14278a0b 8.5 ne réussissent pas : leurs cadres ont été conservés tels que construits initialement.

Réglages

  • Noir : floor, pour que le cadre et la découpe correspondent à la photo. Commencez à .003 et abaissez-le si la photo est plus sombre. build imprime les deux.
  • Encoche : valeurs de measure. Réglez cr avec le contour vert, measure le lit bas.
  • Haut-parleur au-dessus d'une encoche : grille=45. Si une fine ligne de l'ancienne page apparaît autour de l'encoche : gband=1.
  • Îlot : son centre est matériel, 295,5 sur 591. Si measure dit plus de 1 px d'écart, quelque chose de brillant a mangé un bord : prenez le bord propre et reflétez-le par le centre. Sur un écran de verrouillage, prenez x d'un téléphone avec un îlot (heure 111, icônes 479) et y de measure.
  • Haut-parleur au-dessus d'un îlot : s'il se trouve à l'intérieur du contour du verre, grille=45 ne ramène que son relief.
  • Manche sur le verre : sleeve=1, uniquement avec un vrai cadre gris dans templates/grey/ (f38fe44a).
  • Sombre sur sombre : slide_trace.py bascule automatiquement quand moins de 400 des 720 points montent. Vérifiez -split avec une attention particulière.

Comment ça fonctionne

Un téléphone est rigide, donc l'écran est un rectangle avec les coins continus d'iOS, vu à travers une perspective et une distorsion de lentille radiale. Les bords sont trouvés dans la luminance logarithmique, donc le sombre sur sombre fonctionne, et placés au point médian en lumière linéaire. L'image est dessinée sur la photo redressée, puis courbée en arrière avec le verre.

Pièges connus

  • Juger uniquement par une page sombre.
  • Ajuster d'une manière et vérifier d'une autre : la vérification est l'ajustement, la preuve est ce qui a été laissé de côté.
  • Lignes droites directement sur la photo : elle est courbée. Elles n'existent que sur l'image redressée.
  • Chercher un bord de boîtier de l'extérieur vers l'intérieur sur un écran lumineux : un pli de tissu ressemble à un boîtier. Allez de l'écran vers l'extérieur.

Skills associés