Android raw to bmp
Android raw 格式转 bmp 图像
raw 保存的为裸数据,转换时都需要把它转成RGBA 的方式来显示。其中:
8位RAW: 四位RGBA 来表示一位灰度;
24位RAW: 三位RGB相同,A(alpha)用0XFF表示。
Bitmap.Config 枚举说明:
位图位数越高代表其可以存储的颜色信息越多,当然图像也就越逼真。
- ALPHA_8 代表8位Alpha位图
- ARGB_4444 代表16位ARGB位图
- ARGB_8888 代表32位ARGB位图
- RGB_565 代表8位RGB位图
实现如下:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer; import android.graphics.Bitmap; /**
* Raw转Bitmap
*
* @author ChenRui
*
*/
public class RawToBitMap
{
/**
* 从流中读取数组
*
* @param stream
* 输入流
* @return
*/
public static byte[] readByteArrayFormStream(InputStream stream)
{
try
{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int len = 0;
byte[] tmp = new byte[1024];
while ((len = stream.read(tmp)) != -1)
{
outStream.write(tmp, 0, len);
} byte[] data = outStream.toByteArray(); return data;
}
catch (IOException e)
{
e.printStackTrace();
return new byte[0];
}
} /**
* 8位灰度转Bitmap
*
* 图像宽度必须能被4整除
*
* @param data
* 裸数据
* @param width
* 图像宽度
* @param height
* 图像高度
* @return
*/
public static Bitmap convert8bit(byte[] data, int width, int height)
{
byte[] Bits = new byte[data.length * 4]; //RGBA 数组 int i;
for (i = 0; i < data.length; i++)
{
// 原理:4个字节表示一个灰度,则RGB = 灰度值,最后一个Alpha = 0xff;
Bits[i * 4] = Bits[i * 4 + 1] = Bits[i * 4 + 2] = data[i];
Bits[i * 4 + 3] = -1; //0xff
} // Bitmap.Config.ARGB_8888 表示:图像模式为8位
Bitmap bmp = Bitmap
.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bmp.copyPixelsFromBuffer(ByteBuffer.wrap(Bits)); return bmp;
} /**
* 24位灰度转Bitmap
*
* 图像宽度必须能被4整除
*
* @param data
* 裸数据
* @param width
* 图像宽度
* @param height
* 图像高度
* @return
*/
public static Bitmap convert24bit(byte[] data, int width, int height)
{
byte[] Bits = new byte[data.length * 4]; //RGBA 数组 int i; // data.length / 3 表示 3位为一组
for (i = 0; i < data.length / 3; i++)
{
// 原理:24位是有彩色的,所以要复制3位,最后一位Alpha = 0xff;
Bits[i * 4] = data[i * 3];
Bits[i * 4 + 1] = data[i * 3 + 1];
Bits[i * 4 + 2] = data[i * 3 + 2];
Bits[i * 4 + 3] = -1;
} // Bitmap.Config.ARGB_8888 表示:图像模式为8位
Bitmap bmp = Bitmap
.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bmp.copyPixelsFromBuffer(ByteBuffer.wrap(Bits)); return bmp;
} /**
* 8位灰度转Bitmap
*
* @param stream
* 输入流
* @param width
* 图像宽度
* @param height
* 图像高度
* @return
*/
public static Bitmap convert8bit(InputStream stream, int width, int height)
{
return convert8bit(readByteArrayFormStream(stream), width, height);
} /**
* 24位灰度转Bitmap
*
* @param data
* 输入流
* @param width
* 图像宽度
* @param height
* 图像高度
* @return
*/
public static Bitmap convert24bit(InputStream stream, int width, int height)
{
return convert24bit(readByteArrayFormStream(stream), width, height);
}
}
显示时宽度和高度必须匹配正确。
ImageView1.setImageBitmap(RawToBitMap.convert8bit(getAssets().open("8bit.raw"), 512, 512));
Android raw to bmp的更多相关文章
- android raw与assets区别
*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点:1.res/raw中的文件会被映射到R ...
- android raw与assets资源
*res/raw和assets的同样点: 1.两者文件夹下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1.res/raw中的文件会被映射 ...
- [转载] Android raw与assets区别
*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点:1.res/raw中的文件会被映射到R ...
- android raw和assets的区别
*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1**.res/raw中的文件会被映 ...
- Android图像篇
Android的渲染分为2D渲染和3D渲染两种,当中2D渲染的引擎为Skia.3D渲染的引擎是OpenGL ES.眼下.Android支持OpenGL ES1.0和OpenGL ES 2.0两种标准. ...
- Remote Displayer for Android
应用截图: 作者:sunrain_hjb QQ:2157825357 Email:sunrain_hjb@aliyun.com 版本:1.0.188 ...
- LCD如何显示图像
1.LCD显示主要相关概念 (1)像素(pixel) 整个图像是由一个个的像素组成的,像素就是一个显示点.像素就是组成图像的最基本元素,或者说显示中可以被控制的最小单位,整个图像就是由很多个像素组成的 ...
- 减小APK大小
本篇文章翻译自Reduce APK Size 用户通常不会去下载体积过大的应用程序,特别是当自己的设备连接的是 2G/3G 或者按字节付费的网络.这篇文章描述了如何缩减 APK 的体积大小,以使得更多 ...
- CSP 初赛 知识点整理
BIOS: BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统".其实,它是一组固化到计算机 ...
随机推荐
- ASP.NET Core 之 Identity 入门(二)
前言 在 上篇文章 中讲了关于 Identity 需要了解的单词以及相对应的几个知识点,并且知道了Identity处在整个登入流程中的位置,本篇主要是在 .NET 整个认证系统中比较重要的一个环节,就 ...
- 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper
剧情开始 为何相爱? 相处的问题? 女人的伟大? 剧情收尾? 有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易 ...
- SQLServer事务同步下如何收缩日志
事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...
- C#创建dll类库
类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...
- nodejs操作arduino入门(javascript操作底层硬件)
用Javascript来操作硬件早就不是一件稀奇的事情了. 所以作为一名电子专业出身的FE,我也打算尝试一下用js来驱动arduino: 要想操作这些底层硬件,肯定是需要一些工具的,我这里介绍的工具主 ...
- jQuery可自动播放动画焦点图插件Koala
Koala是一款简单而实用的jQuery焦点图幻灯片插件,焦点图不仅可以在播放图片的时候让图片有淡入淡出的动画效果,而且图片可以自动播放.该jQuery焦点图的每一张图片都可以设置文字描述,并浮动在图 ...
- iOS 自定义方法 - 不完整边框
示例代码 ///////////////////////////OC.h////////////////////////// //// UIView+FreeBorder.h// BHBFreeB ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- eclipse,myeclipse 误删文件,回滚历史文件操作
昨天因为误操作把一个写了一上午的代码给删了,找到的这个,以前竟然还没发现有这个功能- -! 具体操作: 1.建立同路径同名的文件 2.文件上右键 --> Compare With --> ...
- APP并非一个人在战斗,还有API—Xamarin.Android回忆录
前言 一般来说,一个客户端APP并非独立存在的,很多时候需要与服务器交互.大体可分为两方面的数据,常规字符串数据和文件数据,因为这两种数据很可能传输方式不一样,比如字符串之类的数据,使用HTTP协议, ...