位图drawable(Map Overlay Item)在android中旋转后像素化

时间:2012-10-24 12:11:08

标签: android bitmap drawable itemizedoverlay

我正在尝试旋转叠加drawable以表示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 个答案:

答案 0 :(得分:2)

此代码与我完美配合

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

答案 1 :(得分:0)

您可以尝试使用抗锯齿来应用绘制,但如果它位于位图中的像素,则唯一的机会是过滤并且android有其限制。根据位图,你可能永远无法让它变得非常流畅,我确实尝试了很多,但从来没有找到任何可以让它真正完美的完成

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

过滤器布尔值应为true,这就是你可以为afaik过滤所做的一切

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

在这里你可以应用一个颜色,你可以在这个颜色上试验设置,但是反别名可以在位图的边缘上工作。着色器设置也可能对位图有效,但没有可以修复旋转不准确的着色器

答案 2 :(得分:0)

添加以下内容:     Paint p = new Paint(); p.setAntiAlias(true); p.setDither(true); p.setFilterBitmap(true);

更改以下内容:     tempCanvas.drawBitmap(bmpOriginal, matrix, null); 至:     tempCanvas.drawBitmap(bmpOriginal, matrix, p);