// tga.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <math.h>
#include <iostream>
using namespace std;
#define RGB2INT(r,g,b) (r*256*256 + g*256 + b)
void SaveTGA( const char *filename, DWORD width, DWORD height, const byte *data )
{
FILE *savefile = fopen(filename, "wb");
byte type_header[12] = {0,0,2,0,0,0,0,0,0,0,0,0};
fwrite( type_header,12*sizeof( byte ),1,savefile );
byte header[6];
header[0] = width % 256;
header[1] = width / 256;
header[2] = height % 256;
header[3] = height / 256;
header[4] = 32;
header[5] = 8;
fwrite( header, 6*sizeof( byte ),1,savefile );
unsigned int image_size= 4*width*height;
byte * invert_data = new byte [image_size];
memset( invert_data,0,image_size*sizeof( byte ) );
for( unsigned int i=0; i<image_size; i++ )
{
invert_data[ i ] = data[ i ];
}
// Swap red and blue,RGB转为BGR
for ( unsigned int cswap = 0; cswap < image_size; cswap += 4 )
{
byte r = invert_data[cswap];
invert_data[cswap] = invert_data[cswap + 2];
invert_data[cswap + 2] = r;
}
fwrite( invert_data,image_size*sizeof( byte ),1,savefile );
fclose( savefile );
delete [] invert_data;
}
void GetTGASize(const char *filename, DWORD& width, DWORD& height)
{
FILE *of = fopen(filename, "rb");
byte type_header[12];
fread( type_header, sizeof(byte), 12, of);
byte header[6];
fread( header, sizeof(byte), 6, of);
width = header[1] * 256 + header[0];
height = header[3] * 256 + header[2];
fclose( of );
}
bool ReadTGA(const char *filename, byte* data, int dataSize)
{
FILE *of = fopen(filename, "rb");
byte type_header[12];
fread( type_header, sizeof(byte), 12, of);
byte header[6];
fread( header, sizeof(byte), 6, of);
if (header[4] != 32)
{
return false;
}
fread(data, sizeof(byte), dataSize, of);
// Swap red and blue,RGB转为BGR
for ( unsigned int i = 0; i < dataSize; i += 4 )
{
byte r = data[i];
data[i] = data[i + 2];
data[i + 2] = r;
}
fclose( of );
}
int _tmain(int argc, _TCHAR* argv[])
{
#define PIXELS 24*24
byte data[PIXELS * 4];
ReadTGA("Tili.tga", data, PIXELS * 4);
SaveTGA("Tili2.tga", 24, 24, data);
return 0;
}
适用于32位色的无压缩tga文件。