C# 解析 Targa文件 (TGA) 图形

 

使用方法

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中读写excel_python读写Excel

Python读写excel 对于python 处理excel 表格&#xff0c;这个日常工作的需求还是不少&#xff0c;于是查查资料&#xff0c;自己写写&#xff0c;总结一下&#xff0c;记录一下&#xff0c;下次遇到直接拿过来用&#xff0c;方便自己&#xff0c;方便大家。 好在python有读写ex…

c# asp.net mvc 开发的正方教务助手(二)

在上一篇文章展示了项目实际运行情况 现在我们来分析该项目如何完成的&#xff1a; 第一步&#xff1a;登陆你们的教务&#xff0c;这是我们学习的教务的主页http://jw.svtcc.edu.cn/Default2.aspx&#xff0c;进去之后&#xff0c;打开使用火狐浏览器进行登陆分析 在火狐浏览…

[html] 如何禁止input输入的历史记录?

[html] 如何禁止input输入的历史记录&#xff1f; 给form加上 autocompleteoff 可以禁止整个表单的历史记录给单个input加上 autocompleteoff 可禁止这个input的历史记录个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。…

单独安装想要的office_安装OFFICE不再求人,最省心的方法

强烈建议选择office部署工具Office Tool Plus 不建议选择微软官方的office 2016部署工具 因为还需要手动更改代码&#xff0c;不利于新手安装。office tool plus它能够帮助用户轻松的在线下载安装 Office 的各个版本&#xff0c;安装过程中用户可以自由选择安装哪些需要使用的组…

{php mysql}

###1.连接数据库服务器函数&#xff08;2个&#xff09;&#xff1a; mysql_connect,mysql_pconnect (1).mysql_connect() 格式&#xff1a;int mysql_connect(string [hostname] [:port],string [username],string [password]); hostname // * 服务器名username // * 服务器…

C# MVC的博客开发(一)登录

由于前端使用的是layui的模板&#xff0c;该模板自带登录和注册页面&#xff0c;但是此页面的登录和普通页面的登录有些不同登录后返回的数据也需要处理&#xff0c;这里我来整理下layui登录时候遇到的问题首先登录提交数据的js我们在login.html并没有找到&#xff0c;form提交…

案例八:shell自动化管理账本脚本

该脚本目的帮助管理员创建账号、删除账号、锁定账号、解锁账号。 #!/bin/bash #filename: #author: #date:2018-6-6 echo "用户管理程序" echo "1.创建用户" echo "2.删除用户" echo "3.锁定用户" echo "4.解锁用户" echo &…

小甲鱼python课后题007_[Python]小甲鱼Python视频第007-008课(了不起的分支和循环)课后题及参考解答...

# -*- coding: utf-8 -*- """ Created on Mon Mar 4 23:35:19 2019 author: fengs """ """ 测试题: 0. if not (money < 100): 上边这行代码相当于&#xff1f; if money > 100: 1. assert 的作用是什么&#xff1f; 断言功…

C# MVC的博客开发(二)登录

解决了登录数据在哪里提交的问题我们进行后台的登录的编写和实现后台登录代码我就不详细讲解了就是把传输过去的数据和数据库进行匹配如果存在就返回一个值如果不存在就另外一个值但是登录的时候我们可能遇到用户输入的用户密码不对或者其他的错误&#xff0c;官网的首页输入密…

程序员买房--续

上海是高房价的代表&#xff0c;其高耸云霄的房价的确不足以客观代表普遍水平。那么我们以内地稍稍低调的二线城市郑州为例&#xff0c;探讨工薪阶层是否能够征服房价&#xff0c;幸福快乐的生活。 郑州市2011年房均价位6000 &#xff0c;或许很多人会惊呼&#xff0c;这么便宜…

ASP.NET知识结构

ASP.NET知识结构 https://blog.csdn.net/yaolong168888/article/details/80126541 转载于:https://www.cnblogs.com/iamspecialone/p/11220086.html

C# MVC的博客开发(三)注册

在做注册的时候博主遇到了个很坑爹的问题 那就是本地发送邮件正常可是搬运到阿里云服务器发送邮件就gg了查询了很久才知道阿里云默认是把25发送邮件端口给封了 也就是说放在阿里云服务器的发送邮件是无法以无ssl加密的方式发送的&#xff0c;必须通过ssl家里的465端口去发送邮件…

python中if有几种使用方式_python 中if-else的多种简洁的写法

原博文 2017-11-02 15:18 − 因写多了判断语句&#xff0c;看着短短的代码却占据来好几行&#xff0c;于是便搜下if-else简洁的写法&#xff0c;结果也是发现新大陆 4种&#xff1a; 第1种:__就是普通写法 a, b, c 1, 2, 3 if a>b: c a else: c b 第二种&#xff1a;一行…

[html] 怎样避免让用户看到长时间的白屏?

[html] 怎样避免让用户看到长时间的白屏&#xff1f; 我觉得&#xff0c;实际解决办法需要结合用户体验和性能优化这两个指标来说&#xff1a;1、用户体验可以使用骨架屏来减少页面白屏&#xff0c;骨架屏也具有更好的loading效果。2、假如1个页面里面有很多很多网络请求&…

Markdown_LaTex_极限符号

IDE&#xff1a;Typora 内容&#xff1a;极限符号 \[\lim\limits_{x\rightarrow\infty}\frac{1}{x}\] $$\lim\limits_{x\rightarrow\infty}\frac{1}{x}$$解释:极限符号部分分数部分 极限部分\lim\limits_{x\rightarrow\infty} \[\lim\limits_{x\rightarrow\infty}\] 分数部分\f…

感谢博客园让我拥有自己的空间

申请的时候&#xff0c;一看需要审核&#xff0c;着实吓着了&#xff0c;除了QQ空间&#xff0c;从来没有申请过其它任何博客&#xff0c;不管如何&#xff0c;首先感谢博客园让我有了一个记录学习、生活的地方转载于:https://www.cnblogs.com/Delphi-Farmer/archive/2011/06/0…

python多行字符串输入_python中怎么输入多行字符串

Python中输入多行字符串&#xff1a; 方法一&#xff1a;使用三引号>>> str1 Le vent se lve, il faut tenter de vivre. 起风了&#xff0c;唯有努力生存。 &#xff08;纵有疾风起&#xff0c;人生不言弃。&#xff09; >>> str1 Le vent se lve, il faut…

C# MVC使用阿里云对象存储加快图片加载速度(一)

公司有个点餐的项目有大量的图片需要在扫码后的网页进行加载&#xff0c;刚开始使用的客户少的时候公司的4核8G&#xff0c;5M带宽的服务器还能挺快的加载图片和网页&#xff0c;但是客户一多&#xff0c;由于客户大多是快餐行业的&#xff0c;中午点餐的人数是相当多的&#x…

[html] html5点击返回键怎样不让它返回上一页

[html] html5点击返回键怎样不让它返回上一页 $(function() {if (window.history && window.history.pushState) {$(window).on(popstate, function () {window.history.pushState(forward, null, #);window.history.forward(1);});}window.history.pushState(forward,…

自动单击按钮

Delphi中FindWindow,FindWindowEx,SendMessage妙用: var i,j,k:integer; begin i:FindWindow(nil,与 ●┌哒!ňg 聊天中); //查找主窗口 j:FindWindowEx(i,0,#32770,); k:FindWindowEx(j,0,Button,消息模式(&T)); SendMessage(k,BM_CLICK,0,0…