Intereting Posts
В чем разница между «? Android:» и «@android:» в файле xml-файла для android? Как включить масштабирование Android? Как отобразить текст с двухцветным фоном? ГоризонтальныйScrollView в ScrollView Touch Handling Отключение экранного сна Программно в Android? Recyclerview внутри просмотра прокрутки влияет на положение прокрутки Как изменить вид макета виджета программно Лучший способ присоединиться к таблицам с использованием sqlite в android Прозрачный прокси для тестирования ответов сервера офлайн на Android Разница между версиями подписей – V1 (подпись Jar) и V2 (полная подпись APK) при генерации подписанного apk в AndroidStudio? Android – используйте внешний профиль в панели уведомлений, например Facebook Android Не разрешено загружать локальный ресурс: file: /// android_asset Android Studio 2.1 Ошибка преобразования байт-кода в dex Может ли Android поддерживать dp менее 1dp? Включить службы определения местоположения для Android, если пользователь не выбрал параметр «Никогда»

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

Solutions Collecting From Web of "Android: преобразование цветного изображения в оттенки серого"

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

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

Попробуйте решение из этого предыдущего ответа 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; } 

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

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