The 199×199 32-bit RLE test image kept its soft-edged alpha in the PNG, and a 16-bit 5-5-5-1 file kept its one-bit mask.
Origin flags
Kept
Bottom-left origin (the TGA default) and top-left files both come out upright, and files flagged right-to-left are mirrored back exactly as their header says.
Colour-mapped and grayscale
Kept
An 8-bit colour-mapped crate texture stayed a palette PNG (66,348 → 55,029 bytes) and an 8-bit grayscale one stayed grayscale (65,580 → 42,299 bytes).
RLE compression
Changed
Run-length data is decoded and recompressed with deflate, which is much tighter on textures: a 2,801,531-byte RLE diffuse map became a 1,110,647-byte PNG.
Normal maps
Kept
Tangent-space normal maps keep their exact RGB values (the 1024×1024 sample went from 3,004,900 to 1,761,374 bytes), which matters because any colour shift changes the lighting.
All-zero alpha
Changed
Some exporters write 32-bit TGA with every alpha value at 0 and expect it to be ignored. An alpha channel that is empty everywhere is dropped, so a 1024×1024 texture built that way came out as an opaque RGB PNG instead of an invisible one.
Image ID and extension area
Lost
The TGA image-ID text, the version 2 extension area (author, date, gamma, postage-stamp thumbnail) and the developer area are not carried into the PNG.
Alpha channel Kept
The 199×199 32-bit RLE test image kept its soft-edged alpha in the PNG, and a 16-bit 5-5-5-1 file kept its one-bit mask.
Origin flags Kept
Bottom-left origin (the TGA default) and top-left files both come out upright, and files flagged right-to-left are mirrored back exactly as their header says.
Colour-mapped and grayscale Kept
An 8-bit colour-mapped crate texture stayed a palette PNG (66,348 → 55,029 bytes) and an 8-bit grayscale one stayed grayscale (65,580 → 42,299 bytes).
RLE compression Changed
Run-length data is decoded and recompressed with deflate, which is much tighter on textures: a 2,801,531-byte RLE diffuse map became a 1,110,647-byte PNG.
Normal maps Kept
Tangent-space normal maps keep their exact RGB values (the 1024×1024 sample went from 3,004,900 to 1,761,374 bytes), which matters because any colour shift changes the lighting.
All-zero alpha Changed
Some exporters write 32-bit TGA with every alpha value at 0 and expect it to be ignored. An alpha channel that is empty everywhere is dropped, so a 1024×1024 texture built that way came out as an opaque RGB PNG instead of an invisible one.
Image ID and extension area Lost
The TGA image-ID text, the version 2 extension area (author, date, gamma, postage-stamp thumbnail) and the developer area are not carried into the PNG.
55,029-byte palette PNG with the same 256 colours.
A real Targa (TGA) → PNG run
We converted our Targa (TGA) sample (237 KB) with Image engine on 2026-10-20. It took 226 ms and produced a 123 KB PNG file, 48% smaller than the input. The engine raised 1 warning, listed below.
tga
Input · sample.tga · 237 KB
243,163 bytes
Output · sample.png · 123 KB
240 × 300 px, 8-bit, colour type 6
Width
240
Height
300
Encoding
8-bit, colour type 6
△Image metadata stripped from output.
Options and when to change them
width
Set it to make a preview or thumbnail of a large texture; height follows the aspect ratio.
fit
With both width and height, contain pads to the box, cover crops to fill it and fill stretches; textures that must tile should keep their aspect ratio.
background
Only colours the padding added by fit contain; the texture's own alpha is left alone in PNG.
Do it yourself
ImageMagick
bash
magick texture.tga texture.png
Check the alpha afterwards: tools disagree about 32-bit TGA files whose alpha is all zero, and some show them opaque while others show nothing.
Python (Pillow)
bash
from PIL import Image
im = Image.open("texture.tga")
if im.mode == "RGBA" and im.getextrema()[3] == (0, 0):
im = im.convert("RGB") # unused alpha channel
im.save("texture.png")
Targa (TGA) to PNG by API or MCP
The HTTP API and the MCP server run the exact engine this page uses (Image engine); the response carries the same warnings the web converter shows. Check support first with GET /api/v1/pairs?from=tga&to=png.
If the texture is going back into a game engine or mod tool, check what it imports; many read PNG directly, but some older pipelines only accept TGA and the PNG would have to be converted back.
If the TGA is a photographic render headed for the web, TGA → JPG or WebP is a fraction of the PNG size.
Targa (TGA) to PNG questions
Why is my TGA upside down in some programs?
TGA stores rows from the bottom up unless a header flag says the first row is the top. Programs that ignore the flag show the picture flipped. We read the flag, so the PNG is upright and has no flag left to misread.
My PNG came out completely transparent. What happened?
The TGA probably has an alpha channel full of zeros that the program which wrote it meant as unused. We currently honour it as transparency, and JPG output is no help because it fills those pixels with the background colour. Remove the alpha channel in an editor, or use the Python snippet above, then convert.
Is the PNG pixel-identical to the TGA?
Yes when you do not resize: both formats are lossless, so colours, alpha and palette entries match exactly. Resizing resamples the pixels, and normal or height maps should not be resized for use in a game.