2010-07-30 67 views
45

我是这个网站的新手,我带着一个关于Android的问题。在Android中将位图转换为GrayScale

有什么办法将位图转换为灰度?我知道如何绘制灰度位图(使用画布操作:http://www.mail-archive.com/[email protected]/msg38890.html),但我确实需要灰色的实际位图(或者至少可以稍后转换为位图的位图)。 我是否必须手动实现它(逐个像素的操作)?

我搜索了很多,但仍找不到。任何人都知道一种简单/有效的方式来做到这一点

非常感谢!

+1

参照此问题#1:http://stackoverflow.com/questions/1793338/drawable-grayscale – 2010-07-31 05:58:24

+0

所以转换后它以黑白将图像尺寸缩小? (以kb为单位) – 2014-06-21 07:04:43

回答

15

这不正是你链接到的代码是干什么的?它需要一个彩色位图(“bmp”),创建一个重复的位图(“bm”),然后使用滤镜将该颜色位图绘制到“bm”中以将其转换为灰度。从这一点开始,您可以使用“bm”作为实际的灰度位图,并执行您想要的任何操作。你需要稍微调整一下样本(它使用硬编码的大小,你可能想要克隆原始位图的大小),但除此之外,这似乎是即时可用的,视使用情况而定,取决于你想要的东西。

133

哦,是的,它的确如此。 我错误地使用了它,谢谢指出它给我。 (很抱歉的无用的问题) 下面是结束代码(主要基于一个链接),因为它可以帮助别人:

public Bitmap toGrayscale(Bitmap bmpOriginal) 
{   
    int width, height; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth();  

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(bmpGrayscale); 
    Paint paint = new Paint(); 
    ColorMatrix cm = new ColorMatrix(); 
    cm.setSaturation(0); 
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
    paint.setColorFilter(f); 
    c.drawBitmap(bmpOriginal, 0, 0, paint); 
    return bmpGrayscale; 
} 

任何言论或评论它是非常欢迎的。

谢谢

+1

这并不保留完整的8位灰度,它将其剪辑为5或6位,并且每像素消耗16位而不是8位。差异可能不是非常明显,但检出梯度以查看最坏的情况。 – 2012-08-10 02:49:42

+14

必须说,使用RGB_565会使全透明区域变成黑色。在这种情况下,请使用Bitmap.Config.ARGB_8888在灰度图像上保持透明度。 – IronBlossom 2013-07-09 08:13:01

+0

所以在将它转换成黑白图像后,图像尺寸会减小吗? (以kb为单位) – 2014-06-21 07:04:10

12

我想提一下,用这种方法必须考虑一个重要方面。 Android上的BitMap存储在NativeHeap中。通过“创建位图”,最终会阻塞内存,获得OutOfMemoryException(OOM)。

因此,位图必须始终为.recycled()

+8

你能提供一个参考吗? API文档[state](http://developer.android.com/reference/android/graphics/Bitmap。html#recycle()):“[recycle]是一个高级调用,通常不需要调用,因为当没有更多的引用时,普通的GC进程将释放这个内存。” – Tamlyn 2011-11-02 12:53:18

+1

只有Java对象是GC'd时,GC才会调用recycle()。但是,当虚拟机内存不足时调用GC,而不是响应本机堆上的内存可用性。所以,如果你没有做过那么多的图像工作,如果你可能没有回收利用。但是,如果你做了很多事,如果你没有回收利用,你很快就会遇到麻烦。 – tomwhipple 2012-07-11 23:32:52

11

如果您要在ImageView上显示该位图。然后,而不是转换位图灰度,你可以试试下面的代码:

ColorMatrix matrix = new ColorMatrix(); 
matrix.setSaturation(0); 

ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
imageview.setColorFilter(filter); 

For reference

+2

这种方法是表演的敌人。我尝试过这个。 – 2016-01-15 14:42:51