在Android中将位图转换为GrayScale

lep*_*lon 55 android bitmap image-processing grayscale

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

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

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

非常感谢!

lep*_*lon 148

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

  • 必须说,使用RGB_565会使透明区域呈现全黑.在这种情况下,使用Bitmap.Config.ARGB_8888来保持灰度图像的透明度. (14认同)
  • 这不会保留完整的 8 位灰度,而是将其剪辑为 5 或 6 位,并且每个像素消耗 16 位而不是 8 位。差异可能不是很明显,但请检查渐变以查看最坏的情况。 (2认同)
  • 我使用bmpOriginal.getConfig()而不是Config.RGB_565或Config.ARGB_8888 (2认同)

E P*_*lus 18

如果你要显示Bitmap ImageView.然后,您可以尝试下面的代码,而不是将位图转换为灰度.

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

ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
imageview.setColorFilter(filter);
Run Code Online (Sandbox Code Playgroud)

以供参考

  • 这种方法是性能的敌人.我尝试过这个. (2认同)

Ebo*_*ike 14

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

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


小智 14

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

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

  • 你能提供参考吗?API文档[state](http://developer.android.com/reference/android/graphics/Bitmap.html#recycle())"[recycle]是一个高级调用,通常不需要调用,因为正常的GC进程将在没有更多对此位图的引用时释放此内存." (8认同)