Android Bitmap缩放不正确

时间:2013-07-15 03:58:50

标签: android bitmap scaling

我有一个尺寸为854 x 480的背景资源(我的测试手机的确切屏幕分辨率)。当我将此资源加载到我的应用程序时,它会按比例缩放。我在这里搜索并尝试了一些建议,但由于一些疯狂的原因,它不会扩展到适当的大小。

由于资源与屏幕大小相同,我不确定为什么它会增加后台资源的大小。它将它扩展到1281 x 720,我不知道为什么。

转换发生的代码是:

public Sprite newSpriteLargeResource(Resources res, SpriteFormat format,
        int resId, int reqWidth, int reqHeight) {

    Options options = new Options();

    options.inJustDecodeBounds = true;

    Bitmap bitmap = null;

    options.inSampleSize = calculateSample(options, reqWidth, reqHeight);
    options.inJustDecodeBounds = false;

    bitmap = BitmapFactory.decodeResource(res, resId, options);

    Matrix m = new Matrix();
    RectF inRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
    RectF outRect = new RectF(0, 0, reqWidth, reqHeight);
    boolean scaled;
    scaled = m.setRectToRect(inRect, outRect, Matrix.ScaleToFit.CENTER);
    if (scaled) {
        float[] bmpValues = new float[9];
        m.getValues(bmpValues);
        Bitmap.createScaledBitmap(bitmap,
                (int) ((bitmap.getWidth() * bmpValues[0])),
                (int) ((bitmap.getHeight() * bmpValues[4])), true);
    }else{
        Bitmap.createScaledBitmap(bitmap, reqWidth, reqHeight, true);
    }


    return new AndroidSprite(bitmap, format);
}

private int calculateSample(Options options, int reqWidth, int reqHeight) {
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {


        final int heightRatio = Math.round((float) height
                / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);


        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }

    return inSampleSize;

}

您可能会注意到缩放的多个版本。我保持这样的代码的唯一原因是为了表明我已经尝试了多个版本的缩放,并且所有这些都没有像我希望的那样工作。我知道问题出在这两种方法的某处,因为我有另一种非背景资源的方法,它们工作正常。我使用这个的唯一原因是对于较大的图像文件,以避免出现内存不足的情况。

1 个答案:

答案 0 :(得分:1)

您的资源是什么drawable文件夹?听起来就像你将图像资源放在一个太低的密度桶中。因为错误的尺寸恰好是所需尺寸的1.5倍。

例如,如果您只将854 x 480图像资源放在drawable-hdpi中,它将在1240 x 720的xhdpi设备上呈现它。即Android会将图像缩放1.5s。这是正确的行为。您告诉Android,您的图像将在hdpi设备上绘制为480px宽。但是现在你正在观看一个更密集的屏幕,更多的像素来绘制相同的图像,所以它应该在一个1.5倍密度的设备上以720px的宽度绘制。

如果将图像放在更高密度的存储桶中,则应该具有正确的行为。

执行此操作的正确方法是为每个存储桶提供图像。

一般来说,通过不同的drawable- * dpi存储桶以及“dips”或“Density Independent Pixels”的概念,了解Android如何针对不同密度显示进行显示是很好的。

请参阅这些docs on supporting different screens.