<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LeGo build</title>
    <description>The latest articles on DEV Community by LeGo build (@dlss).</description>
    <link>https://dev.to/dlss</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4137297%2Fc1accfdd-1f58-4763-90e7-182aaff45969.jpeg</url>
      <title>DEV Community: LeGo build</title>
      <link>https://dev.to/dlss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dlss"/>
    <language>en</language>
    <item>
      <title>What a browser 'AI enhance' actually returns — measured, with hashes</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Fri, 30 Oct 2026 04:23:18 +0000</pubDate>
      <link>https://dev.to/dlss/what-a-browser-ai-enhance-actually-returns-measured-with-hashes-44lk</link>
      <guid>https://dev.to/dlss/what-a-browser-ai-enhance-actually-returns-measured-with-hashes-44lk</guid>
      <description>&lt;p&gt;"Enhance" is one of those words that hides at least four different jobs: super-resolution, denoising, re-rendering in place, and re-composing the frame entirely. They produce very different files, and almost nobody shows you which one they ran.&lt;/p&gt;

&lt;p&gt;So I measured one. Not by reading a marketing page — by pulling the public example from the command line, keeping both files, and printing their SHA-256. Here is everything that came out of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The run
&lt;/h2&gt;

&lt;p&gt;The tool is a browser image enhancer; this example is a small Node script in its public repo that fetches one &lt;strong&gt;cached&lt;/strong&gt; example pair the site already serves to guests. No account, no credits, no uploads, and nothing of yours is sent anywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node bin/enhance-example.mjs &lt;span class="nt"&gt;--sample&lt;/span&gt; sample1 &lt;span class="nt"&gt;--out&lt;/span&gt; ./out
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My copy of that run, on 2026-10-30:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;catalog: 5033 ms · cached=true
input.jpg     0.15 MiB   812 ms  sha256:19d965fed4699633…
output.webp   0.13 MiB  5377 ms  sha256:229b802a24474dd6…
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three HTTP requests — catalog, input, output. &lt;strong&gt;No inference happened on my machine, and no credit was spent.&lt;/strong&gt; The millisecond figures are network waits, not model time; treat them as nothing more than "these three requests are not slow".&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;p&gt;Both files, measured rather than described:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;input&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;input.jpg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;output.webp&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bytes&lt;/td&gt;
&lt;td&gt;154,319&lt;/td&gt;
&lt;td&gt;134,222&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dimensions&lt;/td&gt;
&lt;td&gt;1200×768&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1200×768&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA-256&lt;/td&gt;
&lt;td&gt;&lt;code&gt;19d965fed4699633e9b6faae738fd678592ca5098a47f1535388ef133c2fc28a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;229b802a24474dd6c8df6ddac02afb454b7563fe3dfcada76c25dfceac89e708&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flr6p7rpbtydsus6o3c2e.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flr6p7rpbtydsus6o3c2e.gif" alt="The same kitchen frame: the slider sweeps between the source JPEG and the re-rendered WebP" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;The pair this article is about, as a slider: source on one side, re-rendered output on the other, same 1200×768 frame.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Same dimensions in, same dimensions out. That is the whole headline, and it rules out the interpretation most people bring to the word: &lt;strong&gt;this is not upscaling&lt;/strong&gt;. It is the same frame, redrawn.&lt;/p&gt;

&lt;p&gt;The site's own FAQ is explicit about the ceiling: the longest output edge is capped at 1536 pixels, target factors are 2 / 4, and the requested scale is reduced to fit that cap. So even for your own uploads there is no path to "4K from a thumbnail" here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two caveats worth more than the numbers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Sample pairs do not generalise.&lt;/strong&gt; A second example in the same repo takes a 1670×1152 JPEG and returns a 1024×1024 WebP — different geometry, which means its before/after slider is not pixel-aligned. If you are judging an enhancer, check whether the pair you are shown preserves the frame; a geometry change can flatter any comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. This is not an NVIDIA DLSS runtime.&lt;/strong&gt; The name is confusing, so it is worth stating plainly: nothing here installs, patches or replaces an &lt;code&gt;nvngx_dlss*&lt;/code&gt; file, and no game is involved. It re-renders a supplied image and hands it back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why hashes
&lt;/h2&gt;

&lt;p&gt;A before/after image on a landing page is unfalsifiable: you cannot tell whether the "after" was produced by the tool, by a different model, or by hand. A file hash is checkable years later by anyone who kept the file. That is the whole reason the example ships with &lt;code&gt;compare.html&lt;/code&gt; — a single self-contained page with a slider and both hashes, so the pair can be re-verified without trusting the README that describes it.&lt;/p&gt;

&lt;p&gt;If you build anything in this space, the cheapest credibility you can add is exactly this: keep the input, keep the output, publish both hashes, and say which process produced them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproducing it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/wangsheng1991/dlss5-visual-enhancer
&lt;span class="nb"&gt;cd &lt;/span&gt;dlss5-visual-enhancer
node bin/enhance-example.mjs &lt;span class="nt"&gt;--sample&lt;/span&gt; sample1 &lt;span class="nt"&gt;--out&lt;/span&gt; ./out
shasum &lt;span class="nt"&gt;-a&lt;/span&gt; 256 out/input.jpg out/output.webp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node 18+, zero dependencies. Your hashes should match the table above; if they do not, the example was re-generated and the README should say so.&lt;/p&gt;

&lt;p&gt;If you want to run your &lt;em&gt;own&lt;/em&gt; screenshot through it rather than a cached sample, that is the signed-in flow on the site — one credit per task, and new accounts start with free credits. That is where the 1536-pixel edge cap and 2/4 factors apply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/dlss5-visual-enhancer/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.dlss5nvidia.com" rel="noopener noreferrer"&gt;www.dlss5nvidia.com&lt;/a&gt; — &lt;a href="https://www.dlss5nvidia.com/visual-enhancer" rel="noopener noreferrer"&gt;https://www.dlss5nvidia.com/visual-enhancer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.dlss5nvidia.com" rel="noopener noreferrer"&gt;www.dlss5nvidia.com&lt;/a&gt; — &lt;a href="https://www.dlss5nvidia.com/visual-enhancer" rel="noopener noreferrer"&gt;https://www.dlss5nvidia.com/visual-enhancer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Same picture, same size, drawn again&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Enhance" is usually read as "make the small one big". This step is not that: it re-renders the frame you give it — same camera, same dimensions, with a 1536-pixel longest-edge cap and 2/4 target factors. Your own screenshot takes one credit, and new accounts start with free credits.&lt;/p&gt;

&lt;p&gt;Enhance your own screenshot — free credits on signup: &lt;a href="https://www.dlss5nvidia.com/visual-enhancer?ref=enhance-actually-returns" rel="noopener noreferrer"&gt;https://www.dlss5nvidia.com/visual-enhancer?ref=enhance-actually-returns&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>imageprocessing</category>
      <category>webdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>One game character, five style directions: planning a redraw matrix that survives review</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:48:42 +0000</pubDate>
      <link>https://dev.to/dlss/one-game-character-five-style-directions-planning-a-redraw-matrix-that-survives-review-4hp7</link>
      <guid>https://dev.to/dlss/one-game-character-five-style-directions-planning-a-redraw-matrix-that-survives-review-4hp7</guid>
      <description>&lt;p&gt;A style direction is easy to argue about and hard to compare. Put three different characters in a mood board and you learn nothing about how &lt;em&gt;one&lt;/em&gt; character reads under five lighting and material treatments — you have changed the subject, not the style.&lt;/p&gt;

&lt;p&gt;This is a short working method for a game-character style matrix: fix the input, name the variables, reject identity drift before you pick a favourite. It comes from a guide I maintain on &lt;a href="https://www.dlss5nvidia.com/game-character-style" rel="noopener noreferrer"&gt;dlss5nvidia.com&lt;/a&gt;, where the sample is independent still-image style conversion, not a game runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix the input first
&lt;/h2&gt;

&lt;p&gt;Every direction has to start from the same source: same pose, same costume construction, same camera. Otherwise the second row of your matrix is a different character in a different shot, and the comparison collapses into taste.&lt;/p&gt;

&lt;p&gt;Before writing the request, write down the identity anchors — head silhouette, exposed hair, coat opening, strap placement, equipment outline. Those are the things you will check &lt;em&gt;after&lt;/em&gt; the redraw, not the things you hope the model respects.&lt;/p&gt;

&lt;p&gt;In the pair we actually retrieved for the guide, the direction (rainy neon street, cinematic lighting) came back convincingly, and the identity did not: exposed face and hair became a helmeted head, and the framing shifted. That is a real result, saved with its request, and it fails the preservation brief. Worth stating plainly, because a plausible-looking image is exactly what makes reviewers skip the comparison.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxlrdnjb5vuojlo2vti0q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxlrdnjb5vuojlo2vti0q.jpg" alt="Site-owned character source with visible hair on a neon street" width="269" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source: the site's own synthetic character sample, copied unchanged. Not a capture from a commercial game.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wzizd0yty39dng93hhx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wzizd0yty39dng93hhx.webp" alt="Historical cached character result with a helmet and neon reflections" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Result: an existing cached example from the same workflow. The helmet is an observed identity change, not an accepted conversion.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the variables separate
&lt;/h2&gt;

&lt;p&gt;Five directions are useful only if each one changes one thing you can see. Concretely, split the matrix by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Light&lt;/strong&gt;: where the key light sits, and how much bounce colour reaches the face.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material&lt;/strong&gt;: how cloth, metal and skin read under that light.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Palette&lt;/strong&gt;: which two or three hues carry the frame.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rendering density&lt;/strong&gt;: how much fine detail the treatment adds, and where.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mix all four in one prompt and no row teaches you anything — you cannot say which change caused the acceptability failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reject drift before ranking
&lt;/h2&gt;

&lt;p&gt;Order of review matters more than the ranking itself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identity anchors intact? If not, the row is a different concept, not a candidate.&lt;/li&gt;
&lt;li&gt;Silhouette and costume readable at thumbnail size? Game visuals are read small and fast.&lt;/li&gt;
&lt;li&gt;Text and interface meaning unchanged? If your frame has HUD text, health values, counters or subtitles, a generated approximation of lettering is a failure even when the rest looks coherent.&lt;/li&gt;
&lt;li&gt;Only then: which direction reads best for the project.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 1–3 are binary. Step 4 is the conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this method cannot tell you
&lt;/h2&gt;

