Рисование масштабированных растровых изображений в 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) к пиксельным данным, прежде чем просить растровый объект изменить масштаб самого себя.

Другие вопросы по тегам