Рисование масштабированных растровых изображений в SurfaceView - без сглаживания
Извините, если эта тема была представлена ранее, но все мои поиски в Интернете и группах Google не помогли мне.
В настоящее время я разрабатываю небольшую игру с Android SDK и использую растровые изображения в высоком разрешении, которые меняются соответствующим образом, чтобы соответствовать разрешению устройства (позволить системе сделать это для меня недостаточно "чётко").
Я использую SurfaceView, на котором я рисую за один проход холст, заполняя всю поверхность. Краска использует setXfermode(новый PorterDuffXfermode(PorterDuff.Mode.SRC_IN)), чтобы разрешить маскирование. Предварительно я извлекаю различные растровые изображения - которые изменяются при инициализации с помощью createScaledBitmap() и помещаются в кэш - и применяю растровые изображения с краской на этом холсте, прежде чем рисовать этот холст в SurfaceView.
Моя проблема в том, что, что бы я ни старался, какие бы настройки рисования я ни использовал (дизеринг, сглаживание и т. Д.), Растровые изображения с измененным размером не сглаживаются, и на чертеже появляются неровные края. Я перепробовал все. Единственным небольшим успехом, который у меня был, было использование inSampleSize, чтобы приблизиться к желаемому масштабированному размеру и вызвать первый проход сглаживания, прежде чем вызывать createScaledBitmap для извлеченного растрового изображения высокого разрешения, но оно недостаточно красивое. Я просто не могу позволить создавать множество предварительно заданных размеров растровых изображений для каждой комбинации разрешения. Что я упустил?
Заранее большое спасибо
3 ответа
Во-первых, когда вы загружаете свое растровое изображение, вы убедитесь, что не потеряете качество изображения с помощью параметров настройки argb_8888:
Options options = new Options();
options.inScaled = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap pic = BitmapFactory.decodeResource(getResources(), R.id.pic, options);
Когда вы масштабируете растровое изображение, включите фильтр:
pic = Bitmap.createScaledBitmap(pic, screenW, screenH, true);
Однако если изображение слишком сильно растягивается, оно неизбежно ухудшается в качестве.
Когда вы используете краску, вы можете улучшить качество, но потерять скорость, включив дитриг и фильтрацию:
Paint paint = new Paint();
paint.setFlags(Paint.DITHER_FLAG);
paint.setFilterBitmap(true);
Наконец, все окно активности может быть установлено на argb_4444 вместо argb_8888 (OS < 2.3). Вы можете изменить это, если вставите эту строку перед setContentView:
getWindow().setFormat(PixelFormat.RGBA_8888);
Вы можете очистить буфер холста самостоятельно! такие как следующие:
canvas.drawColor(Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR);
Если это сводится к этому, вы можете вручную смазывать без особых проблем. Просто примените простой фильтр нижних частот (что-то вроде среднего значения NxN) к пиксельным данным, прежде чем просить растровый объект изменить масштаб самого себя.