zoukankan      html  css  js  c++  java
  • Android 将ARGB图片转换为灰度图

     

    思路如下:

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

  • 相关阅读:
    c#使用selenium过滑动验证码
    C#构建数据类型不同的链表
    【疑难杂症】c#控制台应用程序卡输出
    只需三步,轻松体验office2019
    一文搞定C#.Net如何调用/交互Javascript
    逆向某微信小程序参数签名算法
    win10 IIS疑难杂症--处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”
    一台手机如何在微信语音/视频通话时把声音录下来
    android端日志查看调试利器Logcat Reader
    [开源]安卓调试神器-获取最上层Activity:TopActivity
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/5284154.html
Copyright © 2011-2022 走看看