`
handspeaker
  • 浏览: 64731 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 

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

		Bitmap bitmapOrg = BitmapFactory.decodeByteArray(rawData, 0, rawData.length);
        //Bitmap bitmapOrg = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
		Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true); 
		//Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true);
		if(bitmapNew == null)
			Log.i("TAG", "null");
		Log.i("TAG", "copy end");
        for(int i = 0;i<bitmapNew.getWidth();i++)
        {
      	  for(int j =0;j<bitmapNew.getHeight();j++)
      	  {	
                int col = bitmapNew.getPixel(i, j);
                int alpha = col&0xFF000000;
                int red = (col&0x00FF0000)>>16;
                int green = (col&0x0000FF00)>>8;
                int blue = (col&0x000000FF);
                int gray = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11);
                int newColor = alpha|(gray<<16)|(gray<<8)|gray;
                bitmapNew.setPixel(i, j, newColor);
                //Log.v("tag",  Integer.toHexString(col));  
      	  }
        }
        Log.i("TAG", "pro end");
        sendMsg(bitmapNew);
        File file = new File(Environment.getExternalStorageDirectory()+File.separator+"gray"+number+".jpg");
        OutputStream out;
		try {
			out = new FileOutputStream(file);
			if(bitmapNew.compress(Bitmap.CompressFormat.JPEG, 100, out))
				Log.i("TAG", "success");
			out.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}

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

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics