Cấu trúc header của file TGA
TGA Header
struct TGA_HEADER { char idlength; char colourmaptype; char datatypecode; short int colourmaporigin; short int colourmaplength; char colourmapdepth; short int x_origin; short int y_origin; short width; short height; char bitsperpixel; char imagedescriptor; }
Ở phần sau, ta sẽ load ảnh TGA không nén, 24 hoặc 32 bit màu:
CImage* CImage::LoadTGA(IReadableStream* stream){ TGA_Header header; stream->ReadInt8(header.idlength); stream->ReadInt8(header.colourmaptype); stream->ReadInt8(header.datatypecode); stream->ReadInt16(header.colourmaporigin); stream->ReadInt16(header.colourmaplength); stream->ReadInt8(header.colourmapdepth); stream->ReadInt16(header.x_origin); stream->ReadInt16(header.y_origin); stream->ReadInt16(header.width); stream->ReadInt16(header.height); stream->ReadInt8(header.bitsperpixel); stream->ReadInt8(header.imagedescriptor); CImage *img = 0; if (header.datatypecode != 2) { LogError("[CImage::LoadTGA] Unsupported TGA Format. Use non-compress only"); } else if ((header.bitsperpixel != 24) && (header.bitsperpixel != 32)) { LogError("[CImage::LoadTGA] Unsupported TGA Pixel Format. Use 24-, or 32-bpp only"); } else { img = new CImage(header.width, header.height, (header.bitsperpixel == 24)?EIMAGE_FORMAT_R8G8B8:EIMAGE_FORMAT_R8G8B8A8); stream->Skip(header.idlength + header.colourmaptype * header.colourmaplength); int pixelsize = header.bitsperpixel/8; int size = header.width*header.height*pixelsize; UINT8 *p = img->m_pData; for (int i = 0; i < size; i+=pixelsize, p+=pixelsize) { stream->Read(p, 0, pixelsize); UINT8 tmp = p[0]; p[0] = p[2]; p[2] = tmp; } //stream->Read(img->m_pData, 0, header.width*header.height*header.bitsperpixel/8); img->VerticalFlip(); } return img;}