思路如下:
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图。
分享到:
相关推荐
argb1555转bmp图片
本文将详细介绍Android-如何将RGB彩色图转换为灰度图方法,需要了解更多的朋友可以参考下
易语言RGB与ARGB转换源码,RGB与ARGB转换,RGB,ARGB,RGB2ARGB,ARGB2RGB
ARGB颜色调制转换工具,根据具体颜色A、R、G、B四个值,显示颜色,并可以手动调整颜色效果重新获取ARGB值。
RGB与ARGB转换.rar
写android免不了和color打交道 调色也就成了很烦人的一项工作 最近一怒之下在网上找到了个converter 希望能帮到大家
注:Qt自带的QImage只能导入8位深的tiff灰度图,如果用qt的QImage导入16位深的灰度图,图像数据会被强制转换成argb格式的图像,数据就被更改了,所以我自己编写一个解析tiff文件的功能,我翻阅了很多博客,其中如下...
YUV ARGB 转换代码
ARGB转换16进制tools
易语言RGB与ARGB转换源码例程程序根据RGB和ARGB颜色值的结构组成,实现RGB与ARGB转换。
易语言源码易语言RGB与ARGB转换源码.rar
Visual Studio 2008编写,支持更高版本编译器,C#语言。 ARGB与16进制颜色相互转换。 ARGB与16进制颜色预览显示。
透明效果的显示,,ARGB的色彩显示,基于Qt4
gen_argb8888.py实现将当前目录下所有png图片转为argb8888格式 gen_argb8888_v2.py实现将当前目录下所有png图片和子目录转为argb8888格式
android调用摄像头拍照,并将ARGB8888转为RGB565,两种格式 都可以显示,还包括本地图片处理
*将RGB转换为YUV420P * *码术 codemanship *http://blog.csdn.net/codemanship *微信公众号: codemanship *本程序实现了RGB像素数据转换为YUV像素数据 *是最简单的FFmpeg视频编码方面的教程。 *通过学习本例子可以...
android平台jpeg数据流转换成rgb直接显示的so库 使用方式: byte[] jpegRaw = V4L2Camera.decode(dataBuf, ret); rgb2Buffer(jpegRaw, WIDTH, HEIGHT, rgbBuffer); ByteBuffer jpegBuffer = ByteBuffer.wrap(rgb...
ARGB 交织 转换为 平面的Y 表格表示思路