Растровое растягиваемое (Map Overlay Item) пикселируется после поворота в Android
Я пытаюсь повернуть наложенное изображение, чтобы представить элемент наложения в Android.
Я использую это:
Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.map_pin);
Bitmap targetBitmap = Bitmap.createBitmap((bmpOriginal.getWidth()),
(bmpOriginal.getHeight()),
Bitmap.Config.ARGB_8888);
Matrix matrix = new Matrix();
matrix.setRotate((float) lock.getDirection(),(float) (bmpOriginal.getWidth()/2),
(float)(bmpOriginal.getHeight()/2));
Canvas tempCanvas = new Canvas(targetBitmap);
tempCanvas.drawBitmap(bmpOriginal, matrix, null);
Drawable d = new BitmapDrawable(getResources(),targetBitmap);
//overlayitem.setMarker(drawable);
mapItemizedOverlay =
new MyItemizedOverlay<MyItemizedOverlayItem>(d, mapView);
Проблема в том, что качество изображения ухудшается. Пикселизация происходит. Любое решение?
3 ответа
Этот код отлично работал со мной
Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.map_pin);
Bitmap targetBitmap = Bitmap.createBitmap((bmpOriginal.getWidth()),
(bmpOriginal.getHeight()),
Bitmap.Config.ARGB_8888);
Paint p = new Paint();
p.setAntiAlias(true);
p.setDither(true);
p.setFilterBitmap(true);
Matrix matrix = new Matrix();
matrix.setRotate((float) lock.getDirection(),(float) (bmpOriginal.getWidth()/2),
(float)(bmpOriginal.getHeight()/2));
RectF rectF = new RectF(0, 0, bmpOriginal.getWidth(), bmpOriginal.getHeight());
matrix.mapRect(rectF);
targetBitmap = Bitmap.createBitmap((int)rectF.width(), (int)rectF.height(), Bitmap.Config.ARGB_8888);
Canvas tempCanvas = new Canvas(targetBitmap);
tempCanvas.drawBitmap(bmpOriginal, matrix, p);
Вы могли бы попытаться применить краску с сглаживанием, но если это примерно пиксели в пределах растрового изображения, единственный шанс - фильтрация, и у андроида есть свои пределы. В зависимости от растрового изображения вы никогда не сможете получить его действительно гладким, я много пробовал, но так и не нашел ничего, что дало бы ему действительно хороший конец
public static Bitmap createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)
логический фильтр должен быть истинным, вот и все, что вы можете сделать для фильтрации afaik
void android.graphics.Canvas.drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)
здесь вы можете применить краску, вы можете поэкспериментировать с настройками этой краски, но сглаживание будет работать по краям растрового изображения. Настройки шейдеров также могут работать на растровом изображении, но нет шейдеров, которые могли бы исправить неточность вращения
Добавьте следующее: Paint p = new Paint();
p.setAntiAlias(true);
p.setDither(true);
p.setFilterBitmap(true);
изменить следующее: tempCanvas.drawBitmap(bmpOriginal, matrix, null);
чтобы: tempCanvas.drawBitmap(bmpOriginal, matrix, p);