A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>‘One in a million’ iPhone bridal photo explanation: blame panorama mode (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Is that even respected? Retrospectively? What a shAItshow…
  28. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  29. <meta name="robots" content="noai, noimageai">
  30. <!-- Documented, feel free to shoot an email. -->
  31. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  32. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  35. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  36. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  37. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  38. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  39. <script>
  40. function toggleTheme(themeName) {
  41. document.documentElement.classList.toggle(
  42. 'forced-dark',
  43. themeName === 'dark'
  44. )
  45. document.documentElement.classList.toggle(
  46. 'forced-light',
  47. themeName === 'light'
  48. )
  49. }
  50. const selectedTheme = localStorage.getItem('theme')
  51. if (selectedTheme !== 'undefined') {
  52. toggleTheme(selectedTheme)
  53. }
  54. </script>
  55. <meta name="robots" content="noindex, nofollow">
  56. <meta content="origin-when-cross-origin" name="referrer">
  57. <!-- Canonical URL for SEO purposes -->
  58. <link rel="canonical" href="https://www.theverge.com/2023/12/2/23985299/iphone-bridal-photo-three-poses-explanation-panorama-photoshop-generative-ai">
  59. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  60. <article>
  61. <header>
  62. <h1>‘One in a million’ iPhone bridal photo explanation: blame panorama mode</h1>
  63. </header>
  64. <nav>
  65. <p class="center">
  66. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  67. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  68. </svg> Accueil</a> •
  69. <a href="https://www.theverge.com/2023/12/2/23985299/iphone-bridal-photo-three-poses-explanation-panorama-photoshop-generative-ai" title="Lien vers le contenu original">Source originale</a>
  70. <br>
  71. Mis en cache le 2024-01-13
  72. </p>
  73. </nav>
  74. <hr>
  75. <div class="duet--article--article-body-component"><p class="duet--article--dangerously-set-cms-markup duet--article--standard-paragraph mb-20 font-fkroman text-18 leading-160 -tracking-1 selection:bg-franklin-20 dark:text-white dark:selection:bg-blurple [&amp;_a:hover]:shadow-highlight-franklin dark:[&amp;_a:hover]:shadow-highlight-blurple [&amp;_a]:shadow-underline-black dark:[&amp;_a]:shadow-underline-white">Depending on how “online” you are, you may have seen a picture floating around socials with a strange quirk: a woman — comedian Tessa Coates — is standing in front of two mirrors in a bridal gown and, somehow, <a href="https://www.instagram.com/p/CzPGNmJIebC/">holding three poses at once</a>. Coates insisted in her Instagram post that the picture wasn’t altered; it just came out that way.</p></div>
  76. <div class="duet--article--article-body-component"><p class="duet--article--dangerously-set-cms-markup duet--article--standard-paragraph mb-20 font-fkroman text-18 leading-160 -tracking-1 selection:bg-franklin-20 dark:text-white dark:selection:bg-blurple [&amp;_a:hover]:shadow-highlight-franklin dark:[&amp;_a:hover]:shadow-highlight-blurple [&amp;_a]:shadow-underline-black dark:[&amp;_a]:shadow-underline-white">So what happened? Was it a glitched iOS Live Photo (the iOS feature that takes short videos and picks out the best one)? A faked image manipulated with Photoshop? A brief glimpse into three different, parallel realities? </p></div>
  77. <div class="duet--article--article-body-component"><p class="duet--article--dangerously-set-cms-markup duet--article--standard-paragraph mb-20 font-fkroman text-18 leading-160 -tracking-1 selection:bg-franklin-20 dark:text-white dark:selection:bg-blurple [&amp;_a:hover]:shadow-highlight-franklin dark:[&amp;_a:hover]:shadow-highlight-blurple [&amp;_a]:shadow-underline-black dark:[&amp;_a]:shadow-underline-white">Nope, it’s simpler than all of that. Faruk from the iPhonedo YouTube channel <a href="https://www.threads.net/@ayfondo/post/C0VzJWCuwnU">posted a short video</a> to Threads explaining exactly what happened, and it’s much more straightforward than you might expect.</p></div>
  78. <div class="duet--article--article-body-component"><p class="duet--article--dangerously-set-cms-markup duet--article--standard-paragraph mb-20 font-fkroman text-18 leading-160 -tracking-1 selection:bg-franklin-20 dark:text-white dark:selection:bg-blurple [&amp;_a:hover]:shadow-highlight-franklin dark:[&amp;_a:hover]:shadow-highlight-blurple [&amp;_a]:shadow-underline-black dark:[&amp;_a]:shadow-underline-white">It’s multiple images, stitched together using Coates’ iPhone 12’s “pano” feature. Faruk figured this out by peeking at the shot’s metadata and seeing its resolution is cropped from the main camera’s normal resolution down to 3028 x 3948, which happens when a picture is taken in panoramic mode. </p></div>
  79. <div class="duet--article--article-body-component"><p class="duet--article--dangerously-set-cms-markup duet--article--standard-paragraph mb-20 font-fkroman text-18 leading-160 -tracking-1 selection:bg-franklin-20 dark:text-white dark:selection:bg-blurple [&amp;_a:hover]:shadow-highlight-franklin dark:[&amp;_a:hover]:shadow-highlight-blurple [&amp;_a]:shadow-underline-black dark:[&amp;_a]:shadow-underline-white">The reason is to do with how panoramic shots on the iPhone work. When you take a picture in “pano” mode, the camera takes many pictures and stitches them together into one, wider photo. To keep the final image from being all wiggly, the phone has to crop them before the stitch, panning up, down, and across the original images to match them at the edges. The same principle is at play in digital video stabilization, producing smooth video from previously shaky footage. </p></div>
  80. <div class="duet--article--article-body-component"><p class="duet--article--dangerously-set-cms-markup duet--article--standard-paragraph mb-20 font-fkroman text-18 leading-160 -tracking-1 selection:bg-franklin-20 dark:text-white dark:selection:bg-blurple [&amp;_a:hover]:shadow-highlight-franklin dark:[&amp;_a:hover]:shadow-highlight-blurple [&amp;_a]:shadow-underline-black dark:[&amp;_a]:shadow-underline-white">That’s somewhat similar to the iPhone’s Deep Fusion computational photography feature, which <a href="/2019/10/1/20893516/apple-deep-fusion-camera-mode-iphone-11-pro-max-ios-13-beta">compensates for dim lighting</a> by taking several pictures at once within a fraction of a second and blends them together after processing them at the pixel level to pull out lighting, color, and tone detail. Then there’s Google’s bevy of <a href="/23902248/google-photos-pixel-8-ai-magic-editor-best-take-audio-magic-eraser">AI photo-editing tools in the Pixel 8</a>, which let you take several photos and <a href="/23914615/pixel-8-pro-camera-parents-best-take-face-unblur">swap out faces</a>, tweak the background, or <a href="/2023/5/10/23716165/google-photos-ai-magic-editor-transform-pixel-io">move whole people or things around</a> to create the image you wanted <a href="/23902248/google-photos-pixel-8-ai-magic-editor-best-take-audio-magic-eraser">rather than the one you took</a>.</p></div>
  81. <div class="duet--article--article-body-component"><p class="duet--article--dangerously-set-cms-markup duet--article--standard-paragraph mb-20 font-fkroman text-18 leading-160 -tracking-1 selection:bg-franklin-20 dark:text-white dark:selection:bg-blurple [&amp;_a:hover]:shadow-highlight-franklin dark:[&amp;_a:hover]:shadow-highlight-blurple [&amp;_a]:shadow-underline-black dark:[&amp;_a]:shadow-underline-white">Stitching panoramic shots together isn’t as fancy as all that, and it isn’t perfect. Anyone who’s taken their share of panoramic iPhone shots can attest panoramics often result in wacky artifacts like missing arms and distorted faces. In Coates’ case, her phone’s camera took several pictures, and since it couldn’t know that the women in the mirrors were also Coates, it didn’t make sure to synchronize the poses. Faruk even manages to reproduce the phenomenon himself in his video. Shame, though. I had hoped we were actually seeing evidence of the multiverse. </p></div>
  82. <div class="duet--article--article-body-component"><p class="duet--article--dangerously-set-cms-markup duet--article--standard-paragraph mb-20 font-fkroman text-18 leading-160 -tracking-1 selection:bg-franklin-20 dark:text-white dark:selection:bg-blurple [&amp;_a:hover]:shadow-highlight-franklin dark:[&amp;_a:hover]:shadow-highlight-blurple [&amp;_a]:shadow-underline-black dark:[&amp;_a]:shadow-underline-white"><em><strong>Update December 2nd, 2023, 3:31PM ET: </strong>Added contextual information about computational photography and generative AI photo editing features from Apple and Google.</em></p></div>
  83. </article>
  84. <hr>
  85. <footer>
  86. <p>
  87. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  88. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  89. </svg> Accueil</a> •
  90. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  91. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  92. </svg> Suivre</a> •
  93. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  94. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  95. </svg> Pro</a> •
  96. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  97. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  98. </svg> Email</a> •
  99. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  100. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  101. </svg> Légal</abbr>
  102. </p>
  103. <template id="theme-selector">
  104. <form>
  105. <fieldset>
  106. <legend><svg class="icon icon-brightness-contrast">
  107. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  108. </svg> Thème</legend>
  109. <label>
  110. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  111. </label>
  112. <label>
  113. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  114. </label>
  115. <label>
  116. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  117. </label>
  118. </fieldset>
  119. </form>
  120. </template>
  121. </footer>
  122. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  123. <script>
  124. function loadThemeForm(templateName) {
  125. const themeSelectorTemplate = document.querySelector(templateName)
  126. const form = themeSelectorTemplate.content.firstElementChild
  127. themeSelectorTemplate.replaceWith(form)
  128. form.addEventListener('change', (e) => {
  129. const chosenColorScheme = e.target.value
  130. localStorage.setItem('theme', chosenColorScheme)
  131. toggleTheme(chosenColorScheme)
  132. })
  133. const selectedTheme = localStorage.getItem('theme')
  134. if (selectedTheme && selectedTheme !== 'undefined') {
  135. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  136. }
  137. }
  138. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  139. window.addEventListener('load', () => {
  140. let hasDarkRules = false
  141. for (const styleSheet of Array.from(document.styleSheets)) {
  142. let mediaRules = []
  143. for (const cssRule of styleSheet.cssRules) {
  144. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  145. continue
  146. }
  147. // WARNING: Safari does not have/supports `conditionText`.
  148. if (cssRule.conditionText) {
  149. if (cssRule.conditionText !== prefersColorSchemeDark) {
  150. continue
  151. }
  152. } else {
  153. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  154. continue
  155. }
  156. }
  157. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  158. }
  159. // WARNING: do not try to insert a Rule to a styleSheet you are
  160. // currently iterating on, otherwise the browser will be stuck
  161. // in a infinite loop…
  162. for (const mediaRule of mediaRules) {
  163. styleSheet.insertRule(mediaRule.cssText)
  164. hasDarkRules = true
  165. }
  166. }
  167. if (hasDarkRules) {
  168. loadThemeForm('#theme-selector')
  169. }
  170. })
  171. </script>
  172. </body>
  173. </html>