在Android中将位图转换为GrayScale

问题描述 投票:50回答:5

我是这个网站的新手,我提出了一个关于Android的问题。

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

我搜索了很多,但仍然找不到。谁知道一个简单/有效的方法呢?

非常感谢!

android image-processing bitmap grayscale
5个回答
14
投票

这与您链接的代码不完全相同吗?它采用颜色位图(“bmp”),创建重复的位图(“bm”),然后使用滤镜将颜色位图绘制为“bm”,将其转换为灰度。从那时起,您可以使用“bm”作为实际的灰度位图,并执行您想要做的任何事情。

您需要稍微调整一下示例(它使用硬编码的大小,您可能只想克隆原始位图的大小),但除此之外,这似乎是随时可用的,取决于你想要的。


143
投票

哦,是的,确实如此。我使用它错了,谢谢你指出我。 (抱歉无用的问题)这是最终代码(很大程度上基于链接的一个),因为它可以帮助某人:

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

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

谢谢


17
投票

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

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

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

For reference


12
投票

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

因此,位图必须始终是qazxsw poi。


0
投票

这是一种更有效的方法,我支持所有版本的Android:

.recycled()
© www.soinside.com 2019 - 2024. All rights reserved.