RGB和Bitmap互相转换

2017年05月09日 21:48:44

阅读数:2619

之前做人脸识别的时候遇到一个问题,把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互相转换相关推荐

  1. hsi转rgb公式matlab,rgb与hsi模型转换matlab程序

    rgb与hsi模型转换matlab程序 数字图像处理:RGB与HSI模型转换Matlab程序 im1=imread( Fig6.30(01).jpg ); im3=im1; im1=im2double ...

  2. YUV / RGB 格式及快速转换算法

    1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确 ...

  3. 从 RGB 到 HSV 的转换详细介绍

    从RGB 到 HSV 的转换详细介绍 1.RGB RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红.绿.蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和, ...

  4. rgb到yuv的转换

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 RGB到YUV(4:2:0)的转换 实验目标:实验RGB到YUV 的转换 一.实验原理 二.编程步骤 1.读入rgb分量 2.由RGB ...

  5. FPGA实现RGB转HSV的转换

    FPGA实现RGB转HSV的转换 欢迎添加QQ:2639406604一起交流 1 RGB色彩空间 在图像处理中,最常见的就是RGB色彩模型.在RGB模型中,每种颜色出现在红.绿.蓝的原色光谱分量中.该 ...

  6. 由RGB到HSV的转换详解

    由RGB到HSV的转换详解 1RGB色彩空间 在图像处理中,最常见的就是RGB色彩模型.在RGB模型中,每种颜色出现在红.绿.蓝的原色光谱分量中.该模型基于笛卡尔坐标系.如图1所示,RGB原色值位于3 ...

  7. 【颜色空间转换大集合】RGB到YIQ,RGB到HSI和HSI到RGB,RGB到YcbCr,RGB到XYZ颜色转换matlab代码的Demo,含详细的解释

    废话不说,先上图, 实现方式:matlab 实现功能: 实验目标 了解图像颜色空间的转换关系. 了解图像的文件结构. 实验内容 完成如下颜色空间的转换.(4 Points) RGB -> YIQ ...

  8. 详解RGB和YUV色彩空间转换

    前言 首先指出本文中的RGB指的是非线性RGB,意思就是经过了伽马校正,按照行业规矩应当写成R'G'B',但是为了书写方便,仍写成RGB.关于YUV有多种叫法,分别是YUV,YPbPr,YCbCr.因 ...

  9. RGB到HSV色彩空间转换表

    RGB到HSV色彩空间转换表

最新文章

  1. 数据中台-阿里巴巴的数据整合、价值发掘、社会赋能之道
  2. 使用lua实现一个简单的事件派发器
  3. 《设计师要懂心理学》-第五章-人如何集中注意力
  4. 处理2D图像和纹理——创建2D菜单界面
  5. 谈谈数据模型、领域模型、视图模型和命令模型
  6. html框架设计左侧嵌套,html页面嵌套使用示例(frameset使用方法)
  7. Quartz 源码解析(一) —— 基本介绍
  8. mixpanel umeng talkingdata
  9. UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面
  10. 国学大师林语堂献宝:英文学习八要诀
  11. /dev/sr0 3.7G 3.7G 0 100% /media/CentOS_6.8_Final no space left on device磁盘空间不足处理
  12. 【观察】甲骨文数据库掌门人的“中国情缘”
  13. 内网如何连接外网,注意!!
  14. Linux小白进阶之克隆服务器
  15. 输入电阻值,计算出并联电阻、串联电阻
  16. android crt证书,android https 抓包,root安装证书
  17. 数据库sql语句删除指定日期或之前之后的数据
  18. matlab回归系数 t检验6,MATLAB回归分析如何提取t统计量及其p值
  19. fpga加载程序慢_FPGA的DONE信号在加载程序后无法拉高 (已解答)
  20. 基于深度学习的端到端通信系统模型

热门文章

  1. Linux下开源库的使用(共享库文件头文件配置全局搜索)(WSL)
  2. 使用JiaoZiVideoPlayer播放网络视频,暂停继续(三)
  3. 7位号段、运营商、归属地数据爬取与解析
  4. 9-25模拟赛 By cellur925
  5. 储能双向变流器(PCS)设备中的电流检测方法
  6. Real-Time Rendering Fourth Edition 学习笔记之 -- 第一章:介绍
  7. 当这个类被修饰public的话,为什么源文件名必须要与类名相同
  8. 搜索引擎提交的登录入口
  9. Adaptive Autosar通讯层:Skeleton Class
  10. [html5]离线存储