Android 位图缩放不正确

标签 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.5 倍。

例如,如果您只将 854 x 480 图像资源放在 drawable-hdpi 中,它将在 1281 x 720 的 xhdpi 设备上渲染它。也就是说,Android 会将您的图像放大 1.5 秒。这是正确的行为。您告诉 Android 您的图像将在 hdpi 设备上绘制为 480px 宽。但现在您正在查看更密集的屏幕,更多像素来绘制相同的图像,因此它应该在密度高 1.5 倍的设备上以 720 像素的宽度绘制。

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

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

一般来说,了解 Android 如何通过不同的 drawable-*dpi 桶显示不同密度的显示器,以及“下降”或密度无关像素的概念是很好的。

查看这些 docs on supporting different screens.

关于Android 位图缩放不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17646563/

相关文章:

java - 单击 ListView 中的项目后,它必须转到各自的链接

android - Android 工具栏中的刷新图标现在是否已被弃用( 'swipe to refresh' 是否完全取代了它)?

android - 我如何将颜色转换为位图?

java - 将随机图像设置为imageview android

neo4j - 全局分布式 Neo4j 的架构?

java - 如何缩放文本以适合容器?

android - 返回类型与 FragmentPagerAdapter.getItem(int) 不兼容

Android离线文档不同于在线文档

c++ - 在 Windows C++ 中从 JPG/PNG 文件创建 BITMAPINFO

image - UIButton 在突出显示时忽略 contentMode(adjustsImageWhenHighlighted)