Android: преобразование цветного изображения в оттенки серого

Я пытаюсь преобразовать цветное изображение в оттенки серого, используя среднее значение красного, зеленого, синего. Но выходит с ошибками.

Вот мой код

imgWidth = myBitmap.getWidth();
imgHeight = myBitmap.getHeight();
                    
for(int i =0;i<imgWidth;i++) {
    for(int j=0;j<imgHeight;j++) {
     int s = myBitmap.getPixel(i, j)/3;
     myBitmap.setPixel(i, j, s);
    }
}
                    
ImageView img = (ImageView)findViewById(R.id.image1);
img.setImageBitmap(myBitmap);

Но когда я запускаю свое приложение на эмуляторе, оно закрывается принудительно. Любая идея?

Я решил свою проблему, используя следующий код:

for(int x = 0; x < width; ++x) {
            for(int y = 0; y < height; ++y) {
                // get one pixel color
                pixel = src.getPixel(x, y);
                // retrieve color of all channels
                A = Color.alpha(pixel);
                R = Color.red(pixel);
                G = Color.green(pixel);
                B = Color.blue(pixel);
                // take conversion up to one single value
                R = G = B = (int)(0.299 * R + 0.587 * G + 0.114 * B);
                // set new pixel color to output bitmap
                bmOut.setPixel(x, y, Color.argb(A, R, G, B));
            }
        }

person Priska Aprilia    schedule 05.12.2011    source источник
comment
Что за ошибка сообщение журнала ошибок.   -  person user370305    schedule 05.12.2011
comment
Вы получаете точную ошибку в журнале? например stackoverflow?   -  person TeaCupApp    schedule 05.12.2011


Ответы (3)


Ты тоже можешь это сделать :

    ColorMatrix matrix = new ColorMatrix();
    matrix.setSaturation(0); 
    imageview.setColorFilter(new ColorMatrixColorFilter(matrix));
person E Player Plus    schedule 29.12.2012
comment
Можно ли сделать только полностью черным (0xff000000) и полностью белым (0xffffffff)? - person android developer; 25.05.2015
comment
@androiddeveloper. Вы можете сделать это с помощью встроенного в ImageView метода setColorFilter (цвет, режим) или обычного PorterDuffColorFilter. developer.android.com/reference/android/graphics/. - person Pkmmte; 13.11.2015
comment
@Pkmmte Что такое обычный PorterDuffColorFilter? - person android developer; 13.11.2015
comment
У меня это не работает. Я устанавливаю изображение в режиме просмотра изображений с помощью imageView.setImageBitmap (). - person binaryKarmic; 19.01.2016
comment
Этот метод более надежен, чем преобразование изображения в Bitmap. - person capt.swag; 26.09.2016

Попробуйте решение из предыдущего ответа leparlon:

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

        Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        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;
    }
person Lalit Poptani    schedule 05.12.2011
comment
Как еще осветлить изображение? Изображение теперь серое, но оно также темное из-за цветов исходного изображения. - person Andrew; 10.09.2013
comment
так что после преобразования в черно-белое изображение уменьшится? (размер в КБ) - person Kalpesh Lakhani; 21.06.2014
comment
Лалит, ты можешь сказать мне, как извлечь характер из изображения в градациях серого? - person Faisal Ashraf; 02.02.2015
comment
Мне нужен код, и вы ответите на мой вопрос, пожалуйста! - person 700 Software; 13.02.2016
comment
Серьезно, ребята, обычно лучше задать новый вопрос вместо того, чтобы комментировать старую беседу. - person 700 Software; 13.02.2016
comment
Я пробую это в Android 10, но получаю исключение. Программный рендеринг не поддерживает аппаратные растровые изображения. Это почему? - person james04; 31.03.2020

У Лалит есть самый практичный ответ. Однако вы хотите, чтобы итоговый серый цвет был средним для красного, зеленого и синего цветов, и вам следует настроить матрицу следующим образом:

    float oneThird = 1/3f;
    float[] mat = new float[]{
            oneThird, oneThird, oneThird, 0, 0, 
            oneThird, oneThird, oneThird, 0, 0, 
            oneThird, oneThird, oneThird, 0, 0, 
            0, 0, 0, 1, 0,};
    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(mat);
    paint.setColorFilter(filter);
    c.drawBitmap(original, 0, 0, paint);

И, наконец, поскольку я уже сталкивался с проблемой преобразования изображения в оттенки серого раньше - наиболее визуально приятный результат во всех случаях достигается не за счет усреднения, а за счет придания каждому цвету разного веса в зависимости от его воспринимаемой яркости, я обычно использую эти значения:

    float[] mat = new float[]{
            0.3f, 0.59f, 0.11f, 0, 0, 
            0.3f, 0.59f, 0.11f, 0, 0, 
            0.3f, 0.59f, 0.11f, 0, 0, 
            0, 0, 0, 1, 0,};
person Jave    schedule 05.12.2011
comment
@ user1324936 хотите уточнить? - person Jave; 26.04.2014