使用方法

ImageTGA _Tga = new ImageTGA();

Bitmap _Bitmap = new Bitmap(124, 234);

this.DrawToBitmap(_Bitmap, new Rectangle(0, 0, 124, 234));

_Tga.Image = _Bitmap;

_Tga.SaveImage(@"C:\1.tga");

保存的时候只实现了非RLE的 8位 24位 32位 有需要的自己改写下 SaveImageToTGA方法,不多说了 代码不到300行

view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.IO;  
using System.Text;  
using System.Drawing;  
using System.Drawing.Imaging;  
using System.Runtime.InteropServices;  
 
namespace Zgke.MyImage.ImageFile  
{  
    /// <summary>  
    /// Targa文件  
    /// zgke@sina.com  
    /// qq:116149  
    /// </summary>  
    public class ImageTGA  
    {  
        public ImageTGA()  
        {  
              
        }  
 
        public ImageTGA(string p_FileFullName)  
        {  
            if (System.IO.File.Exists(p_FileFullName))  
            {  
                LoadData(File.ReadAllBytes(p_FileFullName));  
            }              
        } 
 
        #region 属性  
        /// <summary>  
        /// ID区域大小 默认为0  
        /// </summary>  
        private byte m_IDSize = 0;  
        /// <summary>  
        /// 色彩表类型 默认为0  
        /// </summary>  
        private byte m_ColorTableType = 0;  
        /// <summary>  
        /// 色彩表类型 默认为2  
        /// </summary>  
        private byte m_ImageType = 2;  
        /// <summary>  
        /// 色彩表类型开始位置  
        /// </summary>  
        private ushort m_ColorTableIndex = 0;  
        /// <summary>  
        /// 色彩表长度  
        /// </summary>  
        private ushort m_ColorTableCount = 0;  
        /// <summary>  
        /// 色彩表大小  
        /// </summary>  
        private byte m_ColorTableSize = 24;  
        /// <summary>  
        /// 色彩表类型开始位置  
        /// </summary>  
        private ushort m_ImageX = 0;  
        /// <summary>  
        /// 色彩表长度  
        /// </summary>  
        private ushort m_ImageY = 0;  
        /// <summary>  
        /// 色彩表类型开始位置  
        /// </summary>  
        private ushort m_ImageWidth = 0;  
        /// <summary>  
        /// 色彩表长度  
        /// </summary>  
        private ushort m_ImageHeight = 0;  
        /// <summary>  
        /// 每像素位数  
        /// </summary>  
        private byte m_PixSize = 0;  
        /// <summary>  
        /// 描述占位符  
        /// </summary>  
        private byte m_Remark = 0;  
        /// <summary>  
        /// 读的位置  
        /// </summary>  
        private uint m_ReadIndex = 0;     
        /// <summary>  
        /// 图形  
        /// </summary>  
        private Bitmap m_Image; 
        #endregion  
 
        /// <summary>  
        /// 图形  
        /// </summary>  
        public Bitmap Image  
        {  
            get 
            {  
                return m_Image;  
            }  
            set 
            {  
                m_Image = value;  
                if (value != null)  
                {  
                    switch (value.PixelFormat)  
                    {  
                        case PixelFormat.Format8bppIndexed:  
                            m_ColorTableType = 1;  
                            m_ImageType = 1;  
                            m_ColorTableCount = 256;  
                            m_PixSize = 8;  
                            m_Remark = 32;  
                            break;  
                        case PixelFormat.Format32bppArgb:  
                            m_ColorTableType = 0;  
                            m_ImageType = 2;  
                            m_ColorTableCount = 0;  
                            m_PixSize = 32;  
                            m_Remark = 32;  
                            break;  
                        default:  
                            m_ColorTableType = 0;  
                            m_ImageType = 2;  
                            m_ColorTableCount = 0;  
                            m_PixSize = 24;  
                            m_Remark = 32;  
                            break;  
                    }  
                    m_ImageWidth = (ushort)value.Width;  
                    m_ImageHeight = (ushort)value.Height;  
                }  
            }  
        }  
 
