【问题标题】:Bitmap drawable (Map Overlay Item) pixelizes after rotation in android位图可绘制(地图叠加项)在android中旋转后像素化
【发布时间】:2012-10-14 11:27:48
【问题描述】:

我正在尝试旋转覆盖可绘制对象以表示 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);

问题是图像质量变差了。像素化发生。有什么解决办法吗?

【问题讨论】:

    标签: android bitmap drawable itemizedoverlay


    【解决方案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);
    

    【讨论】:

    • 如果其他人想知道,lock.getDirection() 是旋转的度数(例如,90 表示向右旋转 90 度)。
    【解决方案2】:

    您可以尝试应用具有抗锯齿功能的绘画,但如果它与位图中的像素有关,则唯一的机会是过滤,并且 android 有其限制。根据位图,您可能永远无法使其真正平滑,我确实尝试了很多,但从未找到任何可以让它真正完成的东西

    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)
    

    您可以在此处应用绘画,您可以在此绘画上尝试设置,但抗锯齿将在位图的边缘起作用。着色器设置可能也适用于位图,但没有可以修复旋转不准确的着色器

    【讨论】:

    • 什么是过滤?你的意思是对 true 应用抗锯齿?我没有改变就这样做了。将位图更改为另一个可能有帮助吗?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多