Меняем местами два цвета

  1. private static void swapTwoChannels(Bitmap bitmap, int oneCh, int twoCh) {
  2.         ArrayList<int[]> sort = new ArrayList<int[]>();
  3.         int width = bitmap.getWidth();
  4.         int height = bitmap.getHeight();
  5.         int[] pixels = new int[width * height];
  6.         bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
  7.         int one[] = new int[2];  // сдвиг и количество цвета первого канала
  8.         int two[] = new int[2];  // второго
  9.         int three[] = new int[2];// третьего
  10.         /* считаем битовые сдвиги */
  11.         one[0] = oneCh == Color.RED ? 16 : oneCh == Color.GREEN ? 8 : 0;
  12.         two[0] = twoCh == Color.RED ? 16 : twoCh == Color.GREEN ? 8 : 0;
  13.         three[0] = 24 - (one[0] + two[0]);
  14.         /* сортируем от большего сдвига к меньшему */
  15.         sort.add(0, one[0] == 16 ? one : two[0] == 16 ? two : three);
  16.         sort.add(1, one[0] == 8  ? one : two[0] == 8  ? two : three);
  17.         sort.add(2, one[0] == 0  ? one : two[0] == 0  ? two : three);
  18.         int pixel, tmp;
  19.         for (int i = 0; i < pixels.length; i++) {
  20.                 pixel = pixels[i];
  21.                 one[1] = (pixel >> one[0]) & 0xFF;    // кол. цвета первого канала
  22.                 two[1] = (pixel >> two[0]) & 0xFF;    //второго
  23.                 three[1] = (pixel >> three[0]) & 0xFF;//третьего
  24.                 /* меняем каналы местами */
  25.                 tmp = one[1];
  26.                 one[1] = two[1];
  27.                 two[1] = tmp;
  28.                 /* устанавливаем полученый цвет */
  29.                 pixels[i] = (pixel & 0xFF000000) | (sort.get(0)[1] <<  16) | (sort.get(1)[1] <<  8) | sort.get(2)[1];
  30.         }
  31.  
  32.         bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
  33. }
Параметры:
  bitmap - изображение, которое нужно изменить (mutable);
  oneCh - канал, который нужно поменять (Color.RED или Color.GREEN или Color.BLUE);
  twoCh - второй канал.

Пример:
swapTwoChannels(bitmap, Color.BLUE, Color.RED)

http://dbwap.ru/202802.png

Реклама

Мы в соцсетях

tw tg yt gt