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"的缩略词,直译过来后中文名称就是"基本输入输出系统".其实,它是一组固化到计算机 ...
随机推荐
-
jquery 基础-Ajax应用
使用load()方案异步请求数据 调用格式:load(url,[data],[callback]) 参数url为加载服务器地址,可选项data参数为请求时发送的数据,callback参数为数据请求成功 ...
-
迪杰斯特拉算法——PAT 1003
本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...
-
一起找bug
帮同学找的一个bug,错误代码如下: package dai_test; public class Test1 { public static void main(String[] args) { / ...
-
C#中检测某个类(方法、程序集等各种部分)是否应用了指定的特性以及对特性的一些简单操作
前言:不管是自定义的一些特性,或者是C#中内置的特性,均继承自Attribute这个类,这个类也提供了一些方法,方便我们使用. Attribute类有三个静态方法:1.IsDefined,如果有指定的 ...
-
九度OJ 1528 最长回文子串 -- Manacher算法
题目地址:http://ac.jobdu.com/problem.php?pid=1528 题目描述: 回文串就是一个正读和反读都一样的字符串,比如"level"或者"n ...
-
python运维开发(十四)----HTML基本操作
内容目录: HTML概述 head标签 body中常用标签 css选择器 css常用属性 HTML HTML概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言) ...
-
onbeforeunload与a标签在IE中的冲突bug(转载)
onbeforeunload与a标签在IE中的冲突bug onbeforeunload 是window的一个事件,目前Firefox,IE都支持,主要用来提示用户是否真的要离开该页面,通常在一些比 ...
-
HTML5网页制作(3)
今天,就开始嵌入图片以及创建图片分区的学习吧! 这两张图片其实是我用HTML5写的(纯粹当做笔记来记了),以上就是今天要学的一些内容 下面是我今天敲的代码: [冒泡]林北的爸爸 2019/4/29 ...
-
CSS| 框模型-padding
例子:
-
android adb 读写模式 挂载文件系统
http://www.qylk.blog.163.com/blog/static/1346873562013092154430/ http://blog.sina.com.cn/s/blog_9906 ...