<?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: Zippic</title>
    <description>The latest articles on DEV Community by Zippic (@zippic).</description>
    <link>https://dev.to/zippic</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%2F4190600%2F344abed6-1511-4a10-a7f1-07aa96098c4d.png</url>
      <title>DEV Community: Zippic</title>
      <link>https://dev.to/zippic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zippic"/>
    <language>en</language>
    <item>
      <title>Why a QR Code Stops Scanning After Image Compression</title>
      <dc:creator>Zippic</dc:creator>
      <pubDate>Sat, 14 Nov 2026 20:21:06 +0000</pubDate>
      <link>https://dev.to/zippic/why-a-qr-code-stops-scanning-after-image-compression-2l77</link>
      <guid>https://dev.to/zippic/why-a-qr-code-stops-scanning-after-image-compression-2l77</guid>
      <description>&lt;p&gt;A QR code can look intact in a compressed event flyer and still fail on a phone. The three corner markers remain visible, the text around it looks acceptable, and the file passes the upload limit. Yet the camera cannot reliably separate the smaller squares that carry the data.&lt;/p&gt;

&lt;p&gt;That makes a QR-bearing image a different optimization problem from an ordinary photograph. Visual similarity is useful, but successful decoding of the final delivered image is the acceptance test. A smaller file is not an improvement if people cannot use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protect the grid and its quiet zone
&lt;/h2&gt;

&lt;p&gt;The small squares in a QR code are called modules. A scanner needs to distinguish their positions and identify the symbol against its surroundings. DENSO WAVE, the developer of QR Code, specifies a clear margin four modules wide on every side of a standard QR code. That margin is the quiet zone, not disposable whitespace.&lt;/p&gt;

&lt;p&gt;Cropping tightly around the black pattern removes useful structure. Placing a caption, border, or busy photograph immediately against it can also interfere with detection. Preserve the quiet zone as part of the asset when placing a code in a flyer or slide. An opaque light background is more predictable than transparency when the destination background may change.&lt;/p&gt;

&lt;p&gt;For a hypothetical grid 29 modules wide, adding four modules on each side produces a total width of 37 modules. Rendering each module as four pixels produces a 148-pixel-wide image including the margin. This is arithmetic for planning an export, not a universal minimum size or a promise that every scanner can read it.&lt;/p&gt;

&lt;p&gt;Keep the original generated QR asset. If its intended display size changes substantially, regenerate it for the new layout rather than repeatedly resizing an already compressed screenshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate resampling damage from encoding damage
&lt;/h2&gt;

&lt;p&gt;Resizing changes where module boundaries fall in the pixel grid. When the new dimensions do not align cleanly with that grid, a resampler may create gray transition pixels or make adjacent modules uneven in width. Heavy reduction can leave too few pixels to represent the pattern reliably.&lt;/p&gt;

&lt;p&gt;Lossy encoding creates a different risk. Ringing, small blocks, or smudged transitions can appear around high-contrast edges even when the image dimensions stay unchanged. A photograph can tolerate some of those changes while a small QR code cannot.&lt;/p&gt;

&lt;p&gt;An integer number of source pixels per module is a useful starting point for a raster export. It does not guarantee an integer mapping on every screen: page layout, display density, and browser scaling can resample the image again. Avoid treating a clean-looking source file as proof that the published version will work.&lt;/p&gt;

&lt;p&gt;When investigating a failure, compare exports with one variable changed at a time. Keep the dimensions constant while trying a different encoding setting. Then keep the encoding choice constant while changing the layout or source size. If an entire flyer must shrink, enlarge the code within the design before exporting again instead of expecting compression settings to recover missing modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compress a copy without assuming QR-aware processing
&lt;/h2&gt;

&lt;p&gt;For a one-off file, &lt;a href="https://zippic.app" rel="noopener noreferrer"&gt;zippic&lt;/a&gt; provides a browser-local compression workflow: choose the image, select an output format, optionally change dimensions under Resize Settings, then use Start Compress and download the result. Its public page says images are not uploaded to a server for compression and no account is required.&lt;/p&gt;

&lt;p&gt;For an isolated QR graphic, PNG is a reasonable first output to evaluate because the asset consists mainly of sharp, flat-color boundaries. This does not mean every PNG export is automatically optimal or that a tool's PNG option guarantees unchanged pixels. Compare the downloaded result, not just the format label.&lt;/p&gt;

&lt;p&gt;Begin without resizing. If the resulting file already meets the destination's requirement and scans reliably, there is no reason to reduce its dimensions further. For a photograph-heavy flyer, a photo-oriented output may be practical, but the embedded code needs its own close inspection and scan test.&lt;/p&gt;

&lt;p&gt;The compressor's public page does not describe a QR-aware resizer or a QR validation feature. Do not assume it will preserve module alignment or detect a broken code. It also has no exact target-file-size setting; an upload ceiling requires checking the actual download and adjusting as necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the version people will actually receive
&lt;/h2&gt;

