<?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: Peter Zhao</title>
    <description>The latest articles on DEV Community by Peter Zhao (@zhaoyouqi).</description>
    <link>https://dev.to/zhaoyouqi</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%2F4214113%2F6287352a-60f1-4bf7-ba3a-2f4fd9b2e3ce.jpg</url>
      <title>DEV Community: Peter Zhao</title>
      <link>https://dev.to/zhaoyouqi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zhaoyouqi"/>
    <language>en</language>
    <item>
      <title>Three Image Models Tried to Change 70% to 50%. One Changed the Wrong Text.</title>
      <dc:creator>Peter Zhao</dc:creator>
      <pubDate>Thu, 29 Oct 2026 03:30:49 +0000</pubDate>
      <link>https://dev.to/zhaoyouqi/three-image-models-tried-to-change-70-to-50-one-changed-the-wrong-text-1p49</link>
      <guid>https://dev.to/zhaoyouqi/three-image-models-tried-to-change-70-to-50-one-changed-the-wrong-text-1p49</guid>
      <description>&lt;p&gt;We asked three image-editing models to change &lt;code&gt;70%&lt;/code&gt; to &lt;code&gt;50%&lt;/code&gt; on a shop-window sign. One model changed the large &lt;code&gt;SALE&lt;/code&gt; instead, leaving &lt;code&gt;70%&lt;/code&gt; untouched. A second attempt made the same kind of mistake.&lt;/p&gt;

&lt;p&gt;The other two models changed the requested number, but the surrounding image still changed. That made the experiment more interesting than a simple question of whether the new text was legible.&lt;/p&gt;

&lt;p&gt;This is a small, practical exploration using real photographs, not a model benchmark or a ranking. The outputs were generated for product examples, and the models used different API settings and produced different output dimensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup: one sign, three models
&lt;/h2&gt;

&lt;p&gt;The source image is a shop-window photograph with a red sign reading &lt;code&gt;WEEKEND SALE&lt;/code&gt; and &lt;code&gt;UP TO 70% OFF&lt;/code&gt;. The task was to replace &lt;code&gt;70%&lt;/code&gt; with &lt;code&gt;50%&lt;/code&gt;, match the lettering and perspective, and leave everything else alone.&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%2Fjpnpk3yufhq55qlskaa3.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%2Fjpnpk3yufhq55qlskaa3.webp" alt="Original photograph of a red sale sign in a shop window, with the text UP TO 70% OFF." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Original photograph by &lt;a href="https://unsplash.com/photos/weekend-sale-signage-5UJbKYUjFCk" rel="noopener noreferrer"&gt;Markus Spiske on Unsplash&lt;/a&gt;, used under the &lt;a href="https://unsplash.com/license" rel="noopener noreferrer"&gt;Unsplash License&lt;/a&gt;. The subsequent versions of this image are AI-edited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We sent the same image and initial instruction to Grok Imagine Image 2.0, Nano Banana 2.1, and Qwen 2.1. Here is the actual prompt used for those initial requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Replace only the following text in the provided image:
1. "70%" -&amp;gt; "50%"

Match each original text's lettering style, size, weight, color, spacing, alignment and perspective. Keep all other text and image content unchanged. Do not add grain, distressing, texture or other visual effects absent from the source image.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The instruction describes our goal; it does not guarantee that pixels outside the target stay unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure: a plausible sign with the wrong text changed
&lt;/h2&gt;

&lt;p&gt;The first Qwen output replaced the large &lt;code&gt;SALE&lt;/code&gt; with &lt;code&gt;50%&lt;/code&gt; and left the original &lt;code&gt;70%&lt;/code&gt; on the lower line. A second attempt using the same replacement instruction made the same kind of mistake.&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%2Fl9v4akb5qnpasp6pn8wy.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%2Fl9v4akb5qnpasp6pn8wy.webp" alt="First Qwen output: the large SALE has changed to 50%, while UP TO 70% OFF remains on the lower line." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;First Qwen output. The sign still looks plausible at a glance, but it fails the requested edit.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We then changed the replacement target to the complete discount line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. "UP TO 70% OFF" -&amp;gt; "UP TO 50% OFF"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rest of the prompt stayed the same. That later output preserved &lt;code&gt;SALE&lt;/code&gt; and changed the intended line:&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%2Fc3ih0pj9g9gv81naolsw.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%2Fc3ih0pj9g9gv81naolsw.webp" alt="Qwen output after the full-line instruction: SALE is preserved and the lower line reads UP TO 50% OFF." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Later Qwen output using the full-line replacement instruction.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Providing more context coincided with a usable result in this example. With only a few attempts, we cannot tell how reliably that change would help: image generation varies between calls, and the final instruction was different from the initial one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other results: correct text, changed details
&lt;/h2&gt;

&lt;p&gt;Grok and Nano Banana both changed the lower line to &lt;code&gt;UP TO 50% OFF&lt;/code&gt; while keeping the large &lt;code&gt;SALE&lt;/code&gt; in place on their initial outputs.&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%2Fqbraw0k2q9aau14e237r.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%2Fqbraw0k2q9aau14e237r.webp" alt="Grok output with the lower sale-sign text changed to UP TO 50% OFF." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Grok output using the initial prompt.&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%2F17eyud784kq55xshxuan.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%2F17eyud784kq55xshxuan.webp" alt="Nano Banana output with the lower sale-sign text changed to UP TO 50% OFF." width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nano Banana output using the initial prompt.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The requested number is right in both, but the letters and red surface differ from the original. These are generated renderings, not a guarantee of an exact font match or a pixel-preserving replacement.&lt;/p&gt;

&lt;p&gt;The initial three calls shared an image and prompt, but their parameters and output dimensions were not identical. The later Qwen success used a different instruction. These images are useful examples of possible outcomes, not evidence that one model is generally better than another.&lt;/p&gt;

&lt;h2&gt;
  
  
  A second failure: a small digit on a menu
&lt;/h2&gt;

&lt;p&gt;We also tried changing a chalkboard menu price from &lt;code&gt;2,5&lt;/code&gt; to &lt;code&gt;2,8&lt;/code&gt;. The first Grok output wrote &lt;code&gt;2,6&lt;/code&gt;. A later Nano Banana call wrote the requested &lt;code&gt;2,8&lt;/code&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%2Fl7rqy78n3jrqarvyuegy.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%2Fl7rqy78n3jrqarvyuegy.webp" alt="Original chalkboard menu with the first price shown as 2,5." width="800" height="600"&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%2Ftkqpyz4utunkmyguh4it.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%2Ftkqpyz4utunkmyguh4it.webp" alt="Grok-edited menu with the first price incorrectly rendered as 2,6." width="800" height="533"&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%2F0cjlp89ivqu51wi7239b.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%2F0cjlp89ivqu51wi7239b.webp" alt="Nano Banana-edited menu with the first price rendered as 2,8." width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Original photograph by &lt;a href="https://unsplash.com/photos/chalkboard-menu-outside-a-french-cafe-with-coffee-prices-QOM-ulmcLpE" rel="noopener noreferrer"&gt;Annie Spratt on Unsplash&lt;/a&gt;, used under the &lt;a href="https://unsplash.com/license" rel="noopener noreferrer"&gt;Unsplash License&lt;/a&gt;. The second and third images are AI-edited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These were separate calls using different models and aspect-ratio settings, not a head-to-head comparison. The mistake is still instructive: a tiny wrong digit can be easy to miss when the rest of the image looks convincing.&lt;/p&gt;

&lt;p&gt;We also asked Grok to change a shop sign from &lt;code&gt;10am - 4pm&lt;/code&gt; to &lt;code&gt;10am - 6pm&lt;/code&gt;. The first request returned a provider error without an image; a separate retry changed the time, while surrounding wood, brick, and window details were redrawn.&lt;/p&gt;

&lt;p&gt;Across the three examples, eight requests returned images: five outputs passed our text checks and were selected for the website; three contained incorrect edits. One additional request returned a provider error. The images displayed here are resized and compressed for the web; the generated content was not manually corrected.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we check now
&lt;/h2&gt;

&lt;p&gt;These examples led to a simple review routine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read the new text literally.&lt;/strong&gt; Check each character, digit, and punctuation mark against the request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the text that should not have changed.&lt;/strong&gt; A model may change the wrong line, as Qwen did with &lt;code&gt;SALE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare the lettering and surroundings at full size.&lt;/strong&gt; Look for changes in letter shapes, spacing, perspective, texture, and nearby objects. If you need the replacement to &lt;a href="https://imagetexttools.com/edit-text-in-image-same-font" rel="noopener noreferrer"&gt;keep the original lettering style&lt;/a&gt; rather than match a font file, that's the case we wrote up separately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat more context as another attempt, not a guarantee.&lt;/strong&gt; If the target is ambiguous, specifying the full line may be worth trying, but the new result still needs review.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the exact typeface, editable text layers, or unchanged background are essential, working from the original design assets may be a better fit.&lt;/p&gt;

&lt;p&gt;For those building image-editing workflows: how do you validate that a generated edit changed the intended text without introducing unwanted changes elsewhere?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://imagetexttools.com/blog/what-changes-when-ai-edits-text-in-a-photo" rel="noopener noreferrer"&gt;ImageTextTools blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>nanobanana</category>
    </item>
  </channel>
</rss>
