Возможность рисования растрового изображения (элемент наложения карты) пикселизируется после поворота в 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);

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


person MSaudi    schedule 24.10.2012    source источник


Ответы (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);
person MSaudi    schedule 05.11.2012
comment
Если кому-то еще интересно, lock.getDirection() — это число градусов для поворота (например, 90 означает поворот вправо на 90 градусов). - person Chris Rae; 30.01.2013

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

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

логическое значение фильтра должно быть истинным, это все, что вы можете сделать для фильтрации.

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

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

person NikkyD    schedule 24.10.2012
comment
Что такое фильтрация? вы имеете в виду применение сглаживания к true ? Я сделал это без изменений. изменение растрового изображения на другое может помочь? - person MSaudi; 24.10.2012

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

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

person user2371025    schedule 10.05.2013