&lt;p&gt;A still-image matrix is a visual-direction discussion, not a rendering benchmark. It says nothing about frame time, how the look behaves in motion, or whether the design can be implemented in engine. Our examples are original synthetic and site-owned imagery, not captures from commercial games, and the guide separates each claim from what the saved files actually show.&lt;/p&gt;

&lt;p&gt;If you want the full checklist, the saved prompt, and the two figures from the retrieved pair, the long version is here: &lt;strong&gt;&lt;a href="https://www.dlss5nvidia.com/blog/core-game-character-style-matrix" rel="noopener noreferrer"&gt;One game character, five style directions&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I work on DLSS5-related visual tooling and research write-ups at dlss5nvidia.com; the site is independent of NVIDIA, AMD and Black Forest Labs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>ai</category>
      <category>design</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>DLSS 5 style conversion: turn a saved game frame into a reviewable visual reference</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:49:48 +0000</pubDate>
      <link>https://dev.to/dlss/dlss-5-style-conversion-turn-a-saved-game-frame-into-a-reviewable-visual-reference-18n2</link>
      <guid>https://dev.to/dlss/dlss-5-style-conversion-turn-a-saved-game-frame-into-a-reviewable-visual-reference-18n2</guid>
      <description>&lt;p&gt;&lt;a href="https://www.dlss5nvidia.com/blog/core-game-frame-style-reference" rel="noopener noreferrer"&gt;https://www.dlss5nvidia.com/blog/core-game-frame-style-reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DLSS 5 style conversion lets you explore another lighting, palette, and material direction from an existing frame. Keep the source beside the redraw and reject changes to the character, costume, or text that your brief requires preserved.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use the source to define the character and the prompt to describe the desired visual change.&lt;/li&gt;
&lt;li&gt;Treat silhouette, clothing construction, HUD, and written content as acceptance criteria.&lt;/li&gt;
&lt;li&gt;Our real example is an original synthetic character, not a screenshot from a commercial game.&lt;/li&gt;
&lt;li&gt;The retrieved result changes recognizable features, so it needs review rather than automatic approval.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What a style reference is useful for
&lt;/h2&gt;

&lt;p&gt;A saved frame gives an artist a concrete starting point: a pose, a camera, a character, and a relationship between subject and background. A redraw can explore how that arrangement reads under another lighting or material treatment. It can make a discussion about visual direction more specific than a list of adjectives.&lt;/p&gt;

&lt;p&gt;For example, a team may want to judge the balance between colored reflections and the readability of dark clothing. A reference can help them discuss that choice. It cannot establish how the final game will render the same scene, how animation will behave, or whether the design can be implemented without further work.&lt;/p&gt;

&lt;p&gt;On our &lt;a href="https://www.dlss5nvidia.com/game-character-style" rel="noopener noreferrer"&gt;game-character-style page&lt;/a&gt;, the task is independent image-based style conversion. The phrase DLSS 5 describes the intended visual-reference direction here; this browser example does not run or benchmark NVIDIA's game runtime. Studio is a delivery form for the wider workflow, not the definition of the image transformation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate the subject from the changes you want
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Keep a recognizable character
&lt;/h3&gt;

&lt;p&gt;Before assessing the result, identify the character's outer contour and the landmarks that make the costume recognizable. A backpack, a coat opening, the placement of a strap, or the outline of hair can matter more than the overall amount of detail. Name those elements in the brief and keep them visible during review.&lt;/p&gt;

&lt;p&gt;A direction such as cinematic lighting is not permission to replace the face or redesign the equipment. If a change crosses that boundary, record it as a departure from the brief. You can still discuss the new image as a different concept, but it should not silently become the approved conversion of the original character.&lt;/p&gt;

&lt;h3&gt;
  
  
  Describe the intended visual language
&lt;/h3&gt;

&lt;p&gt;Style can involve the color of bounced light, the transition between highlight and shadow, the roughness suggested by a surface, or the relationship between background colors. These are things a viewer can compare. Write a brief that explains which of them should change and which should remain consistent.&lt;/p&gt;

&lt;p&gt;A large list of competing effects makes the result harder to evaluate. For a practical review, pick a direction and define its visible consequences. This is an editing recommendation, not a measured claim that shorter prompts always produce better output. The actual prompt used in our example is saved with the files.&lt;/p&gt;

&lt;h2&gt;
  
  
  The example we actually retrieved
&lt;/h2&gt;

&lt;p&gt;We requested the public characterStyle example and saved the successful response. It identified the source image, fixed prompt, result endpoint, and cached status. We downloaded the source and returned image. This repeats access to a stored result; it is not a fresh inference experiment or a claim of repeatable generation.&lt;/p&gt;

&lt;p&gt;The source is the site's original synthetic cyberpunk character reference. It is not footage from a named game, and we did not acquire a third-party screenshot for this article. Its prompt asks to preserve silhouette and costume while using cyberpunk cinematic lighting, wet pavement, neon reflections, and no text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpn1q5f4f2g0iyhz3f81n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpn1q5f4f2g0iyhz3f81n.jpg" alt="Original site-owned synthetic character frame used by the public sample" width="269" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. Exact input downloaded from the site's characterStyle sample. Source: /examples/generated/game-cyber-1-before.jpg; license: own, authorized for this content batch. This is original synthetic imagery, not a commercial-game capture or NVIDIA output.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The result keeps a rainy neon-street direction and a standing character, but that broad resemblance is not enough for approval. The output depicts a helmeted head where the input exposes a face and hair, and the framing differs. Those visible departures matter if preserving identity and silhouette was required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv95wu2h48j55ouk7130n.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv95wu2h48j55ouk7130n.webp" alt="Actual cached character-style result with a helmeted figure and neon street" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. Exact result retrieved through the public sample endpoint; run.json records cached: true. Source and license: the site's own generated sample, authorized for this batch. The image demonstrates a real redraw with preservation failures, not an accepted identity-preserving result.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Read the scene text as content
&lt;/h3&gt;

&lt;p&gt;The output contains sign-like characters despite the prompt's no-text instruction. We do not transcribe them or infer that they reproduce the source signs. Text-like marks are visible generated content, and a prompt that asks to avoid them is not proof that the instruction was obeyed.&lt;/p&gt;

&lt;p&gt;This example contains no game HUD. It therefore cannot establish HUD preservation. For your own authorized frame, health values, counters, subtitles, menu labels, and control hints must be checked against the source. If exact lettering matters, a generated approximation fails that requirement even when the rest of the image looks coherent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce the retrieval and inspection
&lt;/h2&gt;

&lt;p&gt;The following commands are the public request-and-download sequence used for this article. Run them in a new directory with curl available. The package also includes our response and file hashes, so a reader can distinguish the recorded version from a later cache update.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--fail&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--show-error&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"sample":"characterStyle"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://www.dlss5nvidia.com/api/image-edit/samples &lt;span class="nt"&gt;-o&lt;/span&gt; run.json
curl &lt;span class="nt"&gt;--fail&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--show-error&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://www.dlss5nvidia.com/examples/generated/game-cyber-1-before.jpg &lt;span class="nt"&gt;-o&lt;/span&gt; input.jpg
curl &lt;span class="nt"&gt;--fail&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--show-error&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://www.dlss5nvidia.com/api/image-edit/samples?sample=characterStyle'&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; output.webp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read run.json before opening a result. A failed or unfinished response should stay in the record as such. If the service changes its sample, preserve your new bytes separately rather than presenting them as the output shown here. Matching a stored file confirms which image you inspected; it does not validate the model's understanding of the brief.&lt;/p&gt;

&lt;p&gt;We reused the content library's capture script to render an inspection page containing the exact source and result. The script and its execution record are included. That repeatable browser view helps check the pair without depending on an online slider. It does not represent another model run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make the review concrete
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Read the saved prompt and identify the requested change and preservation constraints.&lt;/li&gt;
&lt;li&gt;View the full input and output together before zooming into a favorable region.&lt;/li&gt;
&lt;li&gt;Follow the head, shoulders, clothing outline, and equipment across the pair.&lt;/li&gt;
&lt;li&gt;Check any written content independently from lighting and material appearance.&lt;/li&gt;
&lt;li&gt;Save a decision that names the departures rather than simply calling the output better.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are the inspection actions used on this pair. We have not run a separate experiment that removes a HUD, restores a face, or guarantees a particular prompt correction. Any further edit needs its own source, output, and review record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide what to keep from a mixed result
&lt;/h2&gt;

&lt;p&gt;A reference can contain an interesting light direction and an unacceptable character change at the same time. Keep those judgments separate. You may retain the image as a discussion of neon reflections while rejecting it as a faithful conversion of the supplied character. Its caption should say which use remains valid.&lt;/p&gt;

&lt;p&gt;Do not crop away a changed head and then present the remaining jacket as proof that the whole character was preserved. A local crop answers a local question. The complete pair must remain available to anyone making the broader decision about costume and identity.&lt;/p&gt;

&lt;p&gt;For a production handoff, name the elements approved as inspiration and the elements excluded from reuse. An artist can then interpret the light or material treatment without inheriting an accidental redesign. The practical output is a reviewable reference and a clear brief, not a claim that a generated image is already a finished game asset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where prompts and references fit
&lt;/h2&gt;

&lt;p&gt;Black Forest Labs documents image editing with text and image references. Its &lt;a href="https://docs.bfl.ml/flux_2/flux2_image_editing" rel="noopener noreferrer"&gt;image-editing documentation&lt;/a&gt; supplies general background for that kind of workflow; it does not verify the behavior of our recorded sample or make it a NVIDIA rendering result.&lt;/p&gt;

&lt;p&gt;For a later task involving more than one image, the BFL &lt;a href="https://help.bfl.ai/articles/6546682167-what-is-multi-reference-editing" rel="noopener noreferrer"&gt;multi-reference explanation&lt;/a&gt; describes assigning content across references. Our character example uses a single source and a fixed prompt. It cannot establish what a second reference would have changed, so we do not invent that comparison.&lt;/p&gt;

&lt;p&gt;The value of dlss 5 style conversion lies in making a visual direction available for inspection. The acceptance decision still depends on the source and the brief. Searchers looking for dlss 5 style conversion should be able to find both the transformation and the evidence that limits its use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundaries and independence
&lt;/h2&gt;

