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;
}