Intereting Posts
Как добавить CustomView к моей пользовательской клавиатуре в Android, как GIF-клавиатура Как установить canOverrideExistingModule = true IllegalArgumentException: Не удалось найти корень конфигурации, содержащий xxx на FileProvider.getUriForFile Динамическая ссылка Firebase не открывает приложение Есть ли способ проверить, поддерживает ли Android-устройство openGL ES 2.0? Различия между IPC и ContentProvider для Android Ошибка запроса строки воли при передаче строки с нулевым значением в качестве параметра Точная процедура добавления «jfeinstein10 / SlidingMenu» в проект андроида Изменение ориентации с помощью ViewPager + FragmentPagerAdapter Стиль кнопок дизайна материалов для Android Загрузите файл через HTTP-форму через MultipartEntityBuilder с индикатором выполнения Uses-sdk не может иметь атрибут «tools: node» Android ViewPager с видимыми предыдущими и последующими страницами? 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,};