BitmapFactory getWidth()getHeight()和实际图片大小的像素不同

时间:2016-08-03 07:43:03

标签: android android-bitmap

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

我遇到的问题如下。当我在drawable文件夹下插入尺寸为(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          |
|                                     |
|-------------------------------------|             

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

1 个答案:

答案 0 :(得分:1)

如果您在/res/drawable/res/drawable-mdpi文件夹中有图片,并且您在密度为BitmapFactory.decodeResource()的设备上致电xxxhdpi,则BitmapFactory会向上扩展您的位图,以便在xxxhdpi屏幕上显示时,它看起来与低密度屏幕上的相同。

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