Растровое растягиваемое (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);

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