TrueVision的TGA(Targa)和NuVista视频板可将图像和动画转入电视中,PC机上的视频应用软件都广泛支持TGA格式。
去>>用"photoshop"可以编辑TGA格式
TGA格式(Tagged Graphics)是由美国Truevision公司为其显示卡开发的一种图像文件格式,文件后缀为“.tga”,已被国际上的图形、图像工业所接受。TGA的结构比较简单,属于一种图形、图像数据的通用格式,在多媒体领域有很大影响,是计算机生成图像向电视转换的一种首选格式。
TGA图像格式最大的特点是可以做出不规则形状的图形、图像文件,一般图形、图像文件都为四方形,若需要有圆形、菱形甚至是缕空的图像文件时,TGA可就派上用场了! TGA格式支持压缩,使用不失真的压缩算法。struct sTGAHEADER
{
//TGA文件头结构
public byte id_length;
public byte colormap_type;
public byte image_type;
public ushort colormap_index;
public ushort colormap_length;
public byte colormap_size;
public ushort x;
public ushort y;
public ushort width;
public ushort heigth;
public byte pixel_size;
public byte attributes;
}
//读取TGA文件的函数,将图象解码后写入内存Bitmap类型中
public static bool OpenTGAFile(byte[] tagContent, ref Bitmap bmp)
{
sTGAHEADER th;
MemoryStream fs = new MemoryStream(tagContent);
BinaryReader br = new BinaryReader(fs);
//读取文件头,因为我不知道如何从流中读取自定义数据结构,只好一个一个读了
thid_length = brReadByte();
thcolormap_type = brReadByte();
thimage_type = brReadByte();
thcolormap_index = brReadUInt16();
thcolormap_length = brReadUInt16();
thcolormap_size = brReadByte();
thx = brReadUInt16();
thy = brReadUInt16();
thwidth = brReadUInt16();
thheigth = brReadUInt16();
thpixel_size = brReadByte();
thattributes = brReadByte();
if (thpixel_size != 24 & thpixel_size != 32)
{
MessageBoxShow("只支持24位和32位的图象格式。");
return false;
}
int x;
int y;
int dest;
byte[] p = new byte[4];
//读取颜色值的临时变量
byte[] p24;
fsSeek(thid_length, SeekOriginCurrent);
//定位文件指针跳过文件信息
int ByteCount = 4 thwidth thheigth;
//目标始终是32位格式
byte[] Bytes = new byte[ByteCount];
//分配临时内存
if (thimage_type == 2)
{
//不压缩格式,直接读入每个象素的颜色值
dest = 0;
for (y = thheigth - 1; y >= 0; y += -1)
{
//图象是上下倒置的
dest = y thwidth 4;
for (x = 0; x <= thwidth - 1; x++)
{
if (thpixel_size == 24)
{
p24 = brReadBytes(3);
//24位读入3个字节, 它会改变数组P的维数
p[0] = p24[0];
p[1] = p24[1];
p[2] = p24[2];
p[3] = 255;
}
else
{
p = brReadBytes(4);
//32位格式,读入4个字节
}
Bytes[dest] = p[0];
Bytes[dest + 1] = p[1];
Bytes[dest + 2] = p[2];
Bytes[dest + 3] = p[3];
dest += 4;
}
}
}
else if (thimage_type == 10)
{
//RLE压缩
//TGA文件RLE压缩的方式为,从最下一行向上记录,块标识如果大于127,后面为一个颜色值,
//表示之后的标识减去127个象素都是这个颜色;如果标识小于128,则后面标识数量的象素为没有压缩的颜色值。
byte PacketHeader;
int PacketSize;
int a;
int i;
int j;
j = (int)thwidth (int)thheigth;
i = 0;
do
{
PacketHeader = brReadByte();
//读入一个字节
if (PacketHeader >= 128)
PacketSize = (PacketHeader - 128);
else
PacketSize = PacketHeader;
for (a = 0; a <= PacketSize; a++)
{
//循环块
if (PacketHeader < 128 | a == 0)
{
//不是压缩块,每次都要读入数值
if (thpixel_size == 24)
{
p24 = brReadBytes(3);
//24位读入3个字节, 它会改变数组P的维数
p[0] = p24[0];
p[1] = p24[1];
p[2] = p24[2];
p[3] = 255;
}
else
{
p = brReadBytes(4);
//32位格式,读入4个字节
}
}
y = thheigth - (i / thwidth) - 1;
x = i % thwidth;
dest = (y thwidth + x) 4;
Bytes[dest] = p[0];
Bytes[dest + 1] = p[1];
Bytes[dest + 2] = p[2];
Bytes[dest + 3] = p[3];
i += 1;
if (i == j)
break; // TODO: might not be correct Was : Exit Do
}
}
while (true);
}
else
{
MessageBoxShow("文件格式不支持。");
return false;
}
//所有数据已经读入bytes,创建离屏表面
if ((bmp != null))
{
//释放之前的内存
bmpDispose();
bmp = null;
}
bmp = new Bitmap(thwidth, thheigth, SystemDrawingImagingPixelFormatFormat32bppArgb);
Rectangle rect = new Rectangle(0, 0, bmpWidth, bmpHeight);
SystemDrawingImagingBitmapData bmpData;
//锁定内存
bmpData = bmpLockBits(rect, SystemDrawingImagingImageLockModeWriteOnly, bmpPixelFormat);
//得到内存指针
IntPtr ptr = bmpDataScan0;
//拷贝数据到指针内存
SystemRuntimeInteropServicesMarshalCopy(Bytes, 0, ptr, ByteCount);
//解锁
bmpUnlockBits(bmpData);
//翻转
bmpRotateFlip(RotateFlipTypeRotate180FlipX);
return true;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)