&lt;p&gt;This article does not promise unchanged identity, correct HUD text, exact geometry, commercial asset readiness, temporal consistency, or in-game performance. It documents one cached synthetic-character redraw and an inspection workflow. We operate the linked site, and the page serves our own product audience. We are independent and not affiliated with NVIDIA, AMD, or Black Forest Labs; no third-party artwork is used in these figures.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>imageprocessing</category>
    </item>
    <item>
      <title>When a compressed image looks broken: a reproducible visual-enhancer check</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Fri, 16 Oct 2026 11:35:52 +0000</pubDate>
      <link>https://dev.to/dlss/when-a-compressed-image-looks-broken-a-reproducible-visual-enhancer-check-5f0j</link>
      <guid>https://dev.to/dlss/when-a-compressed-image-looks-broken-a-reproducible-visual-enhancer-check-5f0j</guid>
      <description>&lt;p&gt;NVIDIA Broadcast 2.3 is being discussed for adding 4K video upscaling and frame-generation features. That makes a useful question for image and video makers: what can you do today when a screenshot or reference image has already been softened by resizing and compression?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fdatasets%2Fshi9214%2Fdlss5-visual-enhancer-workflow%2Fresolve%2Fmain%2Fevidence%2Fsample1-input.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fdatasets%2Fshi9214%2Fdlss5-visual-enhancer-workflow%2Fresolve%2Fmain%2Fevidence%2Fsample1-input.jpg" alt="A compressed sample: the site-owned input file" width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Before — the site-owned sample as it arrives after resizing and compression.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fhuggingface.co%2Fdatasets%2Fshi9214%2Fdlss5-visual-enhancer-workflow%2Fresolve%2Fmain%2Fevidence%2Fsample1-result.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fhuggingface.co%2Fdatasets%2Fshi9214%2Fdlss5-visual-enhancer-workflow%2Fresolve%2Fmain%2Fevidence%2Fsample1-result.webp" alt="The same sample after the independent visual-enhancer workflow" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;After — the same sample through the independent visual-enhancer workflow. Edges are easier to inspect; detail that was never in the file does not come back.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This post shows one small, reproducible check with an independent visual-enhancer workflow. The input and output are site-owned samples; they are not NVIDIA screenshots and they are not a benchmark of NVIDIA Broadcast. The page is available at &lt;a href="https://www.dlss5nvidia.com/visual-enhancer" rel="noopener noreferrer"&gt;https://www.dlss5nvidia.com/visual-enhancer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The workflow is deliberately simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the free cached example.&lt;/li&gt;
&lt;li&gt;Compare the source and result at the same view.&lt;/li&gt;
&lt;li&gt;Inspect faces, text, logos, and hard edges before saving anything.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For your own image, the browser path is the quick way to try a visual result. The separate DLSS5 Studio request flow is for people who want a desktop review path. The two paths have different availability and should not be treated as the same runtime.&lt;/p&gt;

&lt;p&gt;A reproducible local request manifest and MIT CLI are in the companion materials. The CLI sends a request only to an endpoint you control; it contains no provider key and does not proxy through our site. The dataset card records the sample file relationship and its limits rather than claiming a universal quality gain.&lt;/p&gt;

&lt;p&gt;The honest boundary matters: enhancement can make edges easier to inspect, but it cannot recover detail that was never present. Check small type, skin texture, hair, logos, and repeated patterns manually. If a result changes the meaning of text or a face, keep the original beside it.&lt;/p&gt;

&lt;p&gt;Independent project, no NVIDIA affiliation. This is a practical workflow note, not an announcement about NVIDIA Broadcast.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>imageprocessing</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>From Photos to Brick Designs: 2D Mosaics, 3D Models, and Buildability</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Thu, 08 Oct 2026 03:43:25 +0000</pubDate>
      <link>https://dev.to/dlss/from-a-photo-to-a-brick-mosaic-a-local-first-python-pipeline-1ok6</link>
      <guid>https://dev.to/dlss/from-a-photo-to-a-brick-mosaic-a-local-first-python-pipeline-1ok6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; This article was written by an AI assistant and checked against the linked source code and a local test run. The open-source 2D mosaic repository and the separate browser-based 3D website are different projects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9paoy0vdqqh4n2tc8pi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9paoy0vdqqh4n2tc8pi.png" alt="Image2LEGO concept collage: pets, places and original worlds" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fypzqktn89qqejv6cwr47.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fypzqktn89qqejv6cwr47.gif" alt="Animated concept gallery of pet, city, castle and original mecha themes" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;These are original concept illustrations for subject ideas—not screenshots of generated output or verified physical builds.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A photo of a dog, a portrait, a city street, a landscape, or a sketch of an imaginary machine can all be a starting point for a brick design. But the interesting engineering question is not “can AI draw it with studs?” It is what information the design actually contains: an editable model, a parts estimate, steps, and the unresolved checks between a digital proposal and a physical build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Many subjects, different design problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;People and portraits:&lt;/strong&gt; preserve a recognizable silhouette and facial cues while simplifying colors and small details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pets and other animals:&lt;/strong&gt; balance recognizable pose against thin legs, tails and unsupported shapes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buildings and vehicles:&lt;/strong&gt; a single photo hides back surfaces and structure; perspective can distort proportions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Landscapes:&lt;/strong&gt; turn continuous terrain, water and foliage into layers that still read clearly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Original worlds:&lt;/strong&gt; imaginative references are useful, but a plausible image is not automatically a feasible model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So “almost any subject can start the process” is a creative invitation, not a claim that every input produces a ready-to-assemble set. To make the distinction concrete, I use a small, auditable 2D mosaic pipeline below, then explain the separate 3D workflow and the checks it still needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reproducible 2D baseline
&lt;/h2&gt;

&lt;p&gt;A brick-looking image and a usable brick plan are different things. An image model can paint plausible studs without telling you which grid cells are occupied, how many pieces you need, or whether a color can actually be bought. For a flat mosaic, a small deterministic pipeline is often a better starting point than asking a generative model to invent the whole result.&lt;/p&gt;

&lt;p&gt;This local-first Python implementation turns an image into a grid, a preview, a printable pattern and an &lt;em&gt;approximate&lt;/em&gt; parts count. It does &lt;strong&gt;not&lt;/strong&gt; claim to produce a physically verified build.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reproducible example
&lt;/h2&gt;

&lt;p&gt;The repository includes a rocket illustration and a generated mosaic:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fciabhu1vmxk3fc76dije.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fciabhu1vmxk3fc76dije.gif" alt="Animated storyboard of the actual rocket input and 2D mosaic" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This animation uses the repository’s actual input illustration and 2D mosaic; it is not a 3D product demo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuo0ulfuc8lgm6fqr8pht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuo0ulfuc8lgm6fqr8pht.png" alt="Input rocket illustration" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcrolw6x07hqjtdgcp0gb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcrolw6x07hqjtdgcp0gb.png" alt="32 by 32 brick mosaic preview" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this post, the included CLI was run on that source image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brickmosaic examples/rocket.png &lt;span class="nt"&gt;--width&lt;/span&gt; 32 &lt;span class="nt"&gt;--max-colors&lt;/span&gt; 10 &lt;span class="nt"&gt;-o&lt;/span&gt; output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The run reported a &lt;strong&gt;32 × 32 grid, 1,024 occupied cells and 10 colors&lt;/strong&gt;. The 1,024 figure describes this opaque example image; it is not a general result for photos with transparent backgrounds. The project's 11 automated tests also passed in the local environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four decisions that make the output inspectable
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Normalize and sample the image
&lt;/h3&gt;

&lt;p&gt;The loader applies EXIF orientation before converting to RGBA. The image is then resized to the requested grid dimensions with Pillow's BOX resampling. If height is omitted, it follows the source aspect ratio. Width and height are each limited to 1–128 studs so an accidental input does not create a huge pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Treat transparency as an empty cell
&lt;/h3&gt;

&lt;p&gt;A cell below the configurable alpha threshold becomes &lt;code&gt;None&lt;/code&gt; in the grid. That sounds minor, but it means a transparent PNG can produce a shaped mosaic instead of a solid rectangular background. Optional local background removal is available for photographs, but segmentation is fallible: a model can remove a thin antenna or keep part of the background. A transparent image with a clean cutout is the more predictable input.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Match colors in Lab space, then limit the palette
&lt;/h3&gt;

&lt;p&gt;Raw RGB distance is a poor proxy for perceived color difference. The implementation converts sRGB to CIE Lab (D65) and selects nearest palette entries using squared Delta E 1976 distance. It first assigns each opaque cell to the full palette, chooses the most frequent &lt;code&gt;max_colors&lt;/code&gt; entries, then reassigns every opaque cell within that smaller set.&lt;/p&gt;

&lt;p&gt;That two-pass step is important: merely dropping less frequent colors would leave holes or inconsistent counts. The palette is an approximate visual reference, &lt;strong&gt;not&lt;/strong&gt; a certified catalogue of manufacturer part/color combinations.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Export data as well as a preview
&lt;/h3&gt;

&lt;p&gt;The pipeline writes &lt;code&gt;mosaic.png&lt;/code&gt;, &lt;code&gt;pattern.svg&lt;/code&gt;, &lt;code&gt;parts.csv&lt;/code&gt; and &lt;code&gt;plan.json&lt;/code&gt;. The PNG is for a quick look; the numbered SVG is more useful at a workbench. CSV and JSON let you inspect totals and build your own downstream tooling. A test checks that the CSV count and JSON total agree with the grid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI helps—and where it does not
&lt;/h2&gt;

&lt;p&gt;Optional AI background removal runs locally through U²-Net's &lt;code&gt;u2netp&lt;/code&gt; variant. The first AI run downloads model weights; the input image is processed on the user's machine. The segmentation result is only a mask, not a proof of correct bricks or parts availability. The core resize, color assignment and exports are deterministic and work without the AI extra.&lt;/p&gt;

&lt;p&gt;A flat 1×1-stud grid still needs a suitable base, real color/part availability checks, and human review. It says nothing about legal connections, load-bearing support or assembly order for a 3D object. Those claims should stay separate instead of calling every brick-style picture “buildable.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The jump to a 3D proposal
&lt;/h2&gt;

&lt;p&gt;A 2D grid records visible cells. A 3D design must additionally decide depth, hidden surfaces, connections, support, parts and assembly order. Those choices vary by subject: a pet needs pose and support; a building needs walls and a roof; a landscape needs readable terrain layers. One image alone cannot establish every unseen surface.&lt;/p&gt;

