在Android中将位图转换为GrayScale

我是这个网站的新手,我带着一个关于Android的问题。

有没有办法将位图转换为灰度? 我知道如何绘制一个灰度位图(使用canvas操作: http : //www.mail-archive.com/android-developers@googlegroups.com/msg38890.html ),但我真的需要实际位图在灰色(或在最不重要的东西,可能稍后转换为位图)。 我是否必须手工实现它(逐个像素操作)?

我search了很多,但仍然找不到。 任何人都知道一个简单/有效的方法来做到这一点

非常感谢!

这不正是你链接的代码是做什么的? 它需要一个彩色位图(“bmp”),创build一个重复的位图(“bm”),然后使用filter将彩色位图绘制到“bm”中以将其转换为灰度。 从这一点开始,您可以使用“bm”作为实际的灰度位图,并执行您想要的任何操作。

你需要调整一下示例(它使用硬编码的大小,你可能想克隆原始位图的大小),但除此之外,这似乎是准备好使用,因为它得到,这取决于你想要什么。

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

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; } 

任何对此的评论或评论都非常受欢迎。

谢谢

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

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

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

 ColorMatrix matrix = new ColorMatrix(); matrix.setSaturation(0); ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); imageview.setColorFilter(filter); 

以供参考