C++读写Tga文件

// 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文件。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值