android java tga转png_java 里.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文件的函数,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图片怎么用啊,是不是要导入一个包,真的找不到资源,希望来位大神帮帮我 小弟在此拜谢!...相关推荐
- android图片做平移动画,Android中用Matrix实现ImageView里的图片平移和缩放动画
注: 这里说的图片的平移和缩放不是对ImageView整个view进行的,而是对ImageView里面的图片进行的(view本身没有什么变化),所以Android自带的动画效果不能满足需求. 功能点: ...
- java中怎么快速导入一个包_Eclipse中快速导入jar包的方法
如何在Eclipse中快速导入jar包呢?下面就一起来学习Eclipse中快速导入jar包的方法吧,熟悉一下它的基本操作, 相信对各位小伙伴们一定会有所帮助的哦. Eclipse中快速导入jar包的方 ...
- java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...
/** * * @create time [2014-4-13] */ public class Test { public static void main(String args[]) { //原 ...
- JAVA领域10位大神
在Java出现以前,Internet上的信息内容都是一些乏味死板的HTML文档.这对于那些迷恋于WEB浏览的人们来说简直不可容忍.Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构 ...
- java thread 无法执行_哪位大神帮我讲一下这段代码,为什么线程不能继续执行
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.A ...
- android 页面无法点击,为什么点击不跳转到下一界面,哪位大神帮瞅瞅
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 package com.example.udp;import android.app.Activity;import android.content.In ...
- 参考文献 如何控制别自动换行_word里插入参考文献时,出现自动换行,排版很难看,怎么解决?有图!求大神指教!...
展开全部 1.选中这32313133353236313431303231363533e59b9ee7ad9431333433643731些参考文献的段落,打开"段落"选项卡(就是设 ...
- 阿卡姆疯人院需要java吗_蝙蝠侠阿甘疯人院 这个报错 怎么解决 哪位大神知道...
有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾. ************** 异常文本 ************** System.Runtime.InteropServi ...
- web项目里看不到html,在webpack中导入html文件时找不到模块错误
尝试使用 html-loader插件在TypeScript中导入html: import buttonHtml from './button.html'; 出现TypeScript错误: TS2307 ...
最新文章
- UIView的clipsTobounds属性
- 2 - 4 - 实例:X86的中断与异常机制(9-48)
- MFC类向导添加自定义消息未声明标识符的解决方法
- BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
- TIOBE 2月编程语言排行榜新鲜出炉!C# 获3.08%增长率!
- 【CodeForces - 764D】Timofey and rectangles (四色定理 + 找规律 + 构造)
- 小程序授权第三方管理开发的流程
- 那些用Go实现的分布式事务框架
- android手机安装python并写代码运行
- 花书+吴恩达深度学习(二)非线性激活函数(ReLU, maxout, sigmoid, tanh)
- html 日期判断周几,javascript怎么根据日期判断星期几?
- LSF-SCNN:一种基于 CNN 的短文本表达模型及相似度计算的全新优化模型
- layui表格使用复选框批量删除_LayUI表格批量删除方法
- 高效的JavaScript
- python opencv人脸解锁_教你使用python+Opencv完成人脸解锁
- alin的学习之路(Qt篇:三)(常用控件,自定义控件,事件捕捉)
- 基于matlab的声音个数识别
- WIN7系统配置maven环境变量
- 有监督学习,无监督学习,强化学习总结
- js之win10计算器
热门文章
- 小程序组件的使用(三) 调用子组件方法
- php代码并发控制,php并发控制
- 如何让apache支持php,Apache怎么才能支持PHP程序?
- android system读写权限设置,当然需要root访问权限才能写入Android的system目录
- linux7重装linux6,CentOS6远程重装7过程
- excel日期格式改不了_画进度计划横道图,Excel就够了
- java 可插拔注解_20200311 8. 注解和可插拔性
- 如何改变php的语言变中文,yii2怎么设置切换语言
- 2017年java教材推荐_干货|2017年最新JavaEE课程大纲分享
- easyui dialog 不执行页面js_Spring Security(六):前端菜单,角色权限页面的搭建