Меняем местами два цвета
- private static void swapTwoChannels(Bitmap bitmap, int oneCh, int twoCh) {
- ArrayList<int[]> sort = new ArrayList<int[]>();
- int width = bitmap.getWidth();
- int height = bitmap.getHeight();
- int[] pixels = new int[width * height];
- bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
- int one[] = new int[2]; // сдвиг и количество цвета первого канала
- int two[] = new int[2]; // второго
- int three[] = new int[2];// третьего
- /* считаем битовые сдвиги */
- one[0] = oneCh == Color.RED ? 16 : oneCh == Color.GREEN ? 8 : 0;
- two[0] = twoCh == Color.RED ? 16 : twoCh == Color.GREEN ? 8 : 0;
- three[0] = 24 - (one[0] + two[0]);
- /* сортируем от большего сдвига к меньшему */
- sort.add(0, one[0] == 16 ? one : two[0] == 16 ? two : three);
- sort.add(1, one[0] == 8 ? one : two[0] == 8 ? two : three);
- sort.add(2, one[0] == 0 ? one : two[0] == 0 ? two : three);
- int pixel, tmp;
- for (int i = 0; i < pixels.length; i++) {
- pixel = pixels[i];
- one[1] = (pixel >> one[0]) & 0xFF; // кол. цвета первого канала
- two[1] = (pixel >> two[0]) & 0xFF; //второго
- three[1] = (pixel >> three[0]) & 0xFF;//третьего
- /* меняем каналы местами */
- tmp = one[1];
- one[1] = two[1];
- two[1] = tmp;
- /* устанавливаем полученый цвет */
- pixels[i] = (pixel & 0xFF000000) | (sort.get(0)[1] << 16) | (sort.get(1)[1] << 8) | sort.get(2)[1];
- }
- bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
- }
Параметры:
bitmap - изображение, которое нужно изменить (mutable);
oneCh - канал, который нужно поменять (Color.RED или Color.GREEN или Color.BLUE);
twoCh - второй канал.
Пример:
swapTwoChannels(bitmap, Color.BLUE, Color.RED)
http://dbwap.ru/202802.png
bitmap - изображение, которое нужно изменить (mutable);
oneCh - канал, который нужно поменять (Color.RED или Color.GREEN или Color.BLUE);
twoCh - второй канал.
Пример:
swapTwoChannels(bitmap, Color.BLUE, Color.RED)
http://dbwap.ru/202802.png