BitmapFactory getWidth() getHeight() 与实际图片尺寸像素不同

BitmapFactory getWidth() getHeight() and pixels from actual picture size differ

我是 Android Studio 的新手,在与 BitmapFactory 相关的任务中,我特别困惑。

我遇到的问题如下。当我在可绘制文件夹下插入一个尺寸为 (578x496) 的 jpg 文件时,我这样做

Bitmap mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.background1));
Log.e("WIDTH", String.valueOf(mBitmap.getWidth());
Log.e("HEIGHT", String.valueOf(mBitmap.getHeight());

我得到的是(2312x1984)尺寸,比实际尺寸整整x4倍。是因为我的文件格式是jpg而不是png吗?

所以我决定做的是

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.background1,options));

然后通过

将其设置为我的 SurfaceView 的背景
public class GamePanel extends SurfaceView implements SurfaceHolder.Callback {
   public static final int WIDTH=578;
   public static final int HEIGHT=496;
   ....
   @Override
   public void draw(Canvas canvas){
    final int scaleXFactor = getWidth()/WIDTH;
    final int scaleYFactor = getHeight()/HEIGHT;

    if(canvas!=null){
        final int savedState = canvas.save();
        canvas.scale(scaleXFactor,scaleYFactor);
        bg.draw(canvas);
        canvas.restoreToCount(savedState);
    }

}

但是这个 canvas.scale(scaleXFactor,scaleYFactor) 只允许背景适合水平而非垂直。所以就像

--------------------------------------    
|                IMG                  |
|                                     |
|-------------------------------------|   <-Viewed as "Landscape"
|         Black Empty Screen          |
|                                     |
|-------------------------------------|             

到目前为止,我的理解是位图在 Android Studio 制作的任何类型的应用程序中都是非常重要的概念,如果未正确实现,它会导致应用程序因 OOM 错误而崩溃或简单地降低应用程序的速度.请让我了解一下这个可怜的人,那里的专家。

当您在 /res/drawable/res/drawable-mdpi 文件夹中有图像,并且您在具有 xxxhdpi 密度的设备上调用 BitmapFactory.decodeResource() 时,BitmapFactory 将缩放为您调高位图,这样当您在 xxxhdpi 屏幕上显示它时,它看起来与在低密度屏幕上的比例相同。

如果您决定确实不希望发生这种情况,请将图像放在/res/drawable-nodpi 文件夹中。然后它将在每个平台上以相同的大小解码。但是,当您显示图像时,图像在不同密度的设备上看起来会非常不同。