KTX2 Texture Compressor
Convert a PNG, JPG, or WebP texture to KTX2 (powered by Basis Universal) right in your browser. KTX2 textures stay GPU-compressed in video memory, so they cut both VRAM use and load time for web games far more than ordinary image formats. Nothing is uploaded, the encoding runs locally. Got a .ktx2 you need to open? The Decode tab turns it back into a PNG, WebP, or JPG.
Why KTX2 for Web Games
A PNG or JPG has to be fully decoded to raw pixels and uploaded to the GPU, where it sits uncompressed in VRAM. A 2048×2048 RGBA texture is 16 MB in memory no matter how small the PNG was. KTX2 with Basis Universal supercompression stays compressed all the way into VRAM by transcoding to a GPU-native format (BC on desktop, ASTC or ETC2 on mobile), which typically cuts texture memory 4× to 8×. For a browser game where every megabyte and every millisecond of load matters, that's a big win.
KTX2 is the container format standardized by Khronos, and it's supported by the major web engines: Three.js, Babylon.js, and PlayCanvas all ship KTX2 loaders.
UASTC vs ETC1S: Which to Pick
Basis Universal offers two compression modes, and this tool supports both:
UASTC is the high-quality mode. It preserves detail well, which makes it the right choice for hero assets, normal maps, and anything where artifacts would show. Files are larger, but you can add Zstandard supercompression to shrink the download (it decompresses back to the GPU format at load).
ETC1S is the small-file mode. It compresses much harder with a quality slider, so it's ideal for the bulk of your textures where tiny size matters more than perfect fidelity, like UI, props, and background detail.
A common approach is ETC1S for most textures and UASTC for the few that need it.
How to Use It
- Drop a PNG, JPG, or WebP onto the box above (or click to choose). It never leaves your browser.
- Pick UASTC for quality or ETC1S for size, and set the quality.
- Turn on mipmaps for textures viewed at varying distances, and leave sRGB on for color textures (turn it off for normal and data maps).
- Click Encode to KTX2, check the size saving, and download the
.ktx2file.
Need to convert a whole folder of textures? The Batch tab converts up to 10 images at once. It's free, you just sign in to unlock it, and your images still never leave your browser.
KTX2 to PNG: Decoding a Texture
The Decode tab goes the other way. Drop a .ktx2 file and the tool transcodes it to plain RGBA pixels with the same Basis Universal transcoder that Three.js uses at load time, then shows you what's inside: the codec (ETC1S or UASTC), how many mip levels it has, the supercompression scheme, the color space, and whether it carries alpha. Download the result as PNG (lossless), WebP, or JPG, and pick any mip level if you want a smaller copy.
Two things to know. ETC1S and UASTC are lossy, so what you get back is what the GPU sees, not your original pixels. Keep the source PNG in version control and re-encode from that when you can. And uncompressed KTX2 files (8-bit and float RGBA) decode too, but cubemaps and texture arrays don't yet.
Common Questions
What is a KTX2 file?
KTX2 is a Khronos container format for GPU textures. Paired with Basis Universal supercompression, a KTX2 file stays compressed in video memory by transcoding at load time to whatever GPU format the device supports (BC, ASTC, or ETC2). That's why it saves far more memory than a PNG or JPG, which end up uncompressed in VRAM.
How do I convert a PNG to KTX2?
Drop the PNG into the tool above, choose UASTC (quality) or ETC1S (smaller), and click Encode to KTX2, then download the file. It runs entirely in your browser using Basis Universal compiled to WebAssembly, so the image is never uploaded.
Should I use UASTC or ETC1S?
Use UASTC for textures where quality matters most, like hero art and normal maps, and add Zstandard supercompression to shrink the download. Use ETC1S for the bulk of your textures where small size matters more than perfect detail. Many games mix both.
Does KTX2 work in Three.js, Babylon.js, and PlayCanvas?
Yes. All three major web engines ship a KTX2 loader that transcodes the texture to a GPU-native format at load time. Check our WebGL & WebGPU Checker to see which compressed-texture formats (BC, ASTC, ETC2) the current device supports.
Can I convert multiple textures at once?
Yes. Switch to the Batch tab to convert up to 10 images in one go. Batch mode is free, you just sign in to unlock it, and like single mode it runs entirely in your browser, so nothing is uploaded.
Is this KTX2 converter free and private?
Yes. It's free and runs entirely in your browser. The image is encoded locally with WebAssembly and never uploaded to any server.
Can I convert a KTX2 file back to PNG?
Yes. Switch to the Decode tab, drop the .ktx2 file, and download it as PNG, WebP, or JPG. The transcoder runs in your browser, so the file is never uploaded. Bear in mind that ETC1S and UASTC are both lossy: decoding gives you the texture as the GPU sees it, not your original pixels, so keep the source PNGs in version control and re-encode from those rather than round-tripping. If you'd rather script it, the official ktx extract command from Khronos KTX-Software does the same job on the command line.
Which textures should I not compress?
Leave anything that carries exact values alone. Lookup tables, noise masks, data textures baked for a shader and pixel-art sprites with hard edges all suffer visibly under block compression, and normal maps need UASTC rather than ETC1S if you want to avoid banding on smooth surfaces. Colour maps and roughness or metallic maps are the safe wins.
Related
- WebGL & WebGPU Checker — see which compressed-texture formats your device supports
- Where to Find Free Game Assets — textures and models to compress
- Web Games Tech Stack in 2026 — WebGL, WebGPU, and asset formats
- Three.js vs Babylon.js — both load KTX2
- Cinevva Engine — our web-first engine