Intereting Posts
Как сохранить файл на SD-карту Драйвер USB Prestigio Multipad PMP3370B Диспетчер устройств Windows 8.1 теперь показывает устройство ACER, а не устройство Android для Google Nexus 7 Android MotionEvent: узнайте, произошло ли движение за пределами представления Почему RxJava с доработкой на Android doOnError () не работает, но Subscriber onError делает Невозможно нарисовать вершины с осью Z на экране Проблема с интерполяцией панели инструментов с помощью библиотеки поддержки дизайна Android Фон кнопки изменения изображения Android JNI: от кода C до Java и JNI 0% покрытия кода на эспрессо-тестах с помощью JaCoCo и Gradle Удалить ссылку перехода между действиями в инструменте Редактор навигации в Android Studio Как показать воздушный шар над маркером в MapActivity? Разве нет виджета? Преобразование HTML в PDF с помощью iText на Android. Как установить UTF-8 (диакритики)? Безопасное исправление: javax.net.ssl.SSLPeerUnverifiedException: нет однорангового сертификата Можно ли повторно использовать RemoteViews в appWidget, а не создавать новые каждый раз? И как я могу их хранить?

Цвет растровой карты Android, удалить цвет

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

Или просто, я хочу удалить все пиксели одного цвета из растрового изображения. Я havie пробовал каждый colorfilter, и xfermode без везения, есть ли другая возможность удалить цвет другой, который делает это пиксель за пикселем?

Это работает для удаления определенного цвета из растрового изображения. Основная часть – использование AvoidXfermode. Он также должен работать, если вы хотите изменить один цвет на другой цвет.

Я должен добавить, что это отвечает на вопрос об удалении цвета из растрового изображения. Конкретный вопрос, вероятно, лучше решить, используя PorterDuff Xfermode, как сказал OP.

// start with a Bitmap bmp // make a mutable copy and a canvas from this mutable bitmap Bitmap mb = bmp.copy(Bitmap.Config.ARGB_8888, true); Canvas c = new Canvas(mb); // get the int for the colour which needs to be removed Paint p = new Paint(); p.setARGB(255, 255, 0, 0); // ARGB for the color, in this case red int removeColor = p.getColor(); // store this color's int for later use // Next, set the alpha of the paint to transparent so the color can be removed. // This could also be non-transparent and be used to turn one color into another color p.setAlpha(0); // then, set the Xfermode of the pain to AvoidXfermode // removeColor is the color that will be replaced with the pain't color // 0 is the tolerance (in this case, only the color to be removed is targetted) // Mode.TARGET means pixels with color the same as removeColor are drawn on p.setXfermode(new AvoidXfermode(removeColor, 0, AvoidXfermode.Mode.TARGET)); // draw transparent on the "brown" pixels c.drawPaint(p); // mb should now have transparent pixels where they were red before 

Решение user487252 работает как шарм до уровня API 16 (Jelly Bean), после чего AvoidXfermode не работает вообще.

В моем конкретном примере использования я отобрал страницу PDF (через APV PDFView) в пиксельный массив int[] который я собираюсь передать в Bitmap.createBitmap( int[], int, int, Bitmap.Config ) . Эта страница содержит линейное искусство, нарисованное на белом фоне, и мне нужно удалить фон, сохраняя сглаживание.

Я не мог найти режим Porter-Duff, который делал именно то, что я хотел, поэтому я закончил сгибание и повторение через пиксели и преобразование их по одному. Результат был удивительно простым и результативным:

 int [] pixels = ...; for( int i = 0; i < pixels.length; i++ ) { // Invert the red channel as an alpha bitmask for the desired color. pixels[i] = ~( pixels[i] << 8 & 0xFF000000 ) & Color.BLACK; } Bitmap bitmap = Bitmap.createBitmap( pixels, width, height, Bitmap.Config.ARGB_8888 ); 

Это идеально подходит для рисования линейного искусства, поскольку любой цвет может использоваться для линий без потери сглаживания. Я использую красный канал здесь, но вы можете использовать зеленый, сдвинув 16 бит вместо 8 или синий, сдвинув 24 .

Pixel by pixel – неплохой вариант. Просто не вызывайте setPixel внутри цикла. Заполните массив argb ints с помощью getPixels, измените его на месте, если вам не нужно сохранить оригинал, а затем вызовите setPixels в конце. Вы можете делать это поочередно, если память вызывает беспокойство, или вы можете просто сделать все это одним выстрелом. Вам не нужно заполнять целое растровое изображение для вашего оверлейного цвета, так как вы просто выполняете простую замену (если текущий пиксель имеет цвет1, установленный в color2).