博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 将ARGB图片转换为灰度图
阅读量:5242 次
发布时间:2019-06-14

本文共 1793 字,大约阅读时间需要 5 分钟。

 

思路如下:

     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上。

 

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

 

Java代码  
  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图。

转载于:https://www.cnblogs.com/h2zZhou/p/5284154.html

你可能感兴趣的文章
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>
redis哨兵集群、docker入门
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>
软件测试——性能测试总结
查看>>
12.4站立会议
查看>>
Java Concurrentmodificationexception异常原因和解决方法
查看>>
客户端访问浏览器的流程
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>