1

我在这里尝试通过编写以下方法将当前位图转换为黑白位图。但是由于每个像素的 for 循环,转换需要很长时间。我在哪里错了吗?还是有其他方法可以做到这一点?..帮助将不胜感激。谢谢。

我的代码:

public Bitmap convert(Bitmap src) {
       final double GS_RED = 0.299;
        final double GS_GREEN = 0.587;
        final double GS_BLUE = 0.114;
        int A, R, G, B;
        final int width = src.getWidth();
        final int height = src.getHeight();

        int pixels[] = new int[width * height];
        int k = 0;
        Bitmap bitmap = Bitmap.createBitmap(width, height, src.getConfig());
        src.getPixels(pixels, 0, width, 0, 0, width, height);
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int pixel = pixels[x + y * width];
                A = Color.alpha(pixel);
                R = Color.red(pixel);
                G = Color.green(pixel);
                B = Color.blue(pixel);
                R = G = B = (int) (GS_RED * R + GS_GREEN * G + GS_BLUE * B);
                pixels[x + y * width] = Color.argb(
                        A, R, G, B);
            }
        }

        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
}
4

1 回答 1

3

您可以使用此方法轻松地将 rgb 图像转换为灰度图像,而无需遍历所有像素

public Bitmap toGrayscale(Bitmap bmp)
{        
    int originalwidth, originalheight;
    originalheight = bmp.getHeight();
    originalwidth = bmp.getWidth();    

    Bitmap bmpGrayscale = Bitmap.createBitmap(originalwidth, originalheight, 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(bmp, 0, 0, paint);
    return bmpGrayscale;
}
于 2017-12-20T12:01:09.467 回答