&lt;p&gt;The separate Image2LEGO browser workflow accepts a reference image and presents an &lt;strong&gt;editable 3D brick-model proposal&lt;/strong&gt;, with model inspection, steps, a parts view and export options. That makes it a broader starting point for portraits, pets, architecture, landscapes and original concepts. It does not mean every proposed connection is legal, stable, or stocked in real colors. Review the model and parts before buying anything.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/wangsheng1991/brickmosaic-ai" rel="noopener noreferrer"&gt;open-source 2D implementation&lt;/a&gt; contains the CLI, example images and tests. For a &lt;strong&gt;separate browser-based 3D proposal workflow&lt;/strong&gt;, see the &lt;a href="https://image2lego.com/photo-to-bricks/" rel="noopener noreferrer"&gt;photo-to-bricks guide&lt;/a&gt;. That website is not the source code of the 2D repository, and its digital proposals also need manual buildability checks before anyone buys parts.&lt;/p&gt;

&lt;p&gt;Which subject would you try first—and what would you validate before calling its digital proposal a real build?&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>Qwen-Image-2.1 on public prompts: the 4/7 was protocol, not capability</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Fri, 25 Sep 2026 05:08:10 +0000</pubDate>
      <link>https://dev.to/dlss/qwen-image-21-on-public-prompts-the-47-was-protocol-not-capability-411a</link>
      <guid>https://dev.to/dlss/qwen-image-21-on-public-prompts-the-47-was-protocol-not-capability-411a</guid>
      <description>&lt;p&gt;There is one sentence in Qwen-Image-2.1's official README that is very easy to scroll past: &lt;strong&gt;use the official prompt-rewriting models to expand short prompts into detailed descriptions&lt;/strong&gt;. In our first round, we followed none of it.&lt;/p&gt;

&lt;p&gt;That produced an awkward result: asked to draw "a photo of two clocks" using GenEval's original prompt text, it drew one clock. The two other models on the same machine, same card, same seed went 7 for 7.&lt;/p&gt;

&lt;p&gt;The point of this article is that &lt;strong&gt;the 4/7 was not a capability ceiling — it was the way we were feeding the model&lt;/strong&gt; — and that chasing this down explains why the advertised numbers and hands-on experience disagree.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6bbbhxo8bdz2lf6r2ka.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6bbbhxo8bdz2lf6r2ka.gif" alt="The live report page: the headline, the four summary numbers and the nine-domain table" width="560" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Most of the gap is about &lt;em&gt;protocol&lt;/em&gt;, not about the model.&lt;/p&gt;

&lt;p&gt;The recommended pipeline is three things stacked: &lt;strong&gt;prompt rewriter + 2048² + 40 steps&lt;/strong&gt;. Round one used &lt;strong&gt;raw short prompts + 1024² + 20 steps&lt;/strong&gt; — none of the three. Rewrite the prompts into enhancer-style long descriptions and &lt;strong&gt;both object-dropping failures pass immediately&lt;/strong&gt;, at the same resolution, the same seed, on the same machine, with the prompt as the only variable that moved.&lt;/p&gt;

&lt;p&gt;Two things follow. First, this model does not eat terse requests: GenEval's prompts are written for automated scorers and happen to be the worst-case input for the recommended pipeline. Second, estimating your real experience from a leaderboard score means ignoring a whole set of pipeline defaults that sit in between.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round one
&lt;/h2&gt;

&lt;p&gt;Three models on one machine, one GPU, one prompt set: the text is verbatim from public benchmarks (GenEval / DPG-Bench / LongText-Bench), same seed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Qwen-Image-2.1&lt;/th&gt;
&lt;th&gt;SenseNova-U1.5&lt;/th&gt;
&lt;th&gt;FLUX.2-klein-KV&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shape&lt;/td&gt;
&lt;td&gt;7B DiT + Qwen3-VL text encoder, RGBA VAE&lt;/td&gt;
&lt;td&gt;8B+8B MoT, 8 steps&lt;/td&gt;
&lt;td&gt;9B distilled + INT4 KV, 4 steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1024² per image (median)&lt;/td&gt;
&lt;td&gt;52.1 s (20 steps)&lt;/td&gt;
&lt;td&gt;9.8 s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.6 s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2048² per image&lt;/td&gt;
&lt;td&gt;102–111 s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;not supported (≤1536)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text rendering · char accuracy&lt;/td&gt;
&lt;td&gt;74.6%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.5%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;40.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text rendering · line hits&lt;/td&gt;
&lt;td&gt;25/35&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26/35&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4/35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinese long text, line hits&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18/20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18/20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0/20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;English long text, line hits&lt;/td&gt;
&lt;td&gt;7/15&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8/15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4/15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GenEval compositional (7)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4/7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7/7&lt;/td&gt;
&lt;td&gt;7/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DPG-Bench long description (4)&lt;/td&gt;
&lt;td&gt;2 good / 2 flawed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 good&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 good&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native transparent RGBA&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✅ unique&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The three-way contact sheet:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kvmtgynwc6h2yfytyec.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kvmtgynwc6h2yfytyec.jpg" alt="GenEval three-way" width="800" height="1530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qwen's three failures are specific: &lt;code&gt;a photo of two clocks&lt;/code&gt; drew one clock; &lt;code&gt;a photo of a purple wine glass and a black apple&lt;/code&gt; dropped the apple entirely; &lt;code&gt;a photo of a bench&lt;/code&gt; collapsed structurally at 1024².&lt;/p&gt;

&lt;p&gt;It also owns two categories outright. &lt;strong&gt;Chinese long text: 18/20 line hits, level with SenseNova&lt;/strong&gt;, where FLUX scores 0/20 — its Chinese comes out as a solid block of garbage. And &lt;strong&gt;native transparent RGBA is Qwen-only&lt;/strong&gt;; if you need cut-out assets, that alone decides the choice.&lt;/p&gt;

&lt;p&gt;One failure mode worth remembering: on dense small text, Qwen &lt;strong&gt;invents entire blocks of plausible-looking fake words&lt;/strong&gt;. A chalkboard menu comes out neatly laid out and, up close, entirely fabricated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the gap actually comes from
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source of the gap&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Missing prompt rewriter; raw short prompts used&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;largest&lt;/td&gt;
&lt;td&gt;ablation fixes 2/2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Incommensurable metrics&lt;/strong&gt;: vendor composite vs per-prompt pass rate&lt;/td&gt;
&lt;td&gt;large&lt;/td&gt;
&lt;td&gt;their board is a total with no GenEval / DPG split&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Different opponent&lt;/strong&gt;: INT4 4-step distill vs full FLUX&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;td&gt;the klein-KV we ran against is not on that board&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sampling and scoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;td&gt;1 image/prompt, single seed; judged by eye, not Mask2Former&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resolution / steps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;large for structural failures, small for text&lt;/td&gt;
&lt;td&gt;bench: broken at 1K, fine at 2K; long-text scores flat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The second row is worth spelling out: the "small model, big performance" claim rests on &lt;strong&gt;Qwen-Image-Bench, a self-published *composite total&lt;/strong&gt;&lt;em&gt;, with **no GenEval or DPG breakdown&lt;/em&gt;* — it is not commensurable with "4 of 7 prompts passed".&lt;/p&gt;

&lt;p&gt;The official README, meanwhile, is explicit:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For best results, we recommend using the official &lt;strong&gt;prompt rewriting models&lt;/strong&gt; to expand short prompts into detailed, high-quality descriptions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and states its defaults plainly: &lt;code&gt;num_inference_steps = 40&lt;/code&gt;, &lt;code&gt;2048 × 2048&lt;/code&gt;. &lt;strong&gt;Round one followed none of them.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ablation: only the prompt changes
&lt;/h3&gt;

&lt;p&gt;Same machine, same GPU, &lt;strong&gt;2048², 20 steps, seed 42&lt;/strong&gt;. The only change is rewriting GenEval's original text into an enhancer-style long description.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnuq8mjpzkj6n718yvr5s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnuq8mjpzkj6n718yvr5s.jpg" alt="Only the prompt changed" width="800" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;a photo of two clocks&lt;/code&gt; → original text &lt;strong&gt;still draws one clock&lt;/strong&gt;; long description → &lt;strong&gt;exactly two&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;a photo of a purple wine glass and a black apple&lt;/code&gt; → apple missing with the original; long description → &lt;strong&gt;both present, colours bound correctly&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One caveat must travel with this: the right-hand descriptions were &lt;strong&gt;hand-written in the enhancer's style&lt;/strong&gt;, and are &lt;strong&gt;not&lt;/strong&gt; real output from the official rewriter (a fine-tuned Qwen3.5-VL 9B checkpoint we never deployed). So the result shows that prompt &lt;em&gt;form&lt;/em&gt; matters enormously — not that the official rewriter would necessarily recover the score.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do not treat 2K/40 steps as a cure
&lt;/h3&gt;

