思路如下:
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图。
分享到:
相关推荐
总之,将RGB彩色图转换为灰度图是Android图像处理中的常见操作,通过简单的数学计算和位操作,我们可以轻松实现这个功能。在Android应用中,结合UI交互,用户可以实时预览转换效果,提供更好的用户体验。
在Android平台上,图片的灰度化处理是一种常见的图像处理技术,它将彩色图像转换为单色调的灰度图像。这个过程涉及到色彩空间的转换,主要从RGB(红绿蓝)色彩模型转换到灰度色彩模型。灰度图像的每个像素只有一个...
图片的灰度处理是图像处理中的基本操作,它将彩色图像转换为单色图像。在OpenCV中,我们可以使用`cvtColor`函数来实现这一转换。假设我们已经有了一个Bitmap对象`bitmap`,我们可以这样做: ```java Mat src = new ...
在Android开发中,图片资源的处理是常见的...通过以上方法,开发者可以灵活地在Android应用中处理各种图像资源,实现不同场景下的需求,如图片缩放、格式转换、灰度化等。这对于提升应用的性能和用户体验具有重要意义。
灰度化,即把彩色图像转换成单色的灰度图像,每个像素由红、绿、蓝(RGB)三原色组成,灰度化的过程就是将这三原色的强度进行加权平均,得到一个新的颜色值,这个新的颜色值就是该像素的灰度值。在标准的RGB色彩空间...
图像灰度化是将彩色图像转换为单色(灰阶)图像的过程,通常用于简化图像分析或减少数据量。 首先,让我们详细了解一下OpenCV在Android上的集成过程。在Android项目中,你需要将OpenCV库导入到工程中。这通常通过...
在Android开发中,图片资源的处理是常见的需求之一,尤其涉及到不同格式间的转换,如Drawable、Bitmap、byte数组以及灰度图像的转换。这些转换在实际应用中具有重要意义,不仅能够优化内存使用,还能实现图像的高效...
总之,"android Tif Tiff格式的图片转换成bitmap 读取TIFF传真格式图片DEMO下载"这个资源提供了一个实用的方法,帮助开发者在Android应用中处理TIF/TIFF格式的图像,通过SeeTiff库实现图片的读取和转换,让Android...
图片去色是将彩色图片转换为灰度图片的过程。在Android中,这可以通过调整颜色矩阵实现。在`toGrayscale()`方法中,创建一个`ColorMatrix`对象并设置饱和度为0,这会使得图像失去所有颜色信息。然后,通过`...
3. **颜色转换**:由于Android默认使用RGB格式进行显示,所以需要将YUV数据转换为RGB。可以使用`Android硬件加速器`(如`renderscript`或`OpenGL ES`)或者手动实现转换算法。 4. **创建Bitmap**:将转换后的RGB数据...
总之,将Android的彩色位图转换为单色位图涉及到位图的加载、配置创建、像素转换以及保存或显示。这个过程需要对Android图形系统有深入的理解,并可能需要用到原生代码来实现1位深度的支持。通过这样的转换,开发者...
本文将深入探讨如何在Android中实现图片的灰度处理和复古风格处理,以及其他可能的图片特效。 首先,让我们来理解灰度处理。灰度图像是一种没有颜色信息的图像,每个像素仅由一个亮度值表示,这个值在0(黑色)到...
4. **黑白效果**:转换图片为黑白可以通过调整像素的ARGB值来实现。遍历每个像素,将颜色通道值转换为灰度值,然后更新像素。也可以使用第三方库,如`Picaso`或`Glide`,它们提供了便捷的滤镜功能。 在实际开发中,...
- **灰度滤镜**:将图像转换为黑白,通过改变不同颜色的灰度值来保持图像的对比度。 4. **OpenGL ES**: 对于复杂的滤镜效果,如实时预览和性能要求高的场景,可以利用OpenGL ES进行图像处理。OpenGL ES提供了一...
1. 基本滤镜:例如灰度滤镜,只需将每个像素的RGB值转换为其平均值;模糊滤镜,通过邻域像素的加权平均实现。 2. 高级滤镜:如边缘检测(Sobel、Canny等)、色彩空间转换(HSV、YUV等)、光照效果、滤波器库...
例如,我们可以将RGB图像转换为灰度图像,以达到黑白效果。 滤镜效果是Android图像处理的常见应用场景。通过Shader类,开发者可以实现各种滤镜,如模糊、锐化、色彩增强等。Shader有多种类型,如LinearGradient、...
例如,灰度特效可以通过计算像素的平均亮度将其转换为灰色。源码可能包含对Bitmap对象的像素数据进行遍历和修改的代码。 2. **模糊特效**:模糊效果可以通过高斯模糊或者快速模糊算法实现。高斯模糊涉及到二维卷积...
这个名为"Android应用源码之100种图片处理效果大全项目"的压缩包中,很可能包含了多种图片处理的示例代码,帮助开发者深入理解和实践Android平台上的图像操作技术。下面,我们将深入探讨其中可能包含的一些关键知识...
接下来,**图片转换为单色图**涉及到图像处理技术。在Android中,可以使用Bitmap类和Canvas进行操作。获取用户选择的图片后,将其解码为Bitmap,然后创建一个新的单色Bitmap。这通常通过遍历原图的每个像素,将其...
本文将深入探讨如何在不依赖JNI(Java Native Interface)的情况下实现Android图片滤镜的代码,尽管这种实现方式可能效率较低,但仍然可以满足基本需求。 首先,我们需要理解图片滤镜的工作原理。滤镜通常是通过...