Android图像缩放以支持多种分辨率

时间:2012-09-19 21:30:16

标签: android image scaling

我已将游戏编码为320x480,我认为支持多种分辨率的最简单方法是缩放最终图像。你对此有何看法?这样做会有效率吗?

我将所有图像放在mdpi文件夹中,我将它在屏幕上展开到缓冲区,然后缩放以适应屏幕。所有用户输入也将被缩放。

我有这两个问题: - 如何在没有android自动缩放的情况下绘制位图 - 你如何缩放位图?

2 个答案:

答案 0 :(得分:3)

我在我的项目中多次偶然发现同样的问题,每次由于时间不够(和懒惰),我会对一个不太理想的解决方案感到满意。但最近我找到了一些时间来打击这个特殊问题。这是我的解决方案,我希望它对你也有所帮助。

Bitmap scaleWithAspectRatio(Bitmap image)
        {
            int imaheVerticalAspectRatio,imageHorizontalAspectRatio;
            float bestFitScalingFactor=0;
            float percesionValue=(float) 0.2;

            //getAspect Ratio of Image
            int imageHeight=(int) (Math.ceil((double) image.getHeight()/100)*100);
            int imageWidth=(int) (Math.ceil((double) image.getWidth()/100)*100);
            int GCD=BigInteger.valueOf(imageHeight).gcd(BigInteger.valueOf(imageWidth)).intValue();
            imaheVerticalAspectRatio=imageHeight/GCD;
            imageHorizontalAspectRatio=imageWidth/GCD;
            Log.i("scaleDownLargeImageWIthAspectRatio","Image Dimensions(W:H): "+imageWidth+":"+imageHeight);
            Log.i("scaleDownLargeImageWIthAspectRatio","Image AspectRatio(W:H): "+imageHorizontalAspectRatio+":"+imaheVerticalAspectRatio);

            //getContainer Dimensions
            int displayWidth = getWindowManager().getDefaultDisplay().getWidth();
            int displayHeight = getWindowManager().getDefaultDisplay().getHeight();
           //I wanted to show the image to fit the entire device, as a best case. So my ccontainer dimensions were displayWidth & displayHeight. For your case, you will need to fetch container dimensions at run time or you can pass static values to these two parameters 

            int leftMargin = 0;
            int rightMargin = 0;
            int topMargin = 0;
            int bottomMargin = 0;
            int containerWidth = displayWidth - (leftMargin + rightMargin);
            int containerHeight = displayHeight - (topMargin + bottomMargin);
            Log.i("scaleDownLargeImageWIthAspectRatio","Container dimensions(W:H): "+containerWidth+":"+containerHeight);

            //iterate to get bestFitScaleFactor per constraints
            while((imageHorizontalAspectRatio*bestFitScalingFactor <= containerWidth) && 
                    (imaheVerticalAspectRatio*bestFitScalingFactor<= containerHeight))
            {
                bestFitScalingFactor+=percesionValue;
            }

            //return bestFit bitmap
            int bestFitHeight=(int) (imaheVerticalAspectRatio*bestFitScalingFactor);
            int bestFitWidth=(int) (imageHorizontalAspectRatio*bestFitScalingFactor);
            Log.i("scaleDownLargeImageWIthAspectRatio","bestFitScalingFactor: "+bestFitScalingFactor);
            Log.i("scaleDownLargeImageWIthAspectRatio","bestFitOutPutDimesions(W:H): "+bestFitWidth+":"+bestFitHeight);
            image=Bitmap.createScaledBitmap(image, bestFitWidth,bestFitHeight, true);

            //Position the bitmap centre of the container
            int leftPadding=(containerWidth-image.getWidth())/2;
            int topPadding=(containerHeight-image.getHeight())/2;
            Bitmap backDrop=Bitmap.createBitmap(containerWidth, containerHeight, Bitmap.Config.RGB_565);
            Canvas can = new Canvas(backDrop);
            can.drawBitmap(image, leftPadding, topPadding, null);

            return backDrop;
        }

答案 1 :(得分:0)

我正在制作游戏,我的目标是1280x800,并且我已经制作了所有符合该分辨率的图像。我第一次启动游戏时,我将所有图像缩小以匹配当前分辨率,并使用缩放图像来实际绘制游戏。如果您使用的是SurfaceView,则在绘制图像时不应该出现缩放图像的问题。只是为了100%确定我将我的图像保存在原始目录中并从那里加载它们。

要对位图进行初始缩放,只需在解码位图时使用BitmapFactory.Options,告诉它目标的密度以及实际显示的密度。