&lt;p&gt;Scan the downloaded file at the size it will appear, using a second device when the image is displayed on a screen. Check the decoded destination before opening it; recognition of some QR payload is not enough if the asset contains the wrong link.&lt;/p&gt;

&lt;p&gt;Then test the delivery channel. A messaging service, publishing platform, or social network may resize or re-encode the upload. Open the published image through the normal viewing path and scan that version too. For printed material, test a physical proof at the intended size under realistic lighting and distance rather than scanning an enlarged desktop preview.&lt;/p&gt;

&lt;p&gt;If the delivered version fails, return to the layout or original QR asset. Restore the quiet zone, allocate more space, or reduce unnecessary detail in the surrounding design. Keep a readable text URL next to the code where practical so the destination remains accessible when scanning is inconvenient. That fallback should remain live and legible in the final export as well.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://www.qrcode.com/en/howto/code.html" rel="noopener noreferrer"&gt;DENSO WAVE: code area and quiet zone&lt;/a&gt;; &lt;a href="https://www.qrcode.com/en/howto/cell.html" rel="noopener noreferrer"&gt;DENSO WAVE: module size and scanner limits&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was prepared on behalf of zippic.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Free Image Compressor in the Browser: When “No Upload” Actually Matters</title>
      <dc:creator>Zippic</dc:creator>
      <pubDate>Thu, 05 Nov 2026 01:54:37 +0000</pubDate>
      <link>https://dev.to/zippic/free-image-compressor-in-the-browser-when-no-upload-actually-matters-dd5</link>
      <guid>https://dev.to/zippic/free-image-compressor-in-the-browser-when-no-upload-actually-matters-dd5</guid>
      <description>&lt;p&gt;Most free image compressor sites look the same from the outside: a drop zone, a progress bar, a download button. Underneath, they split into two architectures. Some send your file to a server, compress it there, and send it back. Others ship the encoder to your browser and never transmit the image at all. Both are legitimate designs. The useful question is when the difference is worth caring about, because “no upload” is often marketed as if it were always the deciding factor, and it isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an upload-based compressor does
&lt;/h2&gt;

&lt;p&gt;Server-side tools have real advantages. They can run any encoder written in any language, they don't depend on the visitor's hardware, and many of them have been tuned for years. TinyPNG is the best-known example. Its site explains that it quantizes PNGs to reduce the number of colors, turning 24-bit images into 8-bit indexed ones, and strips unnecessary metadata. It also states its retention policy plainly: uploaded images are kept for a maximum of 48 hours and then permanently deleted. The free web tool accepts up to 20 images at a time, each up to 5 MB, with paid Web Pro and Web Ultra plans for more.&lt;/p&gt;

&lt;p&gt;That is a reasonable deal for a lot of work. If you are compressing a hero image for a blog post that will be public in an hour, a 48-hour retention window on someone else's server does not change your risk in any meaningful way.&lt;/p&gt;

&lt;h2&gt;
  
  
  When “no upload” matters
&lt;/h2&gt;

&lt;p&gt;The calculation changes when the image itself is sensitive, or when sending it anywhere is a problem regardless of what happens to it afterward.&lt;/p&gt;

&lt;p&gt;Unreleased product shots, internal dashboards, and screenshots of admin panels are the obvious cases. A screenshot taken for a bug report often contains customer names, email addresses, or a token in a corner nobody looked at. Scanned IDs, contracts, and medical paperwork are another category. People compress these all the time to get under upload limits on government or insurance portals, and they are exactly the files that should not take a detour through a third party.&lt;/p&gt;

&lt;p&gt;There is also the organizational angle. Many companies restrict which external services may receive company data. A developer can be fairly sure that a compression service deletes files promptly and still be in breach of policy for using it. A tool that processes files locally avoids the question entirely, because nothing leaves the device.&lt;/p&gt;

&lt;p&gt;Then there are practical reasons that have nothing to do with privacy. A 30 MB camera file on a slow connection spends most of its “compression time” in transit: upload the whole file, wait, download the result. Doing the work locally removes both transfers. Per-file size caps on free server tools exist partly because of that bandwidth cost; a browser-based tool is limited by device memory instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  How browser-based compression works
&lt;/h2&gt;

&lt;p&gt;Two platform features make this practical. WebAssembly lets mature encoders written in C, C++, or Rust run inside the browser at usable speeds; open-source projects such as MozJPEG, libwebp, OxiPNG, and libavif are common candidates for this kind of build. Web Workers move the encoding off the main thread so the page stays responsive while a large image is processed.&lt;/p&gt;