&lt;p&gt;Re-running the four long-text prompts with the official recipe (2048²/40 steps), with SenseNova at 2048² as a control:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LongText-Bench prompt&lt;/th&gt;
&lt;th&gt;Qwen 1024²/20 steps&lt;/th&gt;
&lt;th&gt;Qwen 2048²/40 steps (official)&lt;/th&gt;
&lt;th&gt;SenseNova 2048²&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;English chalkboard menu&lt;/td&gt;
&lt;td&gt;20.5% · 2/7&lt;/td&gt;
&lt;td&gt;13.7% · 3/7&lt;/td&gt;
&lt;td&gt;63.4% · 3/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;English festival poster&lt;/td&gt;
&lt;td&gt;94.4% · 4/5&lt;/td&gt;
&lt;td&gt;80.6% · 2/5&lt;/td&gt;
&lt;td&gt;73.3% · 1/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinese slide&lt;/td&gt;
&lt;td&gt;81.5% · 12/12&lt;/td&gt;
&lt;td&gt;81.1% · 12/12&lt;/td&gt;
&lt;td&gt;76.9% · 11/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinese festival poster&lt;/td&gt;
&lt;td&gt;90.2% · 3/5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98.6% · 4/5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;97.3% · 4/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;mean (char accuracy · line hits)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;71.7% · 72.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;68.5% · 72.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77.7% · 65.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Text rendering did not improve, and the cost is 172 s/image against 52 s/image at 1024²/20 steps.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An honest qualifier: OCR is not fully comparable across resolutions (smaller, more decorative type at 2K — the poster's 94.4% → 80.6% is the font style eating it), so the fair reading is &lt;strong&gt;"no measurable gain"&lt;/strong&gt;, not "2K is worse".&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Structural&lt;/em&gt; failures, on the other hand, really are a configuration problem — the bench that collapsed at 1024² is fine at 2048²:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyoiyi1hsuq74ljwhsq9s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyoiyi1hsuq74ljwhsq9s.jpg" alt="2K re-test" width="799" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So keep the two goals apart: for compositional prompts the lever is prompt rewriting, not resolution; for correct text the lever is the model, and more steps buy nothing.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A second prompt set: 26 vertical prompts
&lt;/h2&gt;

&lt;p&gt;Public leaderboards measure general capability, which does not answer &lt;em&gt;"which model should take this job"&lt;/em&gt;. So we wrote our own: &lt;strong&gt;9 domains, 26 prompts&lt;/strong&gt;, each carrying its own checkpoints, every model at two sizes (a uniform 1024² for cross-model comparison, plus each model's recommended size) — &lt;strong&gt;156 images&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;th&gt;Key finding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Architecture · exterior&lt;/td&gt;
&lt;td&gt;any of the three&lt;/td&gt;
&lt;td&gt;SenseNova 1024 and FLUX 1536 &lt;strong&gt;hallucinate large signage on glass curtain walls&lt;/strong&gt;; Qwen does not&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture · interior&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SenseNova&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Most stable light layering. At 1024² Qwen drops mood constraints: a night bedroom comes out as daylight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portrait&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;SenseNova&lt;/strong&gt; (close-ups) / any (group)&lt;/td&gt;
&lt;td&gt;The elderly close-up shows the biggest gap: SenseNova is photographic, Qwen visibly smoother&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App · UI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SenseNova&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The only one that renders a correct Chinese UI already at 1024²&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product · e-commerce&lt;/td&gt;
&lt;td&gt;any of the three&lt;/td&gt;
&lt;td&gt;Qwen missed "two bottles" at 1024², but its label text is the most accurate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Game · icons&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Qwen&lt;/strong&gt; (single icon)&lt;/td&gt;
&lt;td&gt;Single icons are commercial-grade from all three; &lt;strong&gt;"12 style-consistent line icons" breaks all three&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anime · 2D&lt;/td&gt;
&lt;td&gt;Qwen / SenseNova (FLUX out)&lt;/td&gt;
&lt;td&gt;On the Chinese poster both write title, subtitle, slot and studio correctly; FLUX garbles the whole block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comic · storyboard&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SenseNova&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Four-panel comic: only it puts each Chinese line &lt;strong&gt;in its own panel&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Illustration · picture book&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SenseNova&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chinese ink-wash: Qwen comes out too faint at both sizes — the negative space swallows the mountains&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The App·UI group is the clearest proof that you cannot pick a model from a leaderboard:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl5rsihqfctq3wvefr6go.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl5rsihqfctq3wvefr6go.jpg" alt="App UI contact sheet" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At 1024² Qwen &lt;strong&gt;shrinks the whole mockup into a small block in the middle with ghosting&lt;/strong&gt;, recovering only at 2048² (line hits 5/12 → 11/12, char accuracy 63.0% → 86.4%). SenseNova is 12/12 at that size to begin with.&lt;/p&gt;

&lt;p&gt;The four-panel comic shows the other thing — on one image, two metrics say different things:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9hsvl8s23ehfmxbjik0u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9hsvl8s23ehfmxbjik0u.jpg" alt="Comic contact sheet" width="799" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qwen &lt;strong&gt;writes all four lines&lt;/strong&gt; (4/4 line hits) but &lt;strong&gt;attaches them to the wrong panels&lt;/strong&gt; and mixes in garbled characters, so char accuracy is 34.8%. SenseNova is 100% · 4/4. &lt;strong&gt;Hit rate answers "was the sentence written", char accuracy answers "are the characters right" — this prompt needs both.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Latency
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Median of the first 18 prompts&lt;/th&gt;
&lt;th&gt;Qwen-Image-2.1&lt;/th&gt;
&lt;th&gt;SenseNova-U1.5&lt;/th&gt;
&lt;th&gt;FLUX.2-klein-KV&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1024²&lt;/td&gt;
&lt;td&gt;53.2 s&lt;/td&gt;
&lt;td&gt;9.8 s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.5 s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;native size&lt;/td&gt;
&lt;td&gt;113.1 s (2048²)&lt;/td&gt;
&lt;td&gt;13.2 s (2048²)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;3.8 s&lt;/strong&gt; (1536²)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 8 vertical prompts &lt;strong&gt;added later are not in this table and must not be compared&lt;/strong&gt;: card 3 was held by a render-farm job while they ran, so the Qwen arm moved to a borrowed card and used the more memory-frugal &lt;code&gt;sequential&lt;/code&gt; offload mode throughout — 97 s at 1024² / 208 s at 2048², roughly 2× round one's &lt;code&gt;model&lt;/code&gt; mode. Offload only changes when weights are staged in and out, not the sampling math, so image quality is unaffected at the same seed, but &lt;strong&gt;the timings are not comparable&lt;/strong&gt;, hence excluded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations — read these with the numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One image per prompt, single seed.&lt;/strong&gt; A spot check, not a leaderboard score; at n=4–7 a single prompt is ±14%.&lt;/li&gt;
&lt;li&gt;Compositional and long-description prompts were judged &lt;strong&gt;by eye&lt;/strong&gt;, not by GenEval's Mask2Former or DPG's mPLUG+CLIP.&lt;/li&gt;
&lt;li&gt;The ablation's long descriptions are hand-written stand-ins, &lt;strong&gt;not&lt;/strong&gt; real rewriter output.&lt;/li&gt;
&lt;li&gt;The three models &lt;strong&gt;did not run the same step count&lt;/strong&gt; (Qwen 20 / SenseNova 8 / FLUX 4) — "best configuration", not "equal budget".&lt;/li&gt;
&lt;li&gt;The 26 vertical prompts are &lt;strong&gt;self-authored&lt;/strong&gt;, not a public benchmark; same one-image-per-prompt caveat.&lt;/li&gt;
&lt;li&gt;The FLUX arm is an &lt;strong&gt;INT4 4-step distilled deployment&lt;/strong&gt;, not the full FLUX 2 Pro / Max on that leaderboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you only want the verdict
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Renders / portraits / UI mockups / comic panels&lt;/strong&gt; → SenseNova, and it is usable at 1024², more than 5× faster than Qwen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anime posters with a big Chinese title, or transparent-background PNGs&lt;/strong&gt; → Qwen; it owns both&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compositionally complex scenes in Qwen&lt;/strong&gt; → turn on prompt rewriting first; do not ask with a terse sentence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strictly consistent multi-element sets&lt;/strong&gt; (12 icons, say) → none of the three; plan on post-processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not estimate real output quality from a leaderboard total&lt;/strong&gt; — a whole set of pipeline defaults sits in between&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prompt text, every generated image, timings and OCR scores are public in &lt;a href="https://github.com/wangsheng1991/qwen-image-2.1-bench" rel="noopener noreferrer"&gt;qwen-image-2.1-bench&lt;/a&gt;, alongside an &lt;a href="https://wangsheng1991.github.io/qwen-image-2.1-bench/" rel="noopener noreferrer"&gt;HTML report&lt;/a&gt; and the &lt;a href="https://github.com/wangsheng1991/qwen-image-2.1-bench/tree/main/scripts" rel="noopener noreferrer"&gt;reproduction scripts&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/blog/prompt-rewrite-ablation.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/blog/prompt-rewrite-ablation.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Picking an image model is not the expensive part&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The useful lesson here is not which model won. It is that the same model scores differently depending on how you feed it — between a leaderboard total and the job on your desk sits a whole set of pipeline defaults. If the job is an interior render, that step is already done for you: RenVi turns one room photo and one style description into a finished render, with the model, resolution and step count handled server-side.&lt;/p&gt;

&lt;p&gt;Upload a room photo, get one render free: &lt;a href="https://www.houseplusplus.com/?ref=qwen-image-2-1-bench" rel="noopener noreferrer"&gt;https://www.houseplusplus.com/?ref=qwen-image-2-1-bench&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>image</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>An ID photo spec table where every number carries the sentence it came from</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Thu, 24 Sep 2026 02:42:04 +0000</pubDate>
      <link>https://dev.to/dlss/an-id-photo-spec-table-where-every-number-carries-the-sentence-it-came-from-2map</link>
      <guid>https://dev.to/dlss/an-id-photo-spec-table-where-every-number-carries-the-sentence-it-came-from-2map</guid>
      <description>&lt;h2&gt;
  
  
  What it solves
&lt;/h2&gt;

&lt;p&gt;The photo you hand in with a document application is a pile of millimetre figures.&lt;/p&gt;

&lt;p&gt;The two most common Russian formats are 3 × 4 cm — medical records, student IDs, passes, military IDs — and 35 × 45 mm, for passports and visa paperwork. It sounds simple until you actually have to crop one: how tall is the head, how much space above it, how white is the background, how many pixels are enough?&lt;/p&gt;

&lt;p&gt;Search for any of those and every page gives a different answer.&lt;/p&gt;

&lt;p&gt;Not because anyone is careless, but because these numbers live in sources of different ages that copy each other: a government page states one part, a photo studio's instructions state another, a visa agency copies both and rewords one. There is no way to tell which figure has a source behind it and which is something a person typed in passing.&lt;/p&gt;

&lt;p&gt;So I did something deliberately dumb: &lt;strong&gt;every number carries the sentence it appeared in.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdtae16msb2hq64fytlp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdtae16msb2hq64fytlp.png" alt="The tool: choose a specification → upload and align → adjust the crop → download" width="800" height="871"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;blockquote class="bluesky-embed"&gt;
&lt;p&gt;What cropping to a spec actually looks like: pick the row, drag the crown and chin onto the guide lines, export a printable 10 × 15 cm sheet.

The photo never leaves the browser.

https://wangsheng1991.github.io/content-engine/topics/passport-photo/&lt;/p&gt;— &lt;a href="https://bsky.app/profile/did:plc:3ga6ca2xxlcvoocope6etxyc?ref_src=embed" rel="noopener noreferrer"&gt; (@wangsheng199.bsky.social)&lt;/a&gt; &lt;a href="https://bsky.app/profile/did:plc:3ga6ca2xxlcvoocope6etxyc/post/3mwdlyx3kn52r?ref_src=embed" rel="noopener noreferrer"&gt;2026-09-25T10:50:56.709Z&lt;/a&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  What a row actually is
&lt;/h2&gt;

&lt;p&gt;A row is not "3 × 4 = 30 × 40 mm". It is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;size in millimetres&lt;/li&gt;
&lt;li&gt;a head-height band&lt;/li&gt;
&lt;li&gt;a headroom band (the space above the head)&lt;/li&gt;
&lt;li&gt;background colour&lt;/li&gt;
&lt;li&gt;minimum DPI&lt;/li&gt;
&lt;li&gt;which sheets it can be laid out on (10 × 15 cm, 4 × 6 in, A4)&lt;/li&gt;
&lt;li&gt;a status: &lt;code&gt;verified&lt;/code&gt; / &lt;code&gt;single-source&lt;/code&gt; / &lt;code&gt;disputed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;and, for every figure, the source URL and the verbatim sentence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first two rows came out like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Фото 3 × 4 см&lt;/strong&gt; — 30 × 40 mm, head (to the top of the hair) 26 mm, 2–4 mm from the top edge to the hair, white background, at least 600 dpi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Фото на паспорт РФ, 35 × 45 мм&lt;/strong&gt; — 35 × 45 mm, head 32–36 mm (70–80% of the photo's height), 4–6 mm of headroom, white background, at least 300 dpi.&lt;/p&gt;

&lt;p&gt;Behind each figure sits a sentence like this one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;необходимо фото размером 30.00mm × 40.00mm с разрешением не менее 600 dpi. Фон должен быть белый, без посторонних предметов и теней.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Source, sentence, date read. The point is that &lt;strong&gt;a stranger can re-read that sentence months later instead of trusting me.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three rules
&lt;/h2&gt;

&lt;h3&gt;
  
  
  One: a figure whose sentence cannot be read does not enter the table
&lt;/h3&gt;

&lt;p&gt;This is the most important rule and the easiest one to break. A number shows up, it looks reasonable, it appears in several places — but if I cannot find the sentence itself, it does not go in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two: a contradicting figure is not deleted — it stays, with the reason it lost
&lt;/h3&gt;

&lt;p&gt;This is the counter-intuitive one.&lt;/p&gt;

&lt;p&gt;One source puts the head height for 3 × 4 at &lt;strong&gt;11–13 mm&lt;/strong&gt;. Three others say 26 mm. An 11–13 mm head inside a 40 mm frame is a third of the height, which no acceptance desk takes — and the same page says "не менее 70–80%" three entries above.&lt;/p&gt;

&lt;p&gt;Normally you delete that as noise.&lt;/p&gt;

&lt;p&gt;It is still in the table, with its source and a note on why it was rejected.&lt;/p&gt;

&lt;p&gt;Because the next person re-reading that page will hit the same 11–13 mm and have the same moment of doubt. Shown only a clean table, they will assume the scrape was wrong or their reading was, and spend an afternoon re-deriving what I already derived. Left there with the reason, they reach the same conclusion in five seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A rejected judgement is still data; it is just a different shape.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Three: a row with a single source is not shipped
&lt;/h3&gt;

&lt;p&gt;The table holds a third format: the newer 35 × 45 for application forms, head 25–30 mm, headroom 3 mm ± 1 mm.&lt;/p&gt;

&lt;p&gt;Exactly one page describes it. The format is still being phased in and there is very little public material.&lt;/p&gt;

&lt;p&gt;Its status is &lt;code&gt;single-source&lt;/code&gt;, and it never appears on the live site — pages are generated only from &lt;code&gt;verified&lt;/code&gt; rows.&lt;/p&gt;

&lt;p&gt;The reason is plain: &lt;strong&gt;one source is not evidence, it is a claim.&lt;/strong&gt; The same figure written independently in two unrelated places is what makes it dependable. That rule is hard, and it does not bend because a number looks sensible or because someone is impatient for that size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the photo goes
&lt;/h2&gt;

&lt;p&gt;All of the above is about checking figures. The tool's half has one rule: &lt;strong&gt;the photo does not go to a server.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftc6er5l1d3vjl9klv95p.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftc6er5l1d3vjl9klv95p.gif" alt="The tool in use: choose the spec → align the head guides → export the printable sheet" width="620" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The file is read into a canvas through &lt;code&gt;FileReader&lt;/code&gt;, cropped to the chosen spec, annotated with the head-height guide lines so you can check them yourself, laid out into a printable sheet, and downloaded directly with &lt;code&gt;canvas.toBlob&lt;/code&gt;. No upload, no backend on this path, no account.&lt;/p&gt;

&lt;p&gt;You can open the page, disconnect from the network, and it still works.&lt;/p&gt;

&lt;p&gt;The reason for taking this seriously: &lt;strong&gt;a document photo is the highest-stakes image most people ever handle.&lt;/strong&gt; It carries their face, their name usually sits elsewhere in the same application, and it exists in order to be handed to an institution. Making someone upload it to an unfamiliar server just to change its size is indefensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not do
&lt;/h2&gt;

&lt;p&gt;Honesty beats a feature list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It does not find your face.&lt;/strong&gt; You align the guide; it draws the head-height limits so you can check them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The background is replaced with a flat colour, not segmented hair by hair.&lt;/strong&gt; Fine edges will not be perfect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It will happily produce a photo that gets rejected for reasons it cannot see&lt;/strong&gt; — expression, glasses glare, shadows, a face turned slightly away. It is a layout tool, not a compliance oracle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We do not claim "meets visa requirements".&lt;/strong&gt; Every desk adds its own rule. The tool can vouch for two things — the dimensions and the head proportion — against the source it quotes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check it yourself
&lt;/h2&gt;

&lt;p&gt;The cheapest test: print the exported sheet at 100% and measure it. 30 × 40 mm is 30 × 40 mm, and the top of the head sits inside a 4–6 mm band.&lt;/p&gt;

&lt;p&gt;To check the figures themselves, every source link is in &lt;code&gt;source.yaml&lt;/code&gt; and every sentence is in &lt;code&gt;evidence.json&lt;/code&gt;, verbatim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;photo-visa.online — &lt;a href="https://photo-visa.online/s/foto-na-3-na-4-onlayn" rel="noopener noreferrer"&gt;https://photo-visa.online/s/foto-na-3-na-4-onlayn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;photo-visa.online — &lt;a href="https://photo-visa.online/s/foto-na-3-na-4-onlayn" rel="noopener noreferrer"&gt;https://photo-visa.online/s/foto-na-3-na-4-onlayn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;pasporta.org — &lt;a href="https://pasporta.org/zagranpasport/foto-na-zagranpasport/" rel="noopener noreferrer"&gt;https://pasporta.org/zagranpasport/foto-na-zagranpasport/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;pasporta.org — &lt;a href="https://pasporta.org/zagranpasport/foto-na-zagranpasport/" rel="noopener noreferrer"&gt;https://pasporta.org/zagranpasport/foto-na-zagranpasport/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;visa-guru.ru — &lt;a href="https://visa-guru.ru/blog/zagranpassport/foto-na-zagranpasport" rel="noopener noreferrer"&gt;https://visa-guru.ru/blog/zagranpassport/foto-na-zagranpasport&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;The photo never has to leave your device&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article is about how the specs were verified. If what you actually need is to turn the photo in your phone into a 3 × 4 print, that step needs no install and no upload: pick the size, align the head-height guide and export a printable sheet, all of it on your own device. The photo does not leave the tab, and every size in the table carries the sentence it came from.&lt;/p&gt;

&lt;p&gt;Open the passport photo tool (free, no upload): &lt;a href="https://www.dlss5nvidia.com/tools/passport-photo?ref=passport-photo" rel="noopener noreferrer"&gt;https://www.dlss5nvidia.com/tools/passport-photo?ref=passport-photo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>tools</category>
      <category>webdev</category>
      <category>image</category>
    </item>
    <item>
      <title>Image-to-video in three parameters: how a 5-second clip costs twice what it should</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Tue, 22 Sep 2026 10:09:33 +0000</pubDate>
      <link>https://dev.to/dlss/image-to-video-in-three-parameters-how-a-5-second-clip-costs-twice-what-it-should-27ll</link>
      <guid>https://dev.to/dlss/image-to-video-in-three-parameters-how-a-5-second-clip-costs-twice-what-it-should-27ll</guid>
      <description>&lt;p&gt;一张 1024×768 的室内效果图，一句运动提示词，五秒后拿到一段可以发出去的镜头。这是图生视频里最省事的一档，也是我们六月份给渲见（RenVi）做营销素材时走的那条路。&lt;/p&gt;

&lt;p&gt;结论先放这里：&lt;strong&gt;模型本身没坑，坑在两个参数的默认值上。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyv5x8ez2xnuh63o8379e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyv5x8ez2xnuh63o8379e.jpg" alt="输入：一张 1024×768 的效果图" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  我们实际跑出来的东西
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;实测值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;模型&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wan2.6-i2v-flash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输入&lt;/td&gt;
&lt;td&gt;一张效果图，以 data URI 内联&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;请求参数&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;resolution: 720P&lt;/code&gt;、&lt;code&gt;duration: 5&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1108×830、5.007 秒、H.264、约 5.5 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;附带音轨&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;有，AAC 立体声 44.1 kHz&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单条成本&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;¥1.50&lt;/strong&gt;（本该是 ¥0.75）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;那个 AAC 音轨不是我们要的 —— 是&lt;strong&gt;没人告诉模型不要&lt;/strong&gt;。下面三节就是那三个参数。&lt;/p&gt;

&lt;p&gt;首尾两帧放在一起是这样，五秒里只有一次缓慢的推镜：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpht8v5n60cat9o0qb8k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpht8v5n60cat9o0qb8k.jpg" alt="首帧与末帧" width="799" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  一、&lt;code&gt;audio&lt;/code&gt; 默认是开着的，价格正好翻倍
&lt;/h2&gt;

&lt;p&gt;官方文档在 &lt;code&gt;audio&lt;/code&gt; 这一栏写的是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;可选值：true：默认值，输出有声视频。false：输出无声视频。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;而价格页同一行模型是这样标的：&lt;strong&gt;720P 有声 0.3 元/秒，无声 0.15 元/秒&lt;/strong&gt;；1080P 有声 0.5 元/秒，无声 0.25 元/秒。&lt;/p&gt;

&lt;p&gt;也就是说，&lt;strong&gt;不写 &lt;code&gt;audio&lt;/code&gt; 就是按有声计费&lt;/strong&gt;。五秒的有声 720P 是 ¥1.50，无声是 ¥0.75 —— 差的这一块钱，买到的是一段你根本没打算用的 AI 环境音。&lt;/p&gt;

&lt;p&gt;我们那批素材就是这么付的：三条片子的文件里都带着音轨，因为当时的脚本 &lt;code&gt;parameters&lt;/code&gt; 里只有 &lt;code&gt;resolution&lt;/code&gt; 和 &lt;code&gt;duration&lt;/code&gt;。复现脚本现在默认 &lt;code&gt;audio: false&lt;/code&gt;，要声音得显式写 &lt;code&gt;--audio true&lt;/code&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  二、&lt;code&gt;resolution&lt;/code&gt; 不是清晰度开关，是像素预算 —— 而且默认 1080P
&lt;/h2&gt;

&lt;p&gt;文档里这句话值得读两遍：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;模型根据选择的分辨率档位，自动缩放至相近总像素，视频宽高比将尽量与输入图像 img_url 的宽高比保持一致。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;所以选 720P 拿到的不一定是 1280×720。我们的输入是 4:3（1024×768），输出就是 &lt;strong&gt;1108×830&lt;/strong&gt; —— 91.96 万像素，和 1280×720 的 92.16 万几乎一样。它是「给够这么多像素，形状跟着你的图走」，不是「裁成 16:9」。&lt;/p&gt;

&lt;p&gt;更要紧的是同一段文档的另一句：&lt;code&gt;wan2.6-i2v-flash&lt;/code&gt; 的 &lt;strong&gt;&lt;code&gt;resolution&lt;/code&gt; 默认值是 1080P&lt;/strong&gt;。不写它，就按 1080P 的价钱算，哪怕你的输入图只有 1024 宽、根本喂不出真 1080P 的细节。&lt;/p&gt;

&lt;h2&gt;
  
  
  三、&lt;code&gt;duration&lt;/code&gt; 是 2–15 的整数，不是 5/10 两档
&lt;/h2&gt;

&lt;p&gt;网上关于图生视频的笔记很多写「只有 5 秒和 10 秒」，那说的是 &lt;code&gt;wan2.6-i2v-us&lt;/code&gt;。flash 这一档的文档原文是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;取值为[2, 15]之间的整数。默认值为 5。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;也就是说 7 秒、9 秒、13 秒都可以，单价按秒线性计费。做产品展示时，比「五秒切下一张」好看得多的用法是&lt;strong&gt;一张图 12 秒慢慢推&lt;/strong&gt;，成本仍然是一秒一秒算的。&lt;/p&gt;

&lt;h2&gt;
  
  
  接口只有一个模式：异步
&lt;/h2&gt;

&lt;p&gt;这个接口没有同步调用这一回事。请求必须带上 &lt;code&gt;X-DashScope-Async: enable&lt;/code&gt;，否则直接报错 —— 原文是「HTTP 请求只支持异步，必须设置为 enable」，缺少这个头会返回 &lt;code&gt;current user api does not support synchronous calls&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;拿到 &lt;code&gt;task_id&lt;/code&gt; 之后轮询，状态就六种：&lt;code&gt;PENDING&lt;/code&gt;、&lt;code&gt;RUNNING&lt;/code&gt;、&lt;code&gt;SUCCEEDED&lt;/code&gt;、&lt;code&gt;FAILED&lt;/code&gt;、&lt;code&gt;CANCELED&lt;/code&gt;、&lt;code&gt;UNKNOWN&lt;/code&gt;。&lt;strong&gt;&lt;code&gt;UNKNOWN&lt;/code&gt; 不是「还没好」，是「任务不存在」&lt;/strong&gt; —— 任务 ID 只保留 24 小时，结果链接也是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;链接有效期 24 小时，可通过此 URL 下载视频。视频格式为 MP4（H.264 编码）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;所以「提交完先去干别的，回头再下载」这种做法，隔夜就失效了。脚本里轮询完成立刻落盘，不是洁癖，是必须。&lt;/p&gt;

&lt;h2&gt;
  
  
  复现
&lt;/h2&gt;

&lt;p&gt;脚本在这个仓库里，零依赖，只用 Node 和 DashScope 的接口：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;QWEN_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-...     &lt;span class="c"&gt;# 或 DASHSCOPE_API_KEY&lt;/span&gt;
node scripts/wan-i2v.mjs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--image&lt;/span&gt; room.jpg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"slow cinematic dolly-in through the cozy renovated living room, gentle smooth camera motion, soft warm natural light, photorealistic, stable, no people"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resolution&lt;/span&gt; 720P &lt;span class="nt"&gt;--duration&lt;/span&gt; 5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log&lt;/span&gt; run.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;默认 &lt;code&gt;--audio false&lt;/code&gt;（省钱那档），要声音加 &lt;code&gt;--audio true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;图片直接读本地文件转 data URI，不需要对象存储，也不需要先把图传到公网&lt;/li&gt;
&lt;li&gt;每 8 秒轮询一次，最多 40 次；&lt;strong&gt;超时和 &lt;code&gt;FAILED&lt;/code&gt; 都会报错退出，不会留下一段空文件&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;跑完把 &lt;code&gt;task_id&lt;/code&gt;、轮询次数、实际耗时、文件大小写进 &lt;code&gt;run.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我们那批素材的量测日志在 &lt;a href="https://github.com/wangsheng1991/content-engine/blob/main/research/wan-i2v/measured-2026-09-22.json" rel="noopener noreferrer"&gt;research/wan-i2v/measured-2026-09-22.json&lt;/a&gt;，每条片子都带 sha256，尺寸、时长、音轨、字节数都可以自己复算。&lt;/p&gt;

&lt;h2&gt;
  
  
  这四个参数的取舍
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;默认&lt;/th&gt;
&lt;th&gt;建议&lt;/th&gt;
&lt;th&gt;为什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;audio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt;（有声）&lt;/td&gt;
&lt;td&gt;显式写 &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;无声 720P ¥0.15/秒，有声 ¥0.3/秒，正好一倍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;resolution&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1080P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;按输入图的实际像素选&lt;/td&gt;
&lt;td&gt;720P 和 1080P 是 ¥0.15 / ¥0.25 每秒；输入只有 1024 宽时，1080P 是白付的钱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2–15 的整数，按内容节奏选&lt;/td&gt;
&lt;td&gt;按秒计费，镜头需要多久就给多久&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watermark&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;保持 &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;商用素材不该带「AI 生成」角标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  这条链能做到哪、做不到哪
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;能做&lt;/strong&gt;：把一张已经满意的静图变成有镜头运动的短视频，用于商品页、社媒、效果图转视频。成本是每条几毛到一块多。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不做&lt;/strong&gt;：长视频、多镜头叙事（那是 &lt;code&gt;shot_type: multi&lt;/code&gt;，另一档模型）、把糟糕的图救回来 —— 输入决定上限，模型只负责给它加运动。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;一个真实的边界&lt;/strong&gt;：我们这次是拿 AI 生成的效果图当首帧。真实照片同样可以，但房间的结构、透视关系会跟着动，出现金属反射、灯光逻辑错误时，多半要减小运动幅度重跑，而不是加大提示词。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;五秒的镜头，成本七毛五。这个价钱意味着可以&lt;strong&gt;为每个风格各出一条&lt;/strong&gt;，而不是精挑细选只做一条 —— 营销素材的供给量，比单条质量更容易做出差别。&lt;/p&gt;

&lt;h2&gt;
  
  
  证据
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;图生视频接口只支持异步调用：请求必须带 X-DashScope-Async: enable。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;缺少异步请求头时接口直接报错，不存在同步等待视频的用法。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;resolution 决定的是总像素预算，输出宽高比会尽量跟随输入图，而不是固定裁成 16:9。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wan2.6-i2v-flash 的 resolution 可选 720P / 1080P，默认值是 1080P（也就是贵的那一档）。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wan2.6-i2v-flash 的 duration 取值是 [2, 15] 之间的整数，默认 5 秒，而不是只有 5 秒和 10 秒两档。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;audio 的默认值是 true，也就是默认输出有声视频；想要无声必须显式写 false。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;官方文档写明 audio 直接影响费用，有声与无声按不同价格计费。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;结果视频的下载链接只有 24 小时有效期，格式为 MP4（H.264 编码）。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;异步任务的状态枚举包含 PENDING、RUNNING、SUCCEEDED、FAILED、CANCELED 和 UNKNOWN，其中 UNKNOWN 表示任务不存在而非尚未完成。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;北京地域 wan2.6-i2v-flash 按输出秒数计费：720P 有声 0.3 元/秒、无声 0.15 元/秒；1080P 有声 0.5 元/秒、无声 0.25 元/秒。 — &lt;a href="https://help.aliyun.com/zh/model-studio/model-pricing" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/model-pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;1024×768 的输入图，在 720P 档位下产出的是 1108×830（91.96 万像素，与 1280×720 的 92.16 万相当），印证了「相近总像素 + 跟随输入宽高比」。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;我们那批片子每条都带 AAC 立体声音轨，因为当时的请求没有传 audio，默认按有声生成（并计费）。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;量测出的成片时长是 5.007 秒，与请求的 5 秒一致。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;复现脚本每 8 秒轮询一次，最多 40 次。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/scripts/wan-i2v.mjs" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/scripts/wan-i2v.mjs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;复现脚本显式发送 audio: false，不把「贵一倍」交给服务端的默认值。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/scripts/wan-i2v.mjs" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/scripts/wan-i2v.mjs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;一张照片进去，几秒后出来一张能用的效果图&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;上面那条链的起点，是渲见（RenVi）里最常见的一个动作：把家里的房间照片传上去，选一个风格，等几秒。 效果图满意了，再往「变成镜头」这一步走。 视频只是素材的一种形态；真正决定转化的是第一张图好不好看、要等多久。&lt;/p&gt;

&lt;p&gt;上传房间照片，免费出一张效果图: &lt;a href="https://www.houseplusplus.com/?ref=wan-i2v-first-frame" rel="noopener noreferrer"&gt;https://www.houseplusplus.com/?ref=wan-i2v-first-frame&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>tutorial</category>
      <category>cost</category>
    </item>
    <item>
      <title>SHARP：单张图的秒级 3D 高斯视图合成</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Tue, 22 Sep 2026 09:48:32 +0000</pubDate>
      <link>https://dev.to/dlss/sharpdan-zhang-tu-de-miao-ji-3d-gao-si-shi-tu-he-cheng-9a1</link>
      <guid>https://dev.to/dlss/sharpdan-zhang-tu-de-miao-ji-3d-gao-si-shi-tu-he-cheng-9a1</guid>
      <description>&lt;p&gt;单目视图合成要解决的问题很直接：给你一张照片，生成它附近视角的新画面，而且要看起来像真的。难的地方在于，一张照片没有视差，深度、遮挡、反射都缺信息。此前的做法往往要在「更真」和「更快」之间做取舍。&lt;/p&gt;

&lt;p&gt;Apple 的 SHARP 给出的答案是把取舍绕开：不一步步重建场景，而是让神经网络把整张照片直接读成一份 3D 表示。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd5orb1dylrvly8eqdl4p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd5orb1dylrvly8eqdl4p.jpg" alt="一张照片 → 一份可实时渲染的 3D 高斯表示" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SHARP 在做什么
&lt;/h2&gt;

&lt;p&gt;按官方仓库 README 的描述，SHARP 接收一张照片，回归出这个场景的 3D 高斯（3D Gaussian）表示参数。整个过程是一次神经网络前馈，在标准 GPU 上耗时不到 1 秒。生成的 3D 高斯表示随后可以被实时渲染，输出附近视角的高分辨率写实图像。&lt;/p&gt;

&lt;p&gt;README 还提到两点对开发者很关键：&lt;/p&gt;

&lt;p&gt;第一，这个表示是 metric 的，带绝对尺度，因此支持米制相机运动——你给出的相机位移是有物理单位的，而不是一个随意缩放的相对量。&lt;/p&gt;

&lt;p&gt;第二，坐标约定遵循 OpenCV（x 向右、y 向下、z 向前），而 3DGS 场景中心大致位于 (0, 0, +z)。这意味着把 &lt;code&gt;.ply&lt;/code&gt; 交给第三方渲染器时，需要自己缩放和旋转，把场景重新居中。&lt;/p&gt;

&lt;p&gt;按 README 的描述，整个过程不针对单个场景做迭代优化，而是一次前馈就把参数吐出来。这一点对工程上的意义很直接：推理路径短，你不需要为每张新图重新跑一轮训练式的流程。&lt;/p&gt;

&lt;h2&gt;
  
  
  关键数字一览
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;此前最佳模型&lt;/th&gt;
&lt;th&gt;SHARP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LPIPS&lt;/td&gt;
&lt;td&gt;README 未给出绝对值，作为对比基准&lt;/td&gt;
&lt;td&gt;相对降低 25–34%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DISTS&lt;/td&gt;
&lt;td&gt;README 未给出绝对值，作为对比基准&lt;/td&gt;
&lt;td&gt;相对降低 21–43%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合成耗时&lt;/td&gt;
&lt;td&gt;README 未给出绝对值，作为对比基准&lt;/td&gt;
&lt;td&gt;降低三个数量级；标准 GPU 上不到 1 秒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生成方式&lt;/td&gt;
&lt;td&gt;README 未说明&lt;/td&gt;
&lt;td&gt;单次前馈（single feedforward pass）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出形式&lt;/td&gt;
&lt;td&gt;README 未说明&lt;/td&gt;
&lt;td&gt;3D 高斯泼溅（3DGS），&lt;code&gt;.ply&lt;/code&gt; 文件，兼容公共渲染器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;泛化能力&lt;/td&gt;
&lt;td&gt;README 未说明&lt;/td&gt;
&lt;td&gt;论文称具备跨数据集的鲁棒零样本泛化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;表格里凡是 README 没写的，就空着，不替论文补数字。这些百分比描述的是相对此前最佳模型的改善幅度，不是绝对分值——LPIPS 和 DISTS 都是越低越好，所以「降低」是好事，但 README 没有给出绝对分值，这里也就不做换算。&lt;/p&gt;

&lt;h2&gt;
  
  
  从仓库到第一条预测命令
&lt;/h2&gt;

&lt;p&gt;README 给出的上手路径很常规：建环境、装依赖、跑 CLI。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda create &lt;span class="nt"&gt;-n&lt;/span&gt; sharp &lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.13
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
sharp &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;权重不需要手动准备：第一次运行时模型 checkpoint 会自动下载，并缓存在 &lt;code&gt;~/.cache/torch/hub/checkpoints/&lt;/code&gt;。如果你更想自己管理权重，README 也给了直接下载 &lt;code&gt;.pt&lt;/code&gt; 文件的方式，再用 &lt;code&gt;-c&lt;/code&gt; 参数把本地 checkpoint 指给命令。&lt;/p&gt;

&lt;p&gt;真正的推理只有一行：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sharp predict &lt;span class="nt"&gt;-i&lt;/span&gt; /path/to/input/images &lt;span class="nt"&gt;-o&lt;/span&gt; /path/to/output/gaussians
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出目录里是 3D 高斯泼溅文件。如果你还想额外拿到一条相机轨迹的视频，加上 &lt;code&gt;--render&lt;/code&gt;；也可以从中间结果出发单独渲染：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sharp predict &lt;span class="nt"&gt;-i&lt;/span&gt; /path/to/input/images &lt;span class="nt"&gt;-o&lt;/span&gt; /path/to/output/gaussians &lt;span class="nt"&gt;--render&lt;/span&gt;
sharp render &lt;span class="nt"&gt;-i&lt;/span&gt; /path/to/output/gaussians &lt;span class="nt"&gt;-o&lt;/span&gt; /path/to/output/renderings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  适合谁用，以及现在还不能做什么
&lt;/h2&gt;

&lt;p&gt;按 README 的描述，它的定位是「单张图进、附近视角出」：适合照片量少、没有多视角采集条件，但又想要可自由换视角画面的场景，也适合把已有图像资产快速转成可实时渲染的 3D 资产。因为表示带绝对尺度，涉及真实位移的场景也能对得上单位。&lt;/p&gt;

&lt;p&gt;另一个按 README 可以合理推断的好处来自耗时：既然单次前馈不到 1 秒，这一步就有可能放进交互式流程里，而不用当成一次离线批处理任务。不过 README 没有给出吞吐、并发或显存方面的数据，真要拿它做线上服务，还是得自己压测。&lt;/p&gt;

&lt;p&gt;局限同样来自 README，写清楚比夸大更有用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;高斯预测本身在 CPU、CUDA、MPS 上都能跑，但用 &lt;code&gt;--render&lt;/code&gt; 渲染相机轨迹视频目前要求 CUDA GPU，也就是说只有 CUDA 机器能直接出视频；&lt;/li&gt;
&lt;li&gt;gsplat 渲染器首次启动时初始化要等一会儿；&lt;/li&gt;
&lt;li&gt;接第三方 3DGS 渲染器需要按上面的坐标系约定缩放旋转、重新居中；&lt;/li&gt;
&lt;li&gt;README 把定量与定性评估都指向论文和项目页，本页只复述 README 与摘要里的数字，不做额外推断。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  自己跑一遍
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda create &lt;span class="nt"&gt;-n&lt;/span&gt; sharp &lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.13
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
sharp &lt;span class="nt"&gt;--help&lt;/span&gt;
sharp predict &lt;span class="nt"&gt;-i&lt;/span&gt; /path/to/input/images &lt;span class="nt"&gt;-o&lt;/span&gt; /path/to/output/gaussians
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;把 &lt;code&gt;-i&lt;/code&gt; 换成你自己的图片目录，权重会在首次运行时自动下载。如果你的目标只是先把手里图片的质量提上去，也可以直接在线试 AI 图像增强，不必先跑通本地环境。&lt;/p&gt;

&lt;h2&gt;
  
  
  证据
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SHARP 通过单次前馈在标准 GPU 上以不到 1 秒的时间回归出场景的 3D 高斯表示参数。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SHARP 产出的 3D 高斯表示可以被实时渲染，生成附近视角的高分辨率写实图像。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;该表示是 metric 的，带绝对尺度，支持米制的相机运动。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;实验结果展示了 SHARP 跨数据集的鲁棒零样本泛化能力。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;在多个数据集上，SHARP 相对此前最佳模型把 LPIPS 降低 25–34%、DISTS 降低 21–43%，同时把合成耗时降低三个数量级。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;预测结果是以 3D 高斯泼溅（3DGS）形式存放在输出目录中的可渲染结果。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;官方 CLI 的预测入口是 sharp predict，用 -i 指定输入图像目录、-o 指定输出高斯目录。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;模型权重在第一次运行时自动下载，并缓存到 ~/.cache/torch/hub/checkpoints/。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;高斯预测在 CPU、CUDA 和 MPS 上都能工作，但通过 --render 渲染相机轨迹视频目前需要 CUDA GPU。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;输出的 3DGS 遵循 OpenCV 坐标约定（x 右、y 下、z 前），场景中心大致在 (0, 0, +z)，接第三方渲染器时需要自行缩放与旋转来重新居中。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;图像的鲁棒表示已经有了，你的照片也可以先变清楚&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SHARP 展示了一件值得记住的事：一张普通照片里，本来就藏着足够多的信息，只要有一个足够鲁棒的表示方式把它读出来。 在你自己的照片上，最实用的第一步往往不是重建 3D，而是先把图像本身的质量拉起来。 DLSS 5 是一个在线 AI 图像编辑器，把手里已有的图画上传上去，就能试试我们的 AI 超分与画质增强。&lt;/p&gt;

&lt;p&gt;上传图片，试试 AI 增强: &lt;a href="https://www.dlss5nvidia.com/?ref=ml-sharp" rel="noopener noreferrer"&gt;https://www.dlss5nvidia.com/?ref=ml-sharp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>3dvision</category>
      <category>gaussiansplatting</category>
      <category>viewsynthesis</category>
      <category>apple</category>
    </item>
  </channel>
</rss>
