RGB和Bitmap互相转换
RGB和Bitmap互相转换
之前做人脸识别的时候遇到一个问题,把RGB数据转换成Bitmap。所以决定写一个RGB和Bitmap互相转换的工具类分享给大家。
1、Bitmap转RGB
获取Bitmap的RGB数组一共有两个方法,接下来简答说明下
第一种方法:
/*** @方法描述 Bitmap转RGB*/public static byte[] bitmap2RGB(Bitmap bitmap) {int bytes = bitmap.getByteCount(); //返回可用于储存此位图像素的最小字节数ByteBuffer buffer = ByteBuffer.allocate(bytes); // 使用allocate()静态方法创建字节缓冲区bitmap.copyPixelsToBuffer(buffer); // 将位图的像素复制到指定的缓冲区byte[] rgba = buffer.array();byte[] pixels = new byte[(rgba.length / 4) * 3];int count = rgba.length / 4;//Bitmap像素点的色彩通道排列顺序是RGBAfor (int i = 0; i < count; i++) {pixels[i * 3] = rgba[i * 4]; //Rpixels[i * 3 + 1] = rgba[i * 4 + 1]; //Gpixels[i * 3 + 2] = rgba[i * 4 + 2]; //B}return pixels;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
第二种方法:
/*** @方法描述 Bitmap转RGB*/public static byte[] getRGBFromBMP(Bitmap bmp) {int w = bmp.getWidth();int h = bmp.getHeight();byte[] pixels = new byte[w * h * 3]; // Allocate for RGBint k = 0;for (int x = 0; x < h; x++) {for (int y = 0; y < w; y++) {int color = bmp.getPixel(y, x);pixels[k * 3] = (byte) Color.red(color);pixels[k * 3 + 1] = (byte) Color.green(color);pixels[k * 3 + 2] = (byte) Color.blue(color);k++;}}return pixels;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
说明
第二种方法应置于子线程中,放在主线程可能造成ANR。建议使用第一种方法,其内部使用了本地方法复制像素值,效率更高更安全。
2、RGB转Bitmap
这个方法是很久之前从网上找到的,具体是哪位兄弟写的已经无从查证,在这里先谢谢这位乐于分享的程序猿兄弟。
* 该方法亲测可用。欢迎大家使用。
/*** @方法描述 将RGB字节数组转换成Bitmap,*/static public Bitmap rgb2Bitmap(byte[] data, int width, int height) {int[] colors = convertByteToColor(data); //取RGB值转换为int数组if (colors == null) {return null;}Bitmap bmp = Bitmap.createBitmap(colors, 0, width, width, height,Bitmap.Config.ARGB_8888);return bmp;}// 将一个byte数转成int// 实现这个函数的目的是为了将byte数当成无符号的变量去转化成intpublic static int convertByteToInt(byte data) {int heightBit = (int) ((data >> 4) & 0x0F);int lowBit = (int) (0x0F & data);return heightBit * 16 + lowBit;}// 将纯RGB数据数组转化成int像素数组public static int[] convertByteToColor(byte[] data) {int size = data.length;if (size == 0) {return null;}int arg = 0;if (size % 3 != 0) {arg = 1;}// 一般RGB字节数组的长度应该是3的倍数,// 不排除有特殊情况,多余的RGB数据用黑色0XFF000000填充int[] color = new int[size / 3 + arg];int red, green, blue;int colorLen = color.length;if (arg == 0) {for (int i = 0; i < colorLen; ++i) {red = convertByteToInt(data[i * 3]);green = convertByteToInt(data[i * 3 + 1]);blue = convertByteToInt(data[i * 3 + 2]);// 获取RGB分量值通过按位或生成int的像素值color[i] = (red << 16) | (green << 8) | blue | 0xFF000000;}} else {for (int i = 0; i < colorLen - 1; ++i) {red = convertByteToInt(data[i * 3]);green = convertByteToInt(data[i * 3 + 1]);blue = convertByteToInt(data[i * 3 + 2]);color[i] = (red << 16) | (green << 8) | blue | 0xFF000000;}color[colorLen - 1] = 0xFF000000;}return color;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
说明
这个方法是使用java实现的,如果需要更高效的速度,可以使用本地方法实现。
好,先这样,有问题随时交流。
RGB和Bitmap互相转换相关推荐
- hsi转rgb公式matlab,rgb与hsi模型转换matlab程序
rgb与hsi模型转换matlab程序 数字图像处理:RGB与HSI模型转换Matlab程序 im1=imread( Fig6.30(01).jpg ); im3=im1; im1=im2double ...
- YUV / RGB 格式及快速转换算法
1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确 ...
- 从 RGB 到 HSV 的转换详细介绍
从RGB 到 HSV 的转换详细介绍 1.RGB RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红.绿.蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和, ...
- rgb到yuv的转换
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 RGB到YUV(4:2:0)的转换 实验目标:实验RGB到YUV 的转换 一.实验原理 二.编程步骤 1.读入rgb分量 2.由RGB ...
- FPGA实现RGB转HSV的转换
FPGA实现RGB转HSV的转换 欢迎添加QQ:2639406604一起交流 1 RGB色彩空间 在图像处理中,最常见的就是RGB色彩模型.在RGB模型中,每种颜色出现在红.绿.蓝的原色光谱分量中.该 ...
- 由RGB到HSV的转换详解
由RGB到HSV的转换详解 1RGB色彩空间 在图像处理中,最常见的就是RGB色彩模型.在RGB模型中,每种颜色出现在红.绿.蓝的原色光谱分量中.该模型基于笛卡尔坐标系.如图1所示,RGB原色值位于3 ...
- 【颜色空间转换大集合】RGB到YIQ,RGB到HSI和HSI到RGB,RGB到YcbCr,RGB到XYZ颜色转换matlab代码的Demo,含详细的解释
废话不说,先上图, 实现方式:matlab 实现功能: 实验目标 了解图像颜色空间的转换关系. 了解图像的文件结构. 实验内容 完成如下颜色空间的转换.(4 Points) RGB -> YIQ ...
- 详解RGB和YUV色彩空间转换
前言 首先指出本文中的RGB指的是非线性RGB,意思就是经过了伽马校正,按照行业规矩应当写成R'G'B',但是为了书写方便,仍写成RGB.关于YUV有多种叫法,分别是YUV,YPbPr,YCbCr.因 ...
- RGB到HSV色彩空间转换表
RGB到HSV色彩空间转换表
最新文章
- 数据中台-阿里巴巴的数据整合、价值发掘、社会赋能之道
- 使用lua实现一个简单的事件派发器
- 《设计师要懂心理学》-第五章-人如何集中注意力
- 处理2D图像和纹理——创建2D菜单界面
- 谈谈数据模型、领域模型、视图模型和命令模型
- html框架设计左侧嵌套,html页面嵌套使用示例(frameset使用方法)
- Quartz 源码解析(一) —— 基本介绍
- mixpanel umeng talkingdata
- UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面
- 国学大师林语堂献宝:英文学习八要诀
- /dev/sr0 3.7G 3.7G 0 100% /media/CentOS_6.8_Final no space left on device磁盘空间不足处理
- 【观察】甲骨文数据库掌门人的“中国情缘”
- 内网如何连接外网,注意!!
- Linux小白进阶之克隆服务器
- 输入电阻值,计算出并联电阻、串联电阻
- android crt证书,android https 抓包,root安装证书
- 数据库sql语句删除指定日期或之前之后的数据
- matlab回归系数 t检验6,MATLAB回归分析如何提取t统计量及其p值
- fpga加载程序慢_FPGA的DONE信号在加载程序后无法拉高 (已解答)
- 基于深度学习的端到端通信系统模型
热门文章
- Linux下开源库的使用(共享库文件头文件配置全局搜索)(WSL)
- 使用JiaoZiVideoPlayer播放网络视频,暂停继续(三)
- 7位号段、运营商、归属地数据爬取与解析
- 9-25模拟赛 By cellur925
- 储能双向变流器(PCS)设备中的电流检测方法
- Real-Time Rendering Fourth Edition 学习笔记之 -- 第一章:介绍
- 当这个类被修饰public的话,为什么源文件名必须要与类名相同
- 搜索引擎提交的登录入口
- Adaptive Autosar通讯层:Skeleton Class
- [html5]离线存储