&lt;p&gt;The trade-offs are real. Memory is finite: a decoded image costs roughly width × height × 4 bytes no matter how small the original file was, so a 24-megapixel photo occupies close to 100 MB as raw pixels. Phones are slower than servers. Encoder modules add download weight to the page. Well-built local tools respond by recommending a per-file ceiling and processing batches with limited concurrency, rather than promising unlimited capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't take “no upload” on faith
&lt;/h2&gt;

&lt;p&gt;Any site can write “your files never leave your device” in its hero section. Checking takes about a minute:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open DevTools and switch to the Network tab.&lt;/li&gt;
&lt;li&gt;Compress an image of known size, for example a 4 MB JPEG.&lt;/li&gt;
&lt;li&gt;Look for a request with a payload of roughly that size. Filtering by Fetch/XHR and sorting by size makes it easy to spot.&lt;/li&gt;
&lt;li&gt;For a stronger test, load the page, disconnect from the network, and compress again. If it still works, the processing is local.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You will see some requests regardless: analytics, ads, fonts. Those are not your image. What you are looking for is a request whose body is the size of your file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quality is mostly about settings, not location
&lt;/h2&gt;

&lt;p&gt;A common assumption is that server tools produce better output because they have more compute behind them. In practice, output quality depends on the encoder and its settings far more than on where the encoder runs. The same encoder at the same quality setting produces essentially the same result on a server or in a WebAssembly module. What does vary between tools is the amount of control you get: whether you can set quality yourself, which output formats are offered (WebP and AVIF matter for most web work), and how metadata is handled.&lt;/p&gt;

&lt;p&gt;One behavior surprises people regardless of architecture. Compressing a JPEG that has already been heavily compressed can produce a larger file, because re-encoding at a higher quality setting than the original used adds bytes without adding detail. Start from originals whenever you can.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short decision guide
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Public images in small batches: use whichever tool gives you output you like.&lt;/li&gt;
&lt;li&gt;Sensitive images, or files covered by a data-handling policy: process locally.&lt;/li&gt;
&lt;li&gt;Large originals on a slow connection: local processing saves the round trip.&lt;/li&gt;
&lt;li&gt;Hundreds of files: check the batch and size limits of a server tool's free tier; with a local tool, check that batches run with limited concurrency so the tab doesn't run out of memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trying one
&lt;/h2&gt;

&lt;p&gt;If you want a browser-based option to test with the DevTools method above, &lt;a href="https://zippic.app/" rel="noopener noreferrer"&gt;zippic&lt;/a&gt; is a free image compressor that runs client-side using WebAssembly and Web Workers. There is no sign-up, it handles JPG, PNG, WebP, GIF, AVIF, BMP, and common camera RAW formats, and quality is adjustable. The example on its homepage takes a 2.95 MB image down to 247 KB. The project recommends keeping individual files under 50 MB, which reflects browser memory rather than a usage quota.&lt;/p&gt;

&lt;p&gt;Whichever tool you end up using, the Network tab is the most reliable answer to the question of where your image went.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>privacy</category>
      <category>opensource</category>
    </item>
    <item>
      <title>APNG vs GIF for Small Web Animations: Transparency, Loops and File Size</title>
      <dc:creator>Zippic</dc:creator>
      <pubDate>Mon, 26 Oct 2026 09:56:58 +0000</pubDate>
      <link>https://dev.to/zippic/apng-vs-gif-for-small-web-animations-transparency-loops-and-file-size-45jp</link>
      <guid>https://dev.to/zippic/apng-vs-gif-for-small-web-animations-transparency-loops-and-file-size-45jp</guid>
      <description>&lt;p&gt;Spinners, success checkmarks, a waving mascot on an empty state, chat stickers: small looping animations still get exported as GIF by default, mostly out of habit. GIF works everywhere, but it was designed in 1987, and its limits show up quickly once the animation has soft edges or sits on a dark background.&lt;/p&gt;

&lt;p&gt;APNG (Animated PNG) is the other format that every major browser plays natively without JavaScript. Here is when it beats GIF, when it doesn't, and a few practical details about loops, timing and file size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; use APNG when the animation has soft edges or translucency, set &lt;code&gt;num_plays&lt;/code&gt; to 1 for one-shot animations, keep frame delays in multiples of 10 ms, and trim frames before you compress.&lt;/p&gt;

&lt;h2&gt;
  
  
  What GIF can and can't store
&lt;/h2&gt;

&lt;p&gt;From MDN's image format guide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each GIF pixel is an 8-bit index into a palette of 24-bit colors, and the palette has at most 256 entries. Anything with gradients or many shades gets dithered.&lt;/li&gt;
&lt;li&gt;Pixels are opaque unless one palette index is designated as transparent, and pixels with that index are fully transparent. There is no partial transparency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That second point matters most for UI work. Anti-aliased outlines, soft shadows and translucent highlights all rely on partial alpha. In a GIF, every pixel has to snap to fully opaque or fully transparent, which is where jagged edges and the familiar light halo around stickers come from. The halo usually appears when the artwork was flattened against a white background before export and then placed on a dark one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What APNG adds
&lt;/h2&gt;

