Well, TGA has the enormous advantage of an origin at the bottom left - just like OpenGL. BMP and JPG do not have this advantage.

I wrote something to make it work for SDL and BMP:

[pascal]
type
TRGB=record
R, G, B: Byte;
end;
PRGB=^TRGB;
var
viewport: array[0..3] of Integer;
buffer: Pointer;
size: Integer;
Surface: PSDL_Surface;
I, J: Integer;
begin
glGetIntegerv(GL_VIEWPORT, @viewport);
size:=viewport[2]*viewport[3]*3;
GetMem(buffer, size);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3],
GL_RGB, GL_UNSIGNED_BYTE, buffer);
Surface:=SDL_CreateRGBSurface(0, viewport[2], viewport[3],
24, $FF, $FF00, $FF0000, $00);
for I:=0 to viewport[3]-1 do
for J:=0 to viewport[2]-1 do
PRGB(Integer(Surface.pixels)+I*viewport[2]*3+J*3)^:=
PRGB(Integer(buffer)+(viewport[3]-I-1)*viewport[2]*3+J*3)^;
SDL_SaveBMP(Surface, PChar(AFilename));
SDL_FreeSurface(Surface);
end;
[/pascal]