Рисование масштабированных растровых изображений на SurfaceView - без сглаживания - PullRequest
4 голосов
/ 22 мая 2011

Извините, если эта тема уже была поднята, но все мои поиски в Интернете и в группах Google мне не помогли.

В настоящее время я разрабатываю небольшую игру с Android SDK и использую растровые изображения высокого разрешения, которые меняю соответственно, чтобы соответствовать разрешению устройства (позволить системе сделать это для меня недостаточно "хрустящий").

Я использую SurfaceView, на котором я рисую за один проход холст, заполняя всю поверхность. Краска использует setXfermode (новый PorterDuffXfermode (PorterDuff.Mode.SRC_IN)), чтобы разрешить маскирование. Предварительно я извлекаю различные растровые изображения - которые изменяются при инициализации с помощью createScaledBitmap () и помещаются в кеш - и применяю растровые изображения с краской на этом холсте, прежде чем рисовать этот холст в SurfaceView.

Моя проблема в том, что, что бы я ни старался, какие бы настройки рисования я ни использовал (дизеринг, сглаживание и т. Д.), Растровые изображения с измененным размером не сглаживаются, и на чертеже появляются неровные края. Я перепробовал все. Единственным небольшим успехом, который у меня был, было использование inSampleSize, чтобы приблизиться к желаемому масштабированному размеру и вызвать первый проход сглаживания, прежде чем вызывать createScaledBitmap для извлеченного растровое изображение высокого разрешения, но оно недостаточно красивое. Я просто не могу позволить создавать множество предварительно заданных размеров растровых изображений для каждой комбинации разрешения. Что я упустил ?

Заранее большое спасибо

Ответы [ 3 ]

1 голос
/ 22 мая 2011

Сначала при загрузке своего растрового изображения убедитесь, что вы не потеряете качество изображения, установив параметры 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: </p>

getWindow().setFormat(PixelFormat.RGBA_8888); 
0 голосов
/ 18 июля 2013

Вы можете очистить буфер холста самостоятельно!такие как:

canvas.drawColor(Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR);
0 голосов
/ 02 июня 2011

Если все сводится к этому, вы можете вручную смазывать без особых проблем. Просто примените простой фильтр нижних частот (что-то вроде среднего значения NxN) к данным пикселей перед тем, как просить растровый объект изменить масштаб самого себя.

...