思路如下:

1.读取or照相,得到一张ARGB图片。

2.转化为bitmap类,并对其数据做如下操作:

A通道保持不变,然后逐像素计算:X = 0.3×R+0.59×G+0.11×B,并使这个像素的值新R,G,B值为X,即:

new_R = X, new_G = X, new_B = X

例如:原来一个像素是4个byte,分别为ARGB,现在这个像素应该为AXXX。

3.将上一步骤得到的bitmap图像写到输出流里面,并保存为图片。或者直接显示在ImageView上。

代码片段如下(注意,直接复制到工程里可能会有错误):

  1. Bitmap bitmapOrg = BitmapFactory.decodeByteArray(rawData, 0, rawData.length);
  2. //Bitmap bitmapOrg = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
  3. Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true);
  4. //Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true);
  5. if(bitmapNew == null)
  6. Log.i("TAG", "null");
  7. Log.i("TAG", "copy end");
  8. for(int i = 0;i<bitmapNew.getWidth();i++)
  9. {
  10. for(int j =0;j<bitmapNew.getHeight();j++)
  11. {
  12. int col = bitmapNew.getPixel(i, j);
  13. int alpha = col&0xFF000000;
  14. int red = (col&0x00FF0000)>>16;
  15. int green = (col&0x0000FF00)>>8;
  16. int blue = (col&0x000000FF);
  17. int gray = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11);
  18. int newColor = alpha|(gray<<16)|(gray<<8)|gray;
  19. bitmapNew.setPixel(i, j, newColor);
  20. //Log.v("tag",  Integer.toHexString(col));
  21. }
  22. }
  23. Log.i("TAG", "pro end");
  24. sendMsg(bitmapNew);
  25. File file = new File(Environment.getExternalStorageDirectory()+File.separator+"gray"+number+".jpg");
  26. OutputStream out;
  27. try {
  28. out = new FileOutputStream(file);
  29. if(bitmapNew.compress(Bitmap.CompressFormat.JPEG, 100, out))
  30. Log.i("TAG", "success");
  31. out.close();
  32. } catch (FileNotFoundException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. } catch (IOException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. }

注意,这种直接对bitmap图像的逐像素处理非常费时,所以最好开辟一个新的线程来做这类操作。

另外,有一个Bitmap.config里面有一个alpha8设置,经过实践证明,这个设置不好使,在保存时选择这个设置,无论是保存图片还是现实图片,都会失败。

想直接保存成单通道的灰度图也不行,android不支持,所以即使是灰度图,实际上也是4通道的ARGB图。

Android 将ARGB图片转换为灰度图的更多相关文章

  1. 机器学习进阶-图像基本处理-视频的读取与处理 1.cv2.VideoCapture(视频的载入) 2.vc.isOpened(载入的视频是否可以打开) 3.vc.read(视频中一张图片的读取) 4.cv2.cvtColor(将图片转换为灰度图)

    1.vc = cv2.VideoCapture('test.mp4') #进行视频的载入 2.vc.isOpened() # 判断载入的视频是否可以打开 3.ret, frame = vc.read( ...

  2. 如何使用 python3 将RGB 图片转换为 灰度图

    首先,介绍第一种方法, 使用  PIL  库,   PIL库是一种python语言常用的一个图形处理库. 关于   PIL  库的安装本文就不介绍了. from PIL import Image I ...

  3. C# (灰度)加权平均法将图片转换为灰度图

    private Bitmap ToG(string file) { using (Bitmap o = new Bitmap(file)) { Bitmap g = new Bitmap(o.Widt ...

  4. [Xcode 实际操作]六、媒体与动画-(2)使用图形上下文转换图片为灰度图

    目录:[Swift]Xcode实际操作 本文将演示如何将图片转换为灰度图. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...

  5. Android-将RGB彩色图转换为灰度图

    package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...

  6. c语言实现BMP图像转换为灰度图

    当初是自己要装X,非要用c来写信息隐藏作业,装了X,就得付出实践.查了好久资料,到期末才把作业交了,这里总结一下. 这道题是将真彩图转换为灰度图. 关于BMP文件结构,这是困扰了我好久的问题,上网查了 ...

  7. 从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中

    //从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #inclu ...

  8. Qt 中彩色图像转换为灰度图

    近期在做几个图像处理相关的项目.里面有一个操作就是须要先将彩色图像转换为灰度图像. QImage 有一个convertToFormat方法.最開始一直用这个函数来实现. 可是今天细致看了看,发现这个函 ...

  9. 【Python开发】python PIL读取图像转换为灰度图及另存为其它格式(也可批量改格式)

    例如有一幅图,文件名为"a.jpg'.  读取: from PIL import Image #或直接import Image im = Image.open('a.jpg') 将图片转换成 ...

随机推荐

  1. Django REST Framework JWT提供的登录签发的视图

    Django REST Framework JWT提供了一个视图.在我们登录的时候,会校验用户名.密码是否正确.如果信息无误,可以返回一个JWT token.就可以简单地实现了记录用户登录状态. 用法 ...

  2. linux命令(8):du命令

    du –ah:查看文件列表大小 du –sh:查看所有文件的大小总和

  3. hive学习(一)hive架构及hive3.1.1三种方式部署安装

    1.hive简介 logo 是一个身体像蜜蜂,头是大象的家伙,相当可爱. Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据.它架构在Hadoop之上,总归为大数据,并使得查询和分析方便 ...

  4. DevExpress控件-GridControl根据条件改变单元格(Dev GridControl 单元格着色)

    DevExpress控件-GridControl根据条件改变单元格颜色,如下图: 解决办法:可以参考:http://www.cnblogs.com/zeroone/p/4311191.html 第一步 ...

  5. [转载] login shell和non-login shell

    原文地址:这里. 在linux中我们知道当你输入一条命令的时候,命令的查找是根据环境变量PATH来查找的,如果想知道一个命令的源文件存放在什么地方可以用which或whereis指令.那么PATH变量 ...

  6. python中global变量释疑

    疑问 为什么main中不能写global x语句? 在函数中如何修改global变量? 在main中修改了global变量后,在子进程中为什么没有效果? 如何利用进程池的initializer参数(函 ...

  7. SEO如何写好文章标题

    近一半网民只看标题不点内容,许多网站有个标题和内容摘要,而这个摘要基本概括了整篇新闻的大致内容,所以的互联网信息泛滥的今天,看标题看摘要成了最快阅读新闻资讯的一种有效方式. 如何写好标题?我一直愁这事 ...

  8. 架构设计之NodeJS操作消息队列RabbitMQ

    一. 什么是消息队列? 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象. 消息队列(Message Queue)是一种应用间的通信 ...

  9. webpack配置点记录

    jsx语法需要用到babel-preset-react: 通用babel-loader相关如下: 以上配置还只能针对ES6情况,static defaultProps是ES7的特性,需要引入新的配置:

  10. 一个菜鸟正在用SSH写一个论坛(2)

    额 一不小心又一个多月没有写过随笔了. 这次是在某次启动服务器的时候报错了: 严重: Exception starting filter struts2 Unable to load configur ...