&lt;p&gt;APNG extends PNG, so each frame can use any PNG color mode, including true color with an 8- or 16-bit alpha channel. Compression is lossless. MDN describes APNG as a good fit for "basic animations that do not need to synchronize to other activities or to a sound track, such as progress indicators, activity throbbers, and other animated sequences".&lt;/p&gt;

&lt;p&gt;The comparison below is a demonstration from a single 320×270 frame with an anti-aliased outline and a soft, semi-transparent drop shadow. For the GIF, semi-transparent pixels were flattened onto a white matte and then cut with a 1-bit transparency threshold, which is how a typical GIF export behaves. The other side is the original PNG. Both sit on a &lt;code&gt;#1f2937&lt;/code&gt; background, and the boxed area on the lower-left outline is enlarged 3x. The GIF shows a light, jagged fringe along the outline, and the shadow is gone. The PNG keeps smooth edges and the shadow.&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%2F7dgwrnizoedd8ddbggig.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%2F7dgwrnizoedd8ddbggig.png" alt="One frame exported as GIF on a white matte and as the original PNG, on a dark background and zoomed 3x. The GIF has a light jagged fringe on the outline and no shadow; the PNG keeps smooth edges and the soft shadow" width="740" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Browser support
&lt;/h3&gt;

&lt;p&gt;MDN lists APNG support from Chrome 59, Edge 12, Firefox 3, Opera 46 and Safari 8. The MIME type is &lt;code&gt;image/apng&lt;/code&gt;, and the file can keep the &lt;code&gt;.png&lt;/code&gt; extension. You use it like any other image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/img/loader.png"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"48"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"48"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Loading"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Where GIF still makes sense
&lt;/h3&gt;

&lt;p&gt;If a file has to pass through a system you don't control that only accepts &lt;code&gt;.gif&lt;/code&gt;, such as an upload field or a third-party integration, GIF is the safe choice. And if you are optimizing purely for bytes on a photographic or detailed animation, MDN points out that animated WebP and AVIF compress better than both. APNG sits in the middle: lossless, full alpha, and universally supported in current browsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Loops and timing: two details worth knowing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Loop count.&lt;/strong&gt; APNG stores a &lt;code&gt;num_plays&lt;/code&gt; value. According to the W3C PNG specification, &lt;code&gt;0&lt;/code&gt; means play indefinitely, and any other number means the animation stops on its final frame after the last play. That makes a one-shot micro-animation easy: set loops to 1 and make the last frame the resting state. A success checkmark plays once and stays checked, with no JavaScript needed to swap in a static image. Loaders want &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame delay.&lt;/strong&gt; Each frame's delay is stored as a fraction of a second (&lt;code&gt;delay_num / delay_den&lt;/code&gt;). Many encoders write it in hundredths of a second, so a 33 ms delay may end up as 30 ms. Picking multiples of 10 ms (50, 80, 100) keeps the timing you set identical to what ends up in the file.&lt;/p&gt;

&lt;p&gt;If you also respect &lt;code&gt;prefers-reduced-motion&lt;/code&gt;, you can swap in a static image with &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"/img/mascot-still.png"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(prefers-reduced-motion: reduce)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/img/mascot.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Mascot waving"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Building an APNG from PNG frames
&lt;/h2&gt;

&lt;p&gt;Export each frame as a transparent PNG at the final size, then assemble them. Command-line tools like APNG Assembler work well in a build pipeline. For a one-off, a browser tool is quicker. zippic's &lt;a href="https://zippic.app/apng-maker" rel="noopener noreferrer"&gt;APNG Maker&lt;/a&gt; is one option. It processes images locally in the browser without uploading them, and lets you set the canvas size, a default delay, per-frame delays, the loop count and a fill color.&lt;/p&gt;

&lt;p&gt;A few defaults to change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Canvas&lt;/strong&gt; defaults to 640×480. Set it to your frame size. Frames are scaled to fit and centered, so frames that don't match the canvas get padded with the fill color.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fill Color&lt;/strong&gt; defaults to &lt;code&gt;#00000000&lt;/code&gt; (fully transparent). Leave it that way if you want alpha.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default Frame Delay&lt;/strong&gt; defaults to 30 ms, which is fast for most UI motion. Start around 80–100 ms and adjust individual frames in the frame list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loop Count&lt;/strong&gt; defaults to &lt;code&gt;0&lt;/code&gt; (infinite). Change it to 1 for one-shot animations.&lt;/li&gt;
&lt;/ul&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%2Fxbs366hcjb2strk4doxt.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%2Fxbs366hcjb2strk4doxt.png" alt="APNG Maker with 10 frames loaded: canvas 320×270, 100 ms per frame, loop count 3, transparent fill" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the file small
&lt;/h2&gt;

&lt;p&gt;Full color plus alpha can get heavy, so cut at the source first:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Trim the canvas.&lt;/strong&gt; Empty transparent margins still cost bytes in every frame.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drop frames.&lt;/strong&gt; A 10-frame loader at 100 ms can read just as well as 20 frames at 50 ms, at roughly half the frame data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hold instead of repeating.&lt;/strong&gt; For a pause, use one frame with a longer delay rather than several identical frames.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then compress.&lt;/strong&gt; zippic's &lt;a href="https://zippic.app/" rel="noopener noreferrer"&gt;homepage compressor&lt;/a&gt; has an APNG output format with a quality slider. In the test shown below, the 10-frame example went from 15.33 KB to 5.52 KB at 75% quality. Results depend heavily on the artwork, so preview the output to check that the animation and edges still look right.&lt;/li&gt;
&lt;/ol&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%2Fj5xqcn4ri2odeovtc9a7.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%2Fj5xqcn4ri2odeovtc9a7.png" alt="zippic homepage compressor with APNG output selected: 15.33 KB to 5.52 KB at 75% quality" width="800" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A real-world constraint: LINE stickers
&lt;/h2&gt;

&lt;p&gt;For a platform that requires APNG, look at LINE. Its Creators Market accepts animated stickers only as APNG, with a published spec: 5–20 frames per sticker, 1–4 loops, at most 4 seconds of total playback across all loops, a maximum of 320×270 px with at least one side of 270 px or more, a transparent background, and up to 1 MB per file. A GIF won't upload, and an APNG left at the default infinite loop gets rejected too. It's a useful checklist even if you never ship a sticker, because it's a sensible budget for any small looping UI animation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick decision guide
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Soft edges, translucency, or a dark or variable background: &lt;strong&gt;APNG&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Must pass through a GIF-only pipeline: &lt;strong&gt;GIF&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Bytes matter most and you can provide fallbacks: consider &lt;strong&gt;animated WebP or AVIF&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;One-shot animation that should come to rest: &lt;strong&gt;APNG with loop count 1&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;MDN, Image file type and format guide: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;W3C, PNG Specification (Third Edition), acTL and fcTL chunks: &lt;a href="https://www.w3.org/TR/png-3/" rel="noopener noreferrer"&gt;https://www.w3.org/TR/png-3/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LINE Creators Market, Animated sticker guidelines: &lt;a href="https://creator.line.me/en/guideline/animationsticker/" rel="noopener noreferrer"&gt;https://creator.line.me/en/guideline/animationsticker/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>images</category>
      <category>animation</category>
    </item>
    <item>
      <title>How to Compress an Image to 100KB (or 50KB, 20KB) Online</title>
      <dc:creator>Zippic</dc:creator>
      <pubDate>Sat, 17 Oct 2026 14:00:52 +0000</pubDate>
      <link>https://dev.to/zippic/how-to-compress-an-image-to-100kb-or-50kb-20kb-online-55ip</link>
      <guid>https://dev.to/zippic/how-to-compress-an-image-to-100kb-or-50kb-20kb-online-55ip</guid>
      <description>&lt;p&gt;You're filling in a job application, a visa form or an exam registration, and the upload box comes back with: &lt;strong&gt;"File size must not exceed 100KB."&lt;/strong&gt; Your phone photo is 3MB. Sound familiar?&lt;/p&gt;

&lt;p&gt;This guide covers why these limits exist, what actually controls an image's file size, and how to get a photo under 100KB, 50KB or even 20KB with &lt;a href="https://zippic.app/?utm_source=devto" rel="noopener noreferrer"&gt;zippic&lt;/a&gt;. zippic is a free image compressor that runs entirely in your browser. Your photo is never uploaded to a server, and you don't need an account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do websites limit images to 100KB?
&lt;/h2&gt;

&lt;p&gt;Small upload limits show up in a few places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Job, visa and exam portals.&lt;/strong&gt; Government and recruitment sites take thousands of photos and scanned signatures, often on older systems. Strict caps such as 20KB, 50KB or 100KB keep storage and bandwidth under control. Many of these portals also set pixel dimensions or ask for JPG only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email.&lt;/strong&gt; Mail providers cap total attachment size. A few small images fit easily, while several full-resolution photos may not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web forms and profile photos.&lt;/strong&gt; Contact forms, CMS uploads and avatar fields often set a low maximum so pages stay fast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The exact rules vary from portal to portal, so &lt;strong&gt;always read the official instructions first&lt;/strong&gt;: file size, pixel dimensions, format and background. Then compress to match them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What determines an image's file size?
&lt;/h2&gt;

&lt;p&gt;Three things matter, roughly in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pixel dimensions.&lt;/strong&gt; The phone photo in the example below is 3376 Ã— 4239, about 14.3 million pixels. Resized to 1200 Ã— 1507, it has about 1.8 million. Fewer pixels means much less data, so resizing is the most powerful lever by far, especially for small targets like 20KB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format.&lt;/strong&gt; JPG and WebP are &lt;em&gt;lossy&lt;/em&gt; formats designed for photos, and they can get very small. PNG is lossless. That's great for screenshots and graphics, but a PNG photo is usually far larger than a JPG of the same photo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality level.&lt;/strong&gt; Lossy formats let you trade detail for size. Lowering quality shrinks the file, but if you push it too far you get blur and blocky artifacts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Image content plays a part too. A plain-background portrait compresses much smaller than a detailed landscape at the same dimensions and quality. That's why no setting gives exactly 100KB for every photo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step by step: compress an image to 100KB with zippic
&lt;/h2&gt;

&lt;p&gt;zippic doesn't have a "type in a target KB" box. Instead it &lt;strong&gt;shows you the compressed size right after each run&lt;/strong&gt;, so you adjust and re-run until you're under your limit. With the two controls below, that usually takes a couple of tries.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the &lt;a href="https://zippic.app/?utm_source=devto" rel="noopener noreferrer"&gt;zippic image compressor&lt;/a&gt;&lt;/strong&gt; and click &lt;em&gt;"Choose an image or drag &amp;amp; drop it here"&lt;/em&gt;. zippic accepts JPG, PNG, WebP, AVIF, JXL, GIF, HEIC and RAW files. Once loaded, it shows the original file size and pixel dimensions (in the example below: &lt;em&gt;1.46 MB â€¢ 3376Ã—4239&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&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%2Fmvp2x36e1i6va62cdix1.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%2Fmvp2x36e1i6va62cdix1.webp" alt="zippic image compressor homepage with an empty upload area, format options with JPG selected, quality slider at 75% and Resize Settings switched off" width="800" height="576"&gt;&lt;/a&gt;&lt;br&gt;
   &lt;em&gt;The zippic compressor before upload: Format, Quality (default 75%) and Resize Settings.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Choose the output format.&lt;/strong&gt; Under &lt;strong&gt;Format&lt;/strong&gt;, keep &lt;strong&gt;JPG&lt;/strong&gt; (the default) for application portals. Most of them only accept JPG/JPEG. WebP, AVIF, JXL and PNG are also available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set the quality.&lt;/strong&gt; The &lt;strong&gt;Quality&lt;/strong&gt; slider runs from &lt;strong&gt;50% to 100%&lt;/strong&gt; and starts at &lt;strong&gt;75%&lt;/strong&gt;. For small targets, start around 60â€“75%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resize the image.&lt;/strong&gt; Turn on the &lt;strong&gt;Resize Settings&lt;/strong&gt; switch and enter a &lt;strong&gt;Width&lt;/strong&gt; in pixels. If you leave Height empty, zippic keeps the original aspect ratio. For example, a 3376 Ã— 4239 photo resized to a width of 1200 comes out as 1200 Ã— 1507.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click "Start Compress".&lt;/strong&gt; zippic shows the &lt;strong&gt;Compressed Size&lt;/strong&gt;, the new dimensions and the &lt;strong&gt;Compression Ratio&lt;/strong&gt; next to the original. In the example below, a 1.46 MB JPG (3376 Ã— 4239) at &lt;strong&gt;JPG, quality 75%, width 1200&lt;/strong&gt; came out at &lt;strong&gt;70.60 KB (1200 Ã— 1507)&lt;/strong&gt;, a 95.27% reduction. That's well under a 100KB limit on the first try.&lt;/li&gt;
&lt;/ol&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%2Fj2kdhpmmkiprzf84ttn9.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%2Fj2kdhpmmkiprzf84ttn9.webp" alt="zippic settings set to JPG, quality 75% and resize width 1200. The result shows original 1.46 MB at 3376Ã—4239 compressed to 70.60 KB at 1200Ã—1507, a compression ratio of 95.27%" width="800" height="483"&gt;&lt;/a&gt;&lt;br&gt;
   &lt;em&gt;JPG, 75% quality, 1200 px wide: 1.46 MB â†’ 70.60 KB.&lt;/em&gt;&lt;br&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%2Fwdeek78ylcprdqhwydwa.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%2Fwdeek78ylcprdqhwydwa.webp" alt="Before-and-after comparison slider in zippic showing the original and compressed versions of a close-up fly photo with no visible quality loss" width="800" height="615"&gt;&lt;/a&gt;&lt;br&gt;
   &lt;em&gt;Drag the comparison slider to check the compressed image against the original.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check against your limit.&lt;/strong&gt; Still too big? Lower the width or the quality and click &lt;em&gt;Start Compress&lt;/em&gt; again. You don't need to re-upload. Comfortably under? Raise the quality a little to get a sharper image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click "Download".&lt;/strong&gt; The file is saved with a &lt;code&gt;_compressed&lt;/code&gt; suffix (e.g. &lt;code&gt;photo_compressed.jpg&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything happens on your device, which matters when the image is a passport photo, an ID scan or a signature.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt; in the example above, reducing the width from 3376 px to 1200 px did most of the work. At the default 75% quality, the file still dropped from 1.46 MB to 70.60 KB. &lt;strong&gt;Dimensions do the heavy lifting, and quality fine-tunes.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Tips for hitting an exact target
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Resize first, then fine-tune quality
&lt;/h3&gt;

&lt;p&gt;Quality alone often isn't enough, because the slider only goes down to 50%. A full-resolution phone photo usually needs resizing too. So pick dimensions that get you close, then use the quality slider for the last few kilobytes. If the portal specifies pixel dimensions (for example a particular photo size), use exactly those. Many photo specs also fix the aspect ratio. If yours does, crop first with the &lt;a href="https://zippic.app/image-cropper?utm_source=devto" rel="noopener noreferrer"&gt;image cropper&lt;/a&gt;, which has preset sizes for ID photos and exam registrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  JPG vs WebP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JPG&lt;/strong&gt; is the safe choice for any form, portal or email recipient. It's universally accepted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebP&lt;/strong&gt; often produces smaller files than JPG at similar visual quality, and it's a good choice for your own website. Many official portals don't accept it, though, so check the allowed formats before you use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PNG&lt;/strong&gt; only makes sense for graphics, screenshots or images that need transparency. For a photo under 100KB, it's rarely the right tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quality levels to try
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;75%&lt;/strong&gt;: a good starting point that looks clean for most photos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;60â€“70%&lt;/strong&gt;: usually still fine for profile and ID-style photos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;50%&lt;/strong&gt;: the slider's minimum. Use it for very small targets like 20KB, together with a smaller width.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you hit 50% and the file is still too big, reduce the width again rather than fighting the quality slider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leave a small safety margin
&lt;/h3&gt;

&lt;p&gt;zippic's size readout uses 1 KB = 1,024 bytes. Some portals count 1 KB as 1,000 bytes, so a file shown as 99 KB could be read as just over 100 KB. Aim for roughly 5% under the limit, e.g. about 95 KB for a 100KB cap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common size targets (approximate guidance)
&lt;/h2&gt;

&lt;p&gt;These are &lt;strong&gt;rough starting points for a typical JPG photo&lt;/strong&gt;, not guarantees. Detailed images need smaller dimensions or lower quality, and simple portraits can go bigger. Always check the result zippic shows.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target size&lt;/th&gt;
&lt;th&gt;Starting width (long side)&lt;/th&gt;
&lt;th&gt;Starting quality&lt;/th&gt;
&lt;th&gt;Typical use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;20KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~400â€“600 px&lt;/td&gt;
&lt;td&gt;50â€“60%&lt;/td&gt;
&lt;td&gt;Signatures, small ID/exam photos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;50KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~600â€“800 px&lt;/td&gt;
&lt;td&gt;50â€“70%&lt;/td&gt;
&lt;td&gt;Application photos, avatars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;100KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~800â€“1200 px&lt;/td&gt;
&lt;td&gt;50â€“75%&lt;/td&gt;
&lt;td&gt;Job/visa portals, forms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;200KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1200â€“1600 px&lt;/td&gt;
&lt;td&gt;60â€“75%&lt;/td&gt;
&lt;td&gt;Email images, documents, web uploads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Guidance only: these are approximate starting points, not measured results. Real sizes vary with image content, so always check the Compressed Size zippic shows.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The compressed file is larger than the original.&lt;/strong&gt;&lt;br&gt;
This happens when the source has already been heavily compressed, for example an image saved from a chat app. Compressing it again can add data. Start from the original photo if you can, and resize it down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I can't get below 20KB.&lt;/strong&gt;&lt;br&gt;
Lower the width further (try 400 px or less) and set quality to 50%. Also check that the format is JPG, not PNG.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The portal rejects my file even though it's under the limit.&lt;/strong&gt;&lt;br&gt;
Check the other rules: required format (JPG/JPEG), exact pixel dimensions, aspect ratio and file name. Use the &lt;a href="https://zippic.app/image-cropper?utm_source=devto" rel="noopener noreferrer"&gt;image cropper&lt;/a&gt; to match a required size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My iPhone photo is HEIC and the portal wants JPG.&lt;/strong&gt;&lt;br&gt;
Either load it into the &lt;a href="https://zippic.app/?utm_source=devto" rel="noopener noreferrer"&gt;compressor&lt;/a&gt; and choose JPG output, or convert it first with the &lt;a href="https://zippic.app/heic-converter?utm_source=devto" rel="noopener noreferrer"&gt;HEIC to JPG converter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The image looks blurry or blocky.&lt;/strong&gt;&lt;br&gt;
You've pushed quality too low for that size. Raise the quality slightly and reduce the width a little instead. Smaller but clean usually beats larger but blocky.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My file is a PDF, not an image.&lt;/strong&gt;&lt;br&gt;
Use the &lt;a href="https://zippic.app/doc-compressor?utm_source=devto" rel="noopener noreferrer"&gt;document compressor&lt;/a&gt; for PDF, Word and PowerPoint files, or turn PDF pages into images with &lt;a href="https://zippic.app/pdf-to-image?utm_source=devto" rel="noopener noreferrer"&gt;PDF to image&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need to compress many photos at once?
&lt;/h2&gt;

&lt;p&gt;If you're preparing a batch (several documents for one application, or product photos for a store), use the &lt;a href="https://zippic.app/bulk-image-compressor?utm_source=devto" rel="noopener noreferrer"&gt;bulk image compressor&lt;/a&gt;. It has the same &lt;strong&gt;Format&lt;/strong&gt;, &lt;strong&gt;Quality&lt;/strong&gt; and &lt;strong&gt;Resize Settings&lt;/strong&gt; controls and processes multiple images in your browser. When it's done, &lt;strong&gt;Download All&lt;/strong&gt; grabs every file.&lt;/p&gt;

&lt;p&gt;In the example below, three files went through at &lt;strong&gt;JPG, quality 75%, width 1200&lt;/strong&gt;, and every one landed under 100KB. A 1.46 MB JPG became &lt;strong&gt;70.60 KB&lt;/strong&gt; (95% smaller), a 2.76 MB PNG cover became &lt;strong&gt;65.04 KB&lt;/strong&gt; (98%), and a 1.05 MB PNG became &lt;strong&gt;72.48 KB&lt;/strong&gt; (93%). Note that the PNGs were converted to JPG output here, which is a big part of why they shrank so much.&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%2Fpb4wk0szgvyy07cg52r4.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%2Fpb4wk0szgvyy07cg52r4.webp" alt="zippic bulk image compressor with three files done at JPG, quality 75 and width 1200: 1.46 MB to 70.60 KB, 2.76 MB to 65.04 KB, and 1.05 MB to 72.48 KB" width="800" height="591"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Bulk compression: three images, one setting, all under 100KB.&lt;/em&gt; To crop a batch to the same size first, use the &lt;a href="https://zippic.app/bulk-image-cropper?utm_source=devto" rel="noopener noreferrer"&gt;bulk image cropper&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more on choosing formats, see &lt;a href="https://zippic.app/blog/best-image-formats-for-web?utm_source=devto" rel="noopener noreferrer"&gt;Best Image Formats for the Web&lt;/a&gt;. For ID-photo sizing, see zippic's &lt;a href="https://zippic.app/blog/how-to-use-zippic-cn-for-id-photo-cropping?utm_source=devto" rel="noopener noreferrer"&gt;ID photo cropping guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do I compress an image to 100KB without losing quality?&lt;/strong&gt;&lt;br&gt;
Resize the image to the dimensions you actually need (often around 800â€“1200 px wide for a photo), keep JPG, and start at about 75% quality. Because the pixel count drops so much, you can usually reach 100KB with only a modest reduction in quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I reduce a photo to 20KB or 50KB?&lt;/strong&gt;&lt;br&gt;
Make the image much smaller in pixels first, roughly 400â€“600 px wide for 20KB or 600â€“800 px for 50KB, then lower the quality toward 50â€“60%. Check the compressed size and adjust until you're under the limit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does zippic upload my images to a server?&lt;/strong&gt;&lt;br&gt;
No. zippic compresses images locally in your browser, so your photos stay on your device. It's free and needs no sign-up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which format should I use for application portals: JPG, PNG or WebP?&lt;/strong&gt;&lt;br&gt;
Use JPG unless the portal says otherwise. JPG is accepted almost everywhere and is small for photos. WebP can be smaller but isn't accepted by many portals. PNG photos are usually much larger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is my compressed image bigger than the original?&lt;/strong&gt;&lt;br&gt;
The original was probably already heavily compressed, so compressing it again doesn't help and can add data. Use the original photo where possible, and reduce its dimensions to make it smaller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Getting a photo under 100KB, 50KB or 20KB comes down to two moves: &lt;strong&gt;resize to sensible dimensions, then fine-tune quality&lt;/strong&gt;, keeping JPG for anything official. zippic shows the result instantly and keeps your files on your device. If you need a free, no-upload option, &lt;a href="https://zippic.app/?utm_source=devto" rel="noopener noreferrer"&gt;zippic's image compressor&lt;/a&gt; is worth a try.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
