Как рисовать и масштабировать растровое изображение на холсте с помощью бикубической интерполяции в Android?

Я хочу нарисовать растровое изображение на холсте с большим размером, чем он есть. Я могу использовать холст.drawBitmap (bitmap, null, destRect, null); но это дает низкое качество, так как результат пикселируется, если исходное изображение меньше целевого прямоугольника.

Как я могу нарисовать свое растровое изображение с помощью билинейной или бикубической повторной выборки?

любая помощь будет оценили, спасибо.

2 ответов


вам нужно установить флаг FILTER_BITMAP_FLAG в вашей краске.

canvas.drawBitmap(bitmap, matrix, null); //ugly jaggies unless scale is 1:1, but fast

или

Paint paint = new Paint();
paint.setFilterBitmap();
canvas.drawBitmap(bitmap, matrix, paint); // pretty but slower (not too slow, usually)

то же самое относится к другим (синтаксические) формы drawBitmap метод.

для большинства параметров рисования Android нет документации, и нет документации для базовой родной библиотеки Skia, которая выполняет рендеринг. Я был бы счастлив, если бы они были. Вы можете искать исходный код Skia в Google Code Search. Поиск Skia и покопайтесь в первичном источнике; это единственная документация.


FILTER_BITMAP_FLAG не работает для масштабирования в большинстве случаев.

хороший алгоритм масштабирования (не ближайший сосед) состоит всего из 2 шагов (плюс расчет точного Ректа для урожая входных / выходных изображений):

  1. downscale с помощью BitmapFactory.Параметры:: inSampleSize - >BitmapFactory.decodeResource() как можно ближе к разрешению, которое вам нужно, но не меньше, чем это
  2. получить точную разрешение путем уменьшения масштаба немного с помощью холст::drawBitmap()

вот подробное объяснение того, как SonyMobile решил эту задачу: http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/

вот исходный код utils масштаба SonyMobile: http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/