После воспроизведения, я думаю, что ваша проблема связана с манипулированием изображениями в режиме RGB565. Как обсуждалось в этом посте , битовые карты, по-видимому, должны быть в режиме ARGB8888 для правильной манипуляции. Сначала я получил ожидаемый результат для смешанного смешивания, выполнив следующее:
Resources res = getResources();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap base = BitmapFactory.decodeResource(res, R.drawable.base, options);
Bitmap blend = BitmapFactory.decodeResource(res, R.drawable.blend, options);
// now base and blend are in ARGB8888 mode, which is what you want
Bitmap result = base.copy(Config.ARGB_8888, true);
// Continue with IntBuffers as before...
Преобразование растровых изображений в режим ARGB8888, похоже, действительно работает для меня, по крайней мере с тестовыми шаблонами градиента. Однако, если вам нужно только сделать Screen или Multiply, вы также можете попробовать это:
// Same image creation/reading as above, then:
Paint p = new Paint();
p.setXfermode(new PorterDuffXfermode(Mode.MULTIPLY));
p.setShader(new BitmapShader(blend, TileMode.CLAMP, TileMode.CLAMP));
Canvas c = new Canvas();
c.setBitmap(result);
c.drawBitmap(base, 0, 0, null);
c.drawRect(0, 0, base.getWidth(), base.getHeight(), p);
При этом вы не выполняете расчеты для каждого пикселя, но вы ограничены предустановленными PorterDuff.Mode
с. В моем быстром (и грязном) тестировании это был единственный способ заставить смешивание работать с неградиентными изображениями.