{"id":1709,"date":"2026-09-06T15:13:00","date_gmt":"2026-09-06T19:13:00","guid":{"rendered":"https:\/\/www.xconvert.com\/blog\/?p=1709"},"modified":"2026-08-31T17:09:07","modified_gmt":"2026-08-31T21:09:07","slug":"why-gif-looks-grainy-dithering","status":"publish","type":"post","link":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering","title":{"rendered":"Why Does My GIF Look Grainy? Dithering &#038; 256-Color Limit"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">You convert a smooth sunset clip or a glossy logo animation to GIF, and the result is coated in a fine sandy speckle \u2014 or the sky breaks into flat, stair-stepped bands. It is not your export settings, your source, or a bad download. It is the GIF format hitting a hard wall: a single GIF frame can hold at most 256 colors, and your full-color source has millions. This guide explains exactly why your GIF looks grainy \u2014 every claim checked against the GIF89a specification, MDN, and the original Floyd\u2013Steinberg dithering paper \u2014 and what actually reduces the noise (plus the one fix that removes it for good).<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>Quick answer:<\/strong> A GIF is limited to a <strong>256-color palette per frame<\/strong> (GIF89a spec). When a full-color source \u2014 roughly <strong>16.7 million (24-bit) colors<\/strong> \u2014 is squeezed into 256, the encoder must either <strong>band<\/strong> (snap each region to the nearest palette color, giving flat posterized steps) or <strong>dither<\/strong> (scatter palette colors to fake the missing shades). That scattered dither <em>is<\/em> the \u201cgrain\u201d \u2014 a high-frequency speckle, usually from <strong>Floyd\u2013Steinberg error diffusion<\/strong>. You can soften it (keep the palette full, don\u2019t downscale, reduce colors and motion in the source) but not delete it: 256 colors is the format\u2019s ceiling. <strong>The real fix for gradients, video, and photos is to not use GIF at all<\/strong> \u2014 MP4, WebM, and animated WebP are full-color and never dither a palette.<\/p><\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Jump to a section<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"#256-colors\">Why GIF is stuck at 256 colors<\/a><\/li><li><a href=\"#band-or-dither\">Band or dither: the two ways GIF fakes missing colors<\/a><\/li><li><a href=\"#diagnose\">Grainy, banded, or pixelated? Diagnose the right problem<\/a><\/li><li><a href=\"#fixes\">How to reduce GIF graininess (and when you can\u2019t)<\/a><\/li><li><a href=\"#tool\">Reduce GIF grain on xconvert<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"256-colors\">Why GIF is stuck at 256 colors<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GIF stores color differently from a photo or a video frame. Instead of giving every pixel its own red\/green\/blue value, GIF builds a small <strong>color table<\/strong> and then stores each pixel as a single index number pointing into that table. Per the GIF89a specification, that table is \u201ca sequence of bytes representing red-green-blue color triplets,\u201d and its length is set by a 3-bit size field \u2014 so it maxes out at <strong>2\u2078 = 256 entries<\/strong>. MDN puts it plainly: \u201cEach pixel in a GIF is represented by a single 8-bit value serving as an index into a palette of 24-bit colors (8 bits each of red, green, and blue)\u2026 each palette has 2, 4, 8, 16, 32, 64, or 256 entries\u201d (<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Media\/Guides\/Formats\/Image_types\">MDN: Image types<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So a single GIF frame can show at most 256 distinct colors. A typical photo or video frame is stored in <strong>24-bit \u201ctrue color,\u201d<\/strong> which can represent roughly <strong>16.7 million<\/strong> colors (2\u00b2\u2074). Turn that source into a GIF and the encoder has to throw away all but 256 colors, then decide how to approximate everything it discarded. Every grainy, speckled, or banded GIF you have seen is the visible residue of that one decision.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"band-or-dither\">Band or dither: the two ways GIF fakes missing colors<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When the encoder meets a color that isn\u2019t in its 256-entry palette, it has exactly two strategies, and both leave a mark.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Option 1 \u2014 banding (posterization).<\/strong> Snap each pixel to the <em>nearest<\/em> available palette color. On flat graphics this is invisible; on a smooth gradient \u2014 a sky, a shadow, a soft glow \u2014 the continuous ramp collapses into a handful of discrete steps. That artifact has a name: posterization is \u201cthe conversion of a continuous gradation of tone to several regions of fewer tones, causing abrupt changes from one tone to another,\u201d and \u201cunwanted posterization, also known as <strong>banding<\/strong>, may occur when the color depth\u2026 is insufficient to accurately sample a continuous gradation of color tone\u201d (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Posterization\">Wikipedia: Posterization<\/a>). You see stripes because there literally aren\u2019t enough colors to draw the in-between shades.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Option 2 \u2014 dithering.<\/strong> Instead of snapping, scatter a mix of palette colors in a fine pattern so that, from a normal viewing distance, your eye blends them into the missing shade. MDN notes that in GIF, \u201cto simulate more than 255 or 256 colors, dithering is generally used.\u201d Dithering is formally \u201can intentionally applied form of noise used to randomize quantization error, <strong>preventing large-scale patterns such as color banding<\/strong>\u201d (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Dither\">Wikipedia: Dither<\/a>). It trades the bands for texture \u2014 and that texture is exactly the <strong>grain<\/strong> people complain about.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So the speckle is not a bug or a bad setting. It is the encoder deliberately adding noise to hide the fact that it ran out of colors. Here is the tradeoff in one view:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Strategy<\/th><th>What it does<\/th><th>What you see<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td><strong>Banding<\/strong> (no\/low dither)<\/td><td>Snaps each pixel to the nearest of 256 colors<\/td><td>Flat <strong>steps\/bands<\/strong> in gradients; posterized look<\/td><td>Flat graphics, logos, few-color art<\/td><\/tr><tr><td><strong>Dithering<\/strong><\/td><td>Scatters palette colors to fake in-between shades<\/td><td>Fine <strong>grain\/speckle<\/strong>, worst in smooth areas<\/td><td>Photos, gradients, video frames<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">There is no third door in a 256-color format. You are choosing <em>which<\/em> artifact you can tolerate, not whether you get one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The most common ditherer is <strong>Floyd\u2013Steinberg<\/strong>, \u201can image dithering algorithm first published in 1976 by Robert W. Floyd and Louis Steinberg\u201d (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Floyd%E2%80%93Steinberg_dithering\">Wikipedia: Floyd\u2013Steinberg dithering<\/a>). It works by <strong>error diffusion<\/strong>: when it snaps a pixel to the nearest palette color, it measures how far off that was \u2014 the \u201cquantization error\u201d \u2014 and pushes that error onto neighboring, not-yet-drawn pixels so they compensate. Across a whole frame this scatters the mismatch into a fine, semi-random spray, which is why it is \u201ccommonly used\u2026 when converting an image from a Truecolor 24-bit PNG format into a GIF format, which is restricted to a maximum of 256 colors.\u201d The grain reads as noise because it <em>is<\/em> noise, added on purpose to hide the bands. The more pixels the encoder has to spread that error across, the better the illusion holds \u2014 which is the key to the fixes below.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"diagnose\">Grainy, banded, or pixelated? Diagnose the right problem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cGrainy\u201d gets used for three different defects with three different causes. Fixing the wrong one wastes your time.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Symptom<\/th><th>Looks like<\/th><th>Actual cause<\/th><th>Lever that helps<\/th><\/tr><\/thead><tbody><tr><td><strong>Grain \/ speckle<\/strong><\/td><td>Fine sandy noise over smooth areas<\/td><td><strong>Dithering<\/strong> faking colors past the 256 limit<\/td><td>Keep palette full; reduce source colors; leave GIF<\/td><\/tr><tr><td><strong>Banding \/ posterization<\/strong><\/td><td>Flat stair-steps in gradients<\/td><td>Too few colors and <strong>little\/no dithering<\/strong><\/td><td>Allow more colors, or mild dithering<\/td><\/tr><tr><td><strong>Pixelation \/ blockiness<\/strong><\/td><td>Chunky, jagged squares<\/td><td><strong>Low resolution or upscaling<\/strong> \u2014 a size problem, not a color one<\/td><td>Don\u2019t enlarge; start from a higher-res source<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The tell: grain and banding both live in <em>smooth<\/em> regions \u2014 skies, gradients, skin \u2014 and both come from the color limit. <strong>Pixelation is different<\/strong> \u2014 it is a resolution problem (blocky edges from stretching a small GIF larger) that no palette or dither setting will fix. And if a GIF is both low-resolution <em>and<\/em> dithered, downscaling and dithering compound into extra noise, which is why the resolution advice below matters.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fixes\">How to reduce GIF graininess (and when you can\u2019t)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You cannot delete the grain from a GIF \u2014 256 colors is a hard ceiling \u2014 but you can manage the tradeoff. In rough order of impact:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Keep the palette as full as GIF allows.<\/strong> Dithering gets heavier the fewer colors you give the encoder, so reducing a GIF to 64 or 32 colors to save space forces <em>more<\/em> grain or harder banding. If quality is the goal, keep the palette near the 256 maximum and cut file size some other way. (On xconvert\u2019s compressor the palette control is <strong>Colors<\/strong>, which appears once you set <strong>File Compression<\/strong> to <strong>Custom<\/strong> \u2014 the page opens on the size-target mode instead.)<\/li><li><strong>Don\u2019t downscale a grainy GIF.<\/strong> Dithering needs pixels to spread its error across; shrinking the image resamples the dither pattern and can look muddier or noisier, and <em>enlarging<\/em> a grainy GIF magnifies every speckle. Keep the native resolution when grain \u2014 not size \u2014 is your problem.<\/li><li><strong>Reduce colors and motion at the <em>source<\/em>.<\/strong> A clip with fewer distinct colors and calmer motion needs less dithering. If you are making the GIF from a video, trimming, cropping to the essential action, and lowering the frame rate all cut the color load per frame \u2014 do it at creation time with <a href=\"https:\/\/www.xconvert.com\/convert-video-to-gif\">convert video to GIF<\/a> rather than cleaning up afterward.<\/li><li><strong>For gradients, photos, or video: don\u2019t use GIF at all.<\/strong> This is the only fix that truly removes the grain. MP4, WebM, and animated WebP are <strong>full-color<\/strong> \u2014 they represent millions of colors directly instead of through a 256-entry palette, so they never need to dither one. MDN calls WebP an \u201cexcellent choice for both images and animated images\u201d with \u201csupport for higher color depths, animated frames, transparency,\u201d and notes that animated GIF \u201csupports only 8-bit indexed color.\u201d If your GIF started life as a video clip, converting it back to video is smaller <em>and<\/em> smoother \u2014 see <a href=\"https:\/\/www.xconvert.com\/blog\/convert-gif-to-webm-stop-using-gifs\/\">convert GIF to WebM (and stop using GIFs)<\/a>. Keep an actual <code>.gif<\/code> only where nothing else plays: inline autoplay in email and some legacy chat clients.<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">If you are also fighting file size, the grain and the bulk come from the <em>same<\/em> root cause \u2014 a 256-color palette plus every frame stored in full. <a href=\"https:\/\/www.xconvert.com\/blog\/why-is-my-gif-file-so-big\/\">Why your GIF file is so big<\/a> covers that side, and the levers overlap.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tool\">Reduce GIF grain on xconvert<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/www.xconvert.com\/compress-gif\">xconvert GIF compressor<\/a> exposes the exact levers that govern grain \u2014 colors, dithering, and resolution \u2014 but they sit one click in. The page opens on <strong>File Compression \u2192 Max file size<\/strong>, which is the right default when your problem is <em>bytes<\/em>; when your problem is <em>grain<\/em>, you want <strong>Custom<\/strong>, which is where the palette and dither controls live. Keep one tension in mind either way: it is a <em>compressor<\/em>, so the settings that shrink the file usually add grain. For a quality-first pass, resist the urge to cut colors and resolution.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"2000\" src=\"https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/step-01-control.png\" alt=\"The GIF compressor in Custom mode \u2014 the Colors control with By Color Reduction + Dither, the palette-and-dither lever behind GIF grain\" class=\"wp-image-1708\" srcset=\"https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/step-01-control.png 2560w, https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/step-01-control-300x234.png 300w, https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/step-01-control-1024x800.png 1024w, https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/step-01-control-768x600.png 768w, https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/step-01-control-1536x1200.png 1536w, https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/step-01-control-2048x1600.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\"><li>Open <a href=\"https:\/\/www.xconvert.com\/compress-gif\">xconvert.com\/compress-gif<\/a> and click <strong>Upload<\/strong> to add your GIF (from your computer, Google Drive, or Dropbox).<\/li><li>Open <strong>Advanced Options<\/strong> to reveal the controls. <strong>File Compression<\/strong> sits on <strong>Max file size<\/strong> with a <strong>Size limit<\/strong> dropdown \u2014 useful when you have a byte ceiling to clear, but it decides the palette and dither for you.<\/li><li>Switch <strong>File Compression<\/strong> to <strong>Custom<\/strong>. That\u2019s what reveals the grain levers: <strong>Image quality (%)<\/strong>, <strong>Drop Frames<\/strong>, <strong>Image resolution<\/strong>, and <strong>Colors<\/strong>.<\/li><li>Under <strong>Colors<\/strong>, you\u2019ll find <strong>By Color Reduction + Dither<\/strong> \u2014 the palette-size dropdown (256 down to 2) plus a <strong>Dither<\/strong> toggle. This is the lever behind the grain. Cutting colors saves bytes but forces more dithering (grain) or harder banding, so for a grainy result keep the reduction light and the palette near 256.<\/li><li>Leave <strong>Image resolution<\/strong> on <strong>Keep original<\/strong> when grain is your concern \u2014 downscaling resamples the dither and can look noisier. Use <strong>Resolution Percentage<\/strong>, <strong>Preset Resolutions<\/strong>, or the <strong>Width \/ Height (Keep aspect ratio)<\/strong> fields only if you genuinely need smaller dimensions.<\/li><li>Adjust <strong>Image quality (%)<\/strong> to taste \u2014 it starts at <strong>80<\/strong> \u2014 and use <strong>Drop Frames<\/strong> (<strong>Frames To Drop<\/strong>, which preselects <strong>Every 3rd frame<\/strong>) only if you can spare the motion; thinning frames cuts size without touching per-frame grain.<\/li><li>Click <strong>Compress<\/strong> and download. Re-run with different color and resolution settings to compare \u2014 grain is a tradeoff, so a couple of passes is normal.<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Your file uploads over an encrypted connection, is processed on our servers, and is deleted automatically a few hours later. Nothing stays around.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the clip is destined for a webpage or chat that accepts video, converting to WebM or MP4 will beat any GIF you can tune \u2014 full color, no palette dithering, and a much smaller file.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h5 class=\"wp-block-heading\">Why does my GIF look grainy or speckled?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Because GIF allows only <strong>256 colors per frame<\/strong> (GIF89a spec), and your source had far more. To fake the missing shades, the encoder <strong>dithers<\/strong> \u2014 scattering palette colors in a fine pattern that your eye blends from a distance. That scattered pattern is the grain. It is added on purpose to avoid the alternative (flat color <strong>banding<\/strong>), so some speckle is unavoidable in any GIF made from a full-color photo or video.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Why is my GIF pixelated, not just grainy?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pixelation is a different problem from grain.<\/strong> Blocky, jagged squares come from <strong>low resolution or upscaling<\/strong> \u2014 the GIF was small and got stretched larger \u2014 not from the color palette. No dither or color setting fixes it; you need a higher-resolution source and to avoid enlarging. Grain and banding, by contrast, live in smooth areas and come from the 256-color limit.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">How do I make a GIF less grainy?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Keep the palette as <strong>full as GIF allows<\/strong> (don\u2019t reduce colors to save space \u2014 that forces more dithering), <strong>don\u2019t downscale<\/strong> (it resamples the dither and can look noisier), and reduce colors or motion in the <strong>source<\/strong> before converting. The only way to remove grain entirely is to leave GIF for a <strong>full-color format<\/strong> \u2014 MP4, WebM, or animated WebP \u2014 which never needs to dither a palette.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Should I turn dithering off to fix the grain?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">It depends which artifact you prefer. Turning dithering <strong>off<\/strong> removes the speckle but replaces it with <strong>banding<\/strong> \u2014 visible flat steps in gradients \u2014 because the encoder now just snaps each pixel to the nearest of 256 colors. Dithering exists specifically to \u201cprevent large-scale patterns such as color banding.\u201d On smooth or photographic content, most people find light dithering less objectionable than hard bands; on flat graphics, no dithering is often cleaner. On xconvert\u2019s compressor the <strong>Dither<\/strong> toggle sits under <strong>Colors \u2192 By Color Reduction + Dither<\/strong>, which appears once you set <strong>File Compression<\/strong> to <strong>Custom<\/strong>. Worth knowing before you flip it: in our own measurements dithering is not free \u2014 an ordered dither costs roughly <strong>+12% bytes at 64 colors<\/strong>, and error-diffusion dithers like Floyd\u2013Steinberg cost more still and can flicker frame to frame in an animation.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Can a GIF have more than 256 colors?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Not within a single frame \u2014 256 is the hard cap of the color table in the GIF89a spec. However, an <strong>animated<\/strong> GIF can carry a <strong>different 256-color table for each frame<\/strong>, and good encoders vary the palette frame to frame (sometimes called temporal dithering) to raise the <em>effective<\/em> color count across the animation. Any single flat still is still limited to 256, which is why a photo or gradient cannot be shown cleanly as one GIF.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Why does my GIF look worse than the video I made it from?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">The video was <strong>full color<\/strong> \u2014 roughly 16.7 million (24-bit) colors \u2014 with efficient compression. Turning it into a GIF throws away all but <strong>256 colors per frame<\/strong> and then dithers or bands to cope, so gradients speckle or step and fine detail muddies. The GIF isn\u2019t \u201cbroken\u201d; it is showing the format\u2019s ceiling. If the destination accepts video, keep it as video (WebM or MP4) for full color and a smaller file.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Last verified 2026-08-31.<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.w3.org\/Graphics\/GIF\/spec-gif89a.txt\">W3C \u2014 GIF89a specification<\/a> \u2014 a GIF color table is a sequence of RGB triplets whose length is set by a 3-bit size field, so it holds at most 256 entries, and each pixel is an index into that table.<\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Media\/Guides\/Formats\/Image_types\">MDN \u2014 Image file type and format guide<\/a> \u2014 GIF pixels are 8-bit indices into a palette of up to 256 24-bit colors; dithering is used \u201cto simulate more than 255 or 256 colors\u201d; GIF is LZW-lossless 8-bit indexed color, while WebP and APNG support higher color depths and animation.<\/li><li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dither\">Wikipedia \u2014 Dither<\/a> \u2014 dithering is intentionally applied noise that randomizes quantization error to prevent color banding; unavailable palette colors are approximated by diffusing available ones, which is the source of GIF grain.<\/li><li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Floyd%E2%80%93Steinberg_dithering\">Wikipedia \u2014 Floyd\u2013Steinberg dithering<\/a> \u2014 the 1976 Floyd &amp; Steinberg error-diffusion algorithm pushes a pixel\u2019s quantization error onto its neighbors; commonly used when reducing a 24-bit image to GIF\u2019s 256 colors.<\/li><li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Posterization\">Wikipedia \u2014 Posterization<\/a> \u2014 banding is the collapse of a continuous tonal gradient into discrete steps when the color depth is insufficient (the artifact dithering trades against).<\/li><li><a href=\"https:\/\/www.xconvert.com\/compress-gif\">xconvert \u2014 GIF Compressor<\/a> \u2014 control labels and defaults verified 2026-08-31 against the live option set: <strong>File Compression<\/strong> renders by default on <strong>Max file size<\/strong> (<strong>Size limit<\/strong> \u2192 Custom size % \/ Custom size value \/ Discord (10 MB max) \/ Email (25 MB max) \/ Forum (2 MB max)); <strong>Custom<\/strong> is the other mode and is what reveals <strong>Image quality (%)<\/strong> (default <strong>80<\/strong>), <strong>Drop Frames<\/strong> (<em>Frames To Drop<\/em>, <strong>Every 3rd frame<\/strong> preselected), <strong>Image resolution<\/strong>, and <strong>Colors<\/strong> (<strong>Color Palette Size<\/strong> 256\u20132 plus a <strong>Dither<\/strong> toggle). There is no Quality preset on this page.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Your GIF looks grainy because GIF allows only 256 colors per frame, forcing dithering. Here&#8217;s the real cause \u2014 and how to reduce the speckle.<\/p>\n","protected":false},"author":4,"featured_media":1707,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,14],"tags":[],"class_list":["post-1709","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","category-tools"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Why Does My GIF Look Grainy? Dithering &amp; 256-Color Limit<\/title>\n<meta name=\"description\" content=\"Your GIF looks grainy because GIF allows only 256 colors per frame, forcing dithering. Here&#039;s the real cause \u2014 and how to reduce the speckle.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Why Does My GIF Look Grainy? Dithering &amp; 256-Color Limit\" \/>\n<meta property=\"og:description\" content=\"Your GIF looks grainy because GIF allows only 256 colors per frame, forcing dithering. Here&#039;s the real cause \u2014 and how to reduce the speckle.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering\" \/>\n<meta property=\"og:site_name\" content=\"XConvert Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/xconvertcom\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-06T19:13:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/featured-101.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1260\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Stephanie Taylor\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@xconvert_com\" \/>\n<meta name=\"twitter:site\" content=\"@xconvert_com\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Stephanie Taylor\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering\"},\"author\":{\"name\":\"Stephanie Taylor\",\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/#\\\/schema\\\/person\\\/ae9300506c0e9e85f1a6ece4d762980d\"},\"headline\":\"Why Does My GIF Look Grainy? Dithering &#038; 256-Color Limit\",\"datePublished\":\"2026-09-06T19:13:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering\"},\"wordCount\":2662,\"image\":{\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/featured-101.png\",\"articleSection\":[\"How To Guides\",\"Tools\"],\"inLanguage\":\"en-CA\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering\",\"url\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering\",\"name\":\"Why Does My GIF Look Grainy? Dithering & 256-Color Limit\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/featured-101.png\",\"datePublished\":\"2026-09-06T19:13:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/#\\\/schema\\\/person\\\/ae9300506c0e9e85f1a6ece4d762980d\"},\"description\":\"Your GIF looks grainy because GIF allows only 256 colors per frame, forcing dithering. Here's the real cause \u2014 and how to reduce the speckle.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering#breadcrumb\"},\"inLanguage\":\"en-CA\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-CA\",\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering#primaryimage\",\"url\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/featured-101.png\",\"contentUrl\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/featured-101.png\",\"width\":2400,\"height\":1260,\"caption\":\"The xconvert GIF compressor at \\\/compress-gif with the Upload button highlighted \u2014 adjust colors, dither, and resolution to cut GIF graininess.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/why-gif-looks-grainy-dithering#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.xconvert.com\\\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Why Does My GIF Look Grainy? Dithering &#038; 256-Color Limit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/\",\"name\":\"XConvert Blog\",\"description\":\"Blog for XConvert file converter\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-CA\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/#\\\/schema\\\/person\\\/ae9300506c0e9e85f1a6ece4d762980d\",\"name\":\"Stephanie Taylor\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-CA\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/af9a54599087d3f3dd2d0ea950291c9e18fcc503af09b136b37fa52c418fe467?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/af9a54599087d3f3dd2d0ea950291c9e18fcc503af09b136b37fa52c418fe467?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/af9a54599087d3f3dd2d0ea950291c9e18fcc503af09b136b37fa52c418fe467?s=96&d=mm&r=g\",\"caption\":\"Stephanie Taylor\"},\"url\":\"https:\\\/\\\/www.xconvert.com\\\/blog\\\/author\\\/stephanie\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Why Does My GIF Look Grainy? Dithering & 256-Color Limit","description":"Your GIF looks grainy because GIF allows only 256 colors per frame, forcing dithering. Here's the real cause \u2014 and how to reduce the speckle.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering","og_locale":"en_US","og_type":"article","og_title":"Why Does My GIF Look Grainy? Dithering & 256-Color Limit","og_description":"Your GIF looks grainy because GIF allows only 256 colors per frame, forcing dithering. Here's the real cause \u2014 and how to reduce the speckle.","og_url":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering","og_site_name":"XConvert Blog","article_publisher":"https:\/\/www.facebook.com\/xconvertcom","article_published_time":"2026-09-06T19:13:00+00:00","og_image":[{"width":2400,"height":1260,"url":"https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/featured-101.png","type":"image\/png"}],"author":"Stephanie Taylor","twitter_card":"summary_large_image","twitter_creator":"@xconvert_com","twitter_site":"@xconvert_com","twitter_misc":{"Written by":"Stephanie Taylor","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering#article","isPartOf":{"@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering"},"author":{"name":"Stephanie Taylor","@id":"https:\/\/www.xconvert.com\/blog\/#\/schema\/person\/ae9300506c0e9e85f1a6ece4d762980d"},"headline":"Why Does My GIF Look Grainy? Dithering &#038; 256-Color Limit","datePublished":"2026-09-06T19:13:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering"},"wordCount":2662,"image":{"@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering#primaryimage"},"thumbnailUrl":"https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/featured-101.png","articleSection":["How To Guides","Tools"],"inLanguage":"en-CA"},{"@type":"WebPage","@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering","url":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering","name":"Why Does My GIF Look Grainy? Dithering & 256-Color Limit","isPartOf":{"@id":"https:\/\/www.xconvert.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering#primaryimage"},"image":{"@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering#primaryimage"},"thumbnailUrl":"https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/featured-101.png","datePublished":"2026-09-06T19:13:00+00:00","author":{"@id":"https:\/\/www.xconvert.com\/blog\/#\/schema\/person\/ae9300506c0e9e85f1a6ece4d762980d"},"description":"Your GIF looks grainy because GIF allows only 256 colors per frame, forcing dithering. Here's the real cause \u2014 and how to reduce the speckle.","breadcrumb":{"@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering#breadcrumb"},"inLanguage":"en-CA","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering"]}]},{"@type":"ImageObject","inLanguage":"en-CA","@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering#primaryimage","url":"https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/featured-101.png","contentUrl":"https:\/\/www.xconvert.com\/blog\/wp-content\/uploads\/2026\/07\/featured-101.png","width":2400,"height":1260,"caption":"The xconvert GIF compressor at \/compress-gif with the Upload button highlighted \u2014 adjust colors, dither, and resolution to cut GIF graininess."},{"@type":"BreadcrumbList","@id":"https:\/\/www.xconvert.com\/blog\/why-gif-looks-grainy-dithering#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.xconvert.com\/blog"},{"@type":"ListItem","position":2,"name":"Why Does My GIF Look Grainy? Dithering &#038; 256-Color Limit"}]},{"@type":"WebSite","@id":"https:\/\/www.xconvert.com\/blog\/#website","url":"https:\/\/www.xconvert.com\/blog\/","name":"XConvert Blog","description":"Blog for XConvert file converter","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.xconvert.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-CA"},{"@type":"Person","@id":"https:\/\/www.xconvert.com\/blog\/#\/schema\/person\/ae9300506c0e9e85f1a6ece4d762980d","name":"Stephanie Taylor","image":{"@type":"ImageObject","inLanguage":"en-CA","@id":"https:\/\/secure.gravatar.com\/avatar\/af9a54599087d3f3dd2d0ea950291c9e18fcc503af09b136b37fa52c418fe467?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/af9a54599087d3f3dd2d0ea950291c9e18fcc503af09b136b37fa52c418fe467?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/af9a54599087d3f3dd2d0ea950291c9e18fcc503af09b136b37fa52c418fe467?s=96&d=mm&r=g","caption":"Stephanie Taylor"},"url":"https:\/\/www.xconvert.com\/blog\/author\/stephanie"}]}},"_links":{"self":[{"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/posts\/1709","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/comments?post=1709"}],"version-history":[{"count":2,"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/posts\/1709\/revisions"}],"predecessor-version":[{"id":1782,"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/posts\/1709\/revisions\/1782"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/media\/1707"}],"wp:attachment":[{"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/media?parent=1709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/categories?post=1709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xconvert.com\/blog\/wp-json\/wp\/v2\/tags?post=1709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}