Растровый чертеж (элемент Overlay Map) пикселируется после вращения в 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);

Проблема заключается в том, что качество изображения ухудшается. Пикселизация происходит. Любое решение?

Ответ 1

Этот код отлично работал со мной

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);

Ответ 2

Вы можете попытаться применить краску с антиалиасингом, но если ее пиксели в растровом изображении имеют единственный шанс, и у него есть ограничения. В зависимости от растрового изображения вы, возможно, никогда не сможете получить его по-настоящему гладко, я много пробовал, но не нашел ничего, что дало бы ему приятный финиш.

public static Bitmap createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter) 

фильтр boolean должен быть истинным, это все, что вы можете сделать для фильтрации afaik

void android.graphics.Canvas.drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)

здесь вы можете применить краску, вы можете поэкспериментировать с настройками на этой краске, но анти-псевдоним будет работать на краях растрового изображения. Настройки шейдера могут работать и с растровым изображением, но нет шейдеров, которые могут исправить погрешность вращения

Ответ 3

Добавьте следующее:   Paint p = new Paint(); p.setAntiAlias(true); p.setDither(true); p.setFilterBitmap(true);

измените следующее:   tempCanvas.drawBitmap(bmpOriginal, matrix, null); чтобы:   tempCanvas.drawBitmap(bmpOriginal, matrix, p);