展开全部

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文件的函数,62616964757a686964616fe78988e69d8331333361306338将图象解码后写入内存Bitmap类型中

public static bool OpenTGAFile(byte[] tagContent, ref Bitmap bmp)

{

sTGAHEADER th;

MemoryStream fs = new MemoryStream(tagContent);

BinaryReader br = new BinaryReader(fs);

//读取文件头,因为我不知道如何从流中读取自定义数据结构,只好一个一个读了

th.id_length = br.ReadByte();

th.colormap_type = br.ReadByte();

th.image_type = br.ReadByte();

th.colormap_index = br.ReadUInt16();

th.colormap_length = br.ReadUInt16();

th.colormap_size = br.ReadByte();

th.x = br.ReadUInt16();

th.y = br.ReadUInt16();

th.width = br.ReadUInt16();

th.heigth = br.ReadUInt16();

th.pixel_size = br.ReadByte();

th.attributes = br.ReadByte();

if (th.pixel_size != 24 & th.pixel_size != 32)

{

MessageBox.Show("只支持24位和32位的图象格式。");

return false;

}

int x;

int y;

int dest;

byte[] p = new byte[4];

//读取颜色值的临时变量

byte[] p24;

fs.Seek(th.id_length, SeekOrigin.Current);

//定位文件指针跳过文件信息

int ByteCount = 4 * th.width * th.heigth;

//目标始终是32位格式

byte[] Bytes = new byte[ByteCount];

//分配临时内存

if (th.image_type == 2)

{

//不压缩格式,直接读入每个象素的颜色值

dest = 0;

for (y = th.heigth - 1; y >= 0; y += -1)

{

//图象是上下倒置的

dest = y * th.width * 4;

for (x = 0; x <= th.width - 1; x++)

{

if (th.pixel_size == 24)

{

p24 = br.ReadBytes(3);

//24位读入3个字节, 它会改变数组P的维数

p[0] = p24[0];

p[1] = p24[1];

p[2] = p24[2];

p[3] = 255;

}

else

{

p = br.ReadBytes(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 (th.image_type == 10)

{

//RLE压缩

//TGA文件RLE压缩的方式为,从最下一行向上记录,块标识如果大于127,后面为一个颜色值,

//表示之后的标识减去127个象素都是这个颜色;如果标识小于128,则后面标识数量的象素为没有压缩的颜色值。

byte PacketHeader;

int PacketSize;

int a;

int i;

int j;

j = (int)th.width * (int)th.heigth;

i = 0;

do

{

PacketHeader = br.ReadByte();

//读入一个字节

if (PacketHeader >= 128)

PacketSize = (PacketHeader - 128);

else

PacketSize = PacketHeader;

for (a = 0; a <= PacketSize; a++)

{

//循环块

if (PacketHeader < 128 | a == 0)

{

//不是压缩块,每次都要读入数值

if (th.pixel_size == 24)

{

p24 = br.ReadBytes(3);

//24位读入3个字节, 它会改变数组P的维数

p[0] = p24[0];

p[1] = p24[1];

p[2] = p24[2];

p[3] = 255;

}

else

{

p = br.ReadBytes(4);

//32位格式,读入4个字节

}

}

y = th.heigth - (i / th.width) - 1;

x = i % th.width;

dest = (y * th.width + 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

{

MessageBox.Show("文件格式不支持。");

return false;

}

//所有数据已经读入bytes,创建离屏表面

if ((bmp != null))

{

//释放之前的内存

bmp.Dispose();

bmp = null;

}

bmp = new Bitmap(th.width, th.heigth, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);

System.Drawing.Imaging.BitmapData bmpData;

//锁定内存

bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.WriteOnly, bmp.PixelFormat);

//得到内存指针

IntPtr ptr = bmpData.Scan0;

//拷贝数据到指针内存

System.Runtime.InteropServices.Marshal.Copy(Bytes, 0, ptr, ByteCount);

//解锁

bmp.UnlockBits(bmpData);

//翻转

bmp.RotateFlip(RotateFlipType.Rotate180FlipX);

return true;

}

追问

大神,这个我不会用,能不能给我说说?

追答

运行下debug!

本回答由提问者推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

android java tga转png_java 里.tga图片怎么用啊,是不是要导入一个包,真的找不到资源,希望来位大神帮帮我 小弟在此拜谢!...相关推荐

  1. android图片做平移动画,Android中用Matrix实现ImageView里的图片平移和缩放动画

    注: 这里说的图片的平移和缩放不是对ImageView整个view进行的,而是对ImageView里面的图片进行的(view本身没有什么变化),所以Android自带的动画效果不能满足需求. 功能点: ...

  2. java中怎么快速导入一个包_Eclipse中快速导入jar包的方法

    如何在Eclipse中快速导入jar包呢?下面就一起来学习Eclipse中快速导入jar包的方法吧,熟悉一下它的基本操作, 相信对各位小伙伴们一定会有所帮助的哦. Eclipse中快速导入jar包的方 ...

  3. java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...

    /** * * @create time [2014-4-13] */ public class Test { public static void main(String args[]) { //原 ...

  4. JAVA领域10位大神

    在Java出现以前,Internet上的信息内容都是一些乏味死板的HTML文档.这对于那些迷恋于WEB浏览的人们来说简直不可容忍.Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构 ...

  5. java thread 无法执行_哪位大神帮我讲一下这段代码,为什么线程不能继续执行

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.A ...

  6. android 页面无法点击,为什么点击不跳转到下一界面,哪位大神帮瞅瞅

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 package com.example.udp;import android.app.Activity;import android.content.In ...

  7. 参考文献 如何控制别自动换行_word里插入参考文献时,出现自动换行,排版很难看,怎么解决?有图!求大神指教!...

    展开全部 1.选中这32313133353236313431303231363533e59b9ee7ad9431333433643731些参考文献的段落,打开"段落"选项卡(就是设 ...

  8. 阿卡姆疯人院需要java吗_蝙蝠侠阿甘疯人院 这个报错 怎么解决 哪位大神知道...

    有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾. ************** 异常文本 ************** System.Runtime.InteropServi ...

  9. web项目里看不到html,在webpack中导入html文件时找不到模块错误

    尝试使用 html-loader插件在TypeScript中导入html: import buttonHtml from './button.html'; 出现TypeScript错误: TS2307 ...

最新文章

  1. UIView的clipsTobounds属性
  2. 2 - 4 - 实例:X86的中断与异常机制(9-48)
  3. MFC类向导添加自定义消息未声明标识符的解决方法
  4. BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
  5. TIOBE 2月编程语言排行榜新鲜出炉!C# 获3.08%增长率!
  6. 【CodeForces - 764D】Timofey and rectangles (四色定理 + 找规律 + 构造)
  7. 小程序授权第三方管理开发的流程
  8. 那些用Go实现的分布式事务框架
  9. android手机安装python并写代码运行
  10. 花书+吴恩达深度学习(二)非线性激活函数(ReLU, maxout, sigmoid, tanh)
  11. html 日期判断周几,javascript怎么根据日期判断星期几?
  12. LSF-SCNN:一种基于 CNN 的短文本表达模型及相似度计算的全新优化模型
  13. layui表格使用复选框批量删除_LayUI表格批量删除方法
  14. 高效的JavaScript
  15. python opencv人脸解锁_教你使用python+Opencv完成人脸解锁
  16. alin的学习之路(Qt篇:三)(常用控件,自定义控件,事件捕捉)
  17. 基于matlab的声音个数识别
  18. WIN7系统配置maven环境变量
  19. 有监督学习,无监督学习,强化学习总结
  20. js之win10计算器

热门文章

  1. 小程序组件的使用(三) 调用子组件方法
  2. php代码并发控制,php并发控制
  3. 如何让apache支持php,Apache怎么才能支持PHP程序?
  4. android system读写权限设置,当然需要root访问权限才能写入Android的system目录
  5. linux7重装linux6,CentOS6远程重装7过程
  6. excel日期格式改不了_画进度计划横道图,Excel就够了
  7. java 可插拔注解_20200311 8. 注解和可插拔性
  8. 如何改变php的语言变中文,yii2怎么设置切换语言
  9. 2017年java教材推荐_干货|2017年最新JavaEE课程大纲分享
  10. easyui dialog 不执行页面js_Spring Security(六):前端菜单,角色权限页面的搭建