        /// <summary>  
        /// 获取数据  
        /// </summary>  
        /// <param name="p_TGABytes"></param>  
        private void LoadData(byte[] p_TGABytes)  
        {  
            m_IDSize = p_TGABytes[0];  
            m_ColorTableType = p_TGABytes[1];  
            m_ImageType = p_TGABytes[2];  
            m_ColorTableIndex = BitConverter.ToUInt16(p_TGABytes, 3);  
            m_ColorTableCount = BitConverter.ToUInt16(p_TGABytes, 5);  
            m_ColorTableSize = p_TGABytes[7];  
            m_ImageX = BitConverter.ToUInt16(p_TGABytes, 8);  
            m_ImageY = BitConverter.ToUInt16(p_TGABytes, 10);  
            m_ImageWidth = BitConverter.ToUInt16(p_TGABytes, 12);  
            m_ImageHeight = BitConverter.ToUInt16(p_TGABytes, 14);  
            m_PixSize = p_TGABytes[16];  
            m_Remark = p_TGABytes[17];  
            m_ReadIndex = 18;  
            LoadImage(p_TGABytes);  
        }  
 
        private void LoadImage(byte[] p_TAGBytes)  
        {  
            switch (m_PixSize)  
            {  
                case 24:  
                    m_Image = new Bitmap(m_ImageWidth, m_ImageHeight, PixelFormat.Format24bppRgb);  
                    LoadImageNotRLE(p_TAGBytes, 3);  
                    break;  
                case 32:  
                    m_Image = new Bitmap(m_ImageWidth, m_ImageHeight, PixelFormat.Format24bppRgb);  
                    LoadImageNotRLE(p_TAGBytes, 4);  
                    break;  
                case 8:  
                    m_Image = new Bitmap(m_ImageWidth, m_ImageHeight, PixelFormat.Format8bppIndexed);  
                    ColorPalette _Palette = m_Image.Palette;  
                    for (int i = 0; i != m_ColorTableCount; i++)  
                    {  
                        _Palette.Entries[i] = Color.FromArgb(255, p_TAGBytes[m_ReadIndex + 2], p_TAGBytes[m_ReadIndex + 1], p_TAGBytes[m_ReadIndex]);  
                        m_ReadIndex += 3;  
                    }  
                    m_Image.Palette = _Palette;  
                    LoadImageNotRLE(p_TAGBytes, 1);  
                    break;  
            }  
        }  
 
        /// <summary>  
        /// 获取非RLE压缩的图形  
        /// </summary>  
        /// <param name="p_TagBytes"></param>  
        /// <param name="p_Size"></param>  
        private void LoadImageNotRLE(byte[] p_TagBytes, int p_Size)  
        {  
            int _Index = 0;  
            PixelFormat _Format = PixelFormat.Format24bppRgb;  
            switch (p_Size)  
            {  
                case 3:  
                    _Format = PixelFormat.Format24bppRgb;  
                    break;  
                case 4:  
                    _Format = PixelFormat.Format32bppArgb;  
                    break;  
                case 1:  
                    _Format = PixelFormat.Format8bppIndexed;  
                    break;  
            }  
            BitmapData _ImageData = m_Image.LockBits(new Rectangle(0, 0, m_ImageWidth, m_ImageHeight), ImageLockMode.ReadWrite, _Format);  
            byte[] _ValueBytes = new byte[_ImageData.Stride * _ImageData.Height];  
            for (int i = 0; i != _ImageData.Height; i++)  
            {  
                _Index = _ImageData.Stride * i;  
 
                Array.Copy(p_TagBytes, m_ReadIndex, _ValueBytes, _Index, _ImageData.Width * p_Size);  
                m_ReadIndex += (uint)_ImageData.Width * (uint)p_Size;  
            }  
            Marshal.Copy(_ValueBytes, 0, _ImageData.Scan0, _ValueBytes.Length);  
            m_Image.UnlockBits(_ImageData);  
        }  
 
        /// <summary>  
        /// 保存图形为TGA  
        /// </summary>  
        /// <returns></returns>  
        private byte[] SaveImageToTGA()  
        {  
            if (m_Image == null) return null;  
            MemoryStream _ImageMemory = new MemoryStream();  
            _ImageMemory.WriteByte(m_IDSize);  
            _ImageMemory.WriteByte(m_ColorTableType);  
            _ImageMemory.WriteByte(m_ImageType);  
            _ImageMemory.Write(BitConverter.GetBytes(m_ColorTableIndex), 0, 2);  
            _ImageMemory.Write(BitConverter.GetBytes(m_ColorTableCount), 0, 2);  
            _ImageMemory.WriteByte(m_ColorTableSize);  
            _ImageMemory.Write(BitConverter.GetBytes(m_ImageX), 0, 2);  
            _ImageMemory.Write(BitConverter.GetBytes(m_ImageY), 0, 2);  
            _ImageMemory.Write(BitConverter.GetBytes(m_ImageWidth), 0, 2);  
            _ImageMemory.Write(BitConverter.GetBytes(m_ImageHeight), 0, 2);  
            _ImageMemory.WriteByte(m_PixSize);  
            _ImageMemory.WriteByte(m_Remark);  
            int _ColorSize = 0;  
            Bitmap _SaveBitmap = m_Image;  
            switch (_SaveBitmap.PixelFormat)  
            {  
                case PixelFormat.Format24bppRgb:  
                    _ColorSize = 3;  
                    break;  
                case PixelFormat.Format8bppIndexed:  
                    _ColorSize = 1;  
                    for (int i = 0; i != m_ColorTableCount; i++)  
                    {  
                        _ImageMemory.WriteByte(m_Image.Palette.Entries[i].B);  
                        _ImageMemory.WriteByte(m_Image.Palette.Entries[i].G);  
                        _ImageMemory.WriteByte(m_Image.Palette.Entries[i].R);  
                    }  
                    break;  
                case PixelFormat.Format32bppArgb:  
                    _ColorSize = 4;  
                    break;  
                default:  
                    _SaveBitmap = new Bitmap(m_Image.Width, m_Image.Height, PixelFormat.Format24bppRgb);  
                    Graphics _Graphics = Graphics.FromImage(_SaveBitmap);  
                    _Graphics.DrawImage(m_Image, new Rectangle(0, 0, _SaveBitmap.Width, _SaveBitmap.Height));  
                    _Graphics.Dispose();  
                    _ColorSize = 3;  
                    break;  
            }  
            BitmapData _ImageData = _SaveBitmap.LockBits(new Rectangle(0, 0, _SaveBitmap.Width, _SaveBitmap.Height), ImageLockMode.ReadWrite, _SaveBitmap.PixelFormat);  
            byte[] _ValueBytes = new byte[_ImageData.Stride * _ImageData.Height];  
            Marshal.Copy(_ImageData.Scan0, _ValueBytes, 0, _ValueBytes.Length);  
            _SaveBitmap.UnlockBits(_ImageData);  
            int _Index = 0;  
            for (int i = 0; i != _ImageData.Height; i++)  
            {  
                _Index = _ImageData.Stride * i;  
                _ImageMemory.Write(_ValueBytes, _Index, _ColorSize * _ImageData.Width);  
            }  
            return _ImageMemory.ToArray();  
        }  
 
        /// <summary>  
        /// 保存图形到文件  
        /// </summary>  
        /// <param name="p_FileFullName"></param>  
        public void SaveImage(string p_FileFullName)  
        {  
            byte[] _ValueBytes = SaveImageToTGA();  
            if (_ValueBytes != null) File.WriteAllBytes(p_FileFullName, _ValueBytes);  
        }         
 
    }  
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zgke/archive/2009/10/14/4667499.aspx

转载于:https://www.cnblogs.com/JohnXIe/archive/2011/06/02/2068555.html

C# 解析 Targa文件 (TGA) 图形相关推荐

  1. CSharpGL(5)解析3DS文件并用CSharpGL渲染

    CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...

  2. [系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. c# 解析Xml文件

    c# Xml解析类和应用 这是面向对象的课程设计作业,就是自己写xml解析类并且完成由xml文件向图形的转化. 这里用了两种方法,第一种是c#自己提供的xml解析函数,第二种是自己的xml解析函数. ...

  4. java解析xml文件:创建、读取、遍历、增删查改、保存

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用JDOM接口解析xml文件,包含创建.增删查改.保存,读取等操作. 需要引入jdom.jar,下载 xercesImpl.jar,下载 ...

  5. Qt 解析 DXF 文件

    Qt 解析 DXF 文件 自己编写,亲测可用 使用示例 #include "dxfhelper.h" int main() {DxfHelper dxfHelper;if(dxfH ...

  6. JAVA SE 进阶篇 C3 解析XML文件,做一个jar工具包

    文章目录 P1 XML文件 1 XML文件概述 (1) 可扩展标记语言:XML (2) XML文件的书写规则和语法要求 2 创建一个XML文件 P2 解析给定的XML文件 1 XML解析器和W3C 2 ...

  7. java代码使用ImageJ解析dicom文件成图片

    ImageJ解析dicom文件成jpg图片 Dicom全称是医学数字图像与通讯,这里讲java解析diocm格式文件变成jpg示例. 这里的代码只能解析普通的dicom文件成jpg图片,对于压缩的di ...

  8. 利用 Livox-SDK 解析 lvx 文件并在 CloudCompare 中显示

    利用 Livox-SDK 开发的程序,很早就完成了,今天把它们整理出来分享出来给大家. 解析 lvx 文件 exe 下载地址:lvx 批量转 las.这是一个解析 lvx 文件的轻量级的控制台程序.支 ...

  9. python中利用lxml模块解析xml文件报错XMLSyntaxError: Opening and ending tag mismatch

    今天在代码中第一次使用lxml解析xml文件时出错了, XMLSyntaxError: Opening and ending tag mismatch: keyEffectiveDate line 2 ...

最新文章

  1. PHP 使用 Redis
  2. zabbix服务器性能监控工具的安装二
  3. pycharm 通过 SFTP 远程编辑项目的配置
  4. Log4j远程代码执行漏洞验证
  5. 读《深入jvm原理》之class文件
  6. Ubuntu下selenium+Chrome的安装使用
  7. ​【文末有福利】揭秘阿里中台!一文看懂阿里推荐业务的两项利器
  8. 【转】unity地形插件T4M使用帮助
  9. 记一次服务器执行MySQL耗时问题
  10. Notification使用详解之三:通过服务更新进度通知在Activity中监听服务进度
  11. 将自己的dcm数据制作成LUNA16数据集提供数据样式之代码整理
  12. Python入门-try-except-else-finally
  13. mysql for centos_CentOs中mysql的安装与配置
  14. javascript高级程序设计读书笔记——事件总结
  15. 免费数据恢复软件恢复SanDisk丢失的资料
  16. Project 4:用户画像的建立
  17. 《免费:商业的未来》“免费经济学”读书笔记----字节跳动案例分析
  18. Matlab 马尔可夫链预测双色球
  19. 投影幕布尺寸计算器_投影距离和屏幕尺寸计算器Ver1.02.xls
  20. 微信H5开发,怎样禁止手机横屏

热门文章

  1. python 中移去文件的只读属性
  2. Spring Boot集成Druid监控
  3. hadoop0.20.0第一个例子
  4. Leetcode PHP题解--D47 868. Binary Gap
  5. Java 9 将采用新的版本字符串格式
  6. 多款优秀的 JS MVC 框架对比
  7. Swing-BoxLayout用法-入门
  8. 无法加载安装安装程序:Wbemupgd.dll
  9. 字符串替换方法的优劣
  10. SQL Server之索引