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

voj3qocg  于 2023-04-28  发布在  Android
关注(0)|答案(2)|浏览(104)

我是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错误而崩溃或简单地减慢应用程序。请为我介绍一下这个可怜的人,那里的Maven。

yeotifhr

yeotifhr1#

当您在/res/drawable/res/drawable-mdpi文件夹中有一个图像,并且您在具有xxxhdpi密度的设备上调用BitmapFactory.decodeResource()时,BitmapFactory将为您放大位图,以便当您在xxxhdpi屏幕上显示它时,它看起来与在较低密度屏幕上相同。
如果你真的不想看到这种情况发生,请将图像放在/res/drawable-nodpi文件夹中。然后,它将在每个平台上以相同的大小进行解码。但是,当你在不同密度的设备上显示图像时,图像看起来会有很大的不同。

vtwuwzda

vtwuwzda2#

BitmapFactory.decodeResource可以接受类型为BitmapFactory.Options的第三个参数opts
您可以设置选项以显式阻止任何缩放:

val options = BitmapFactory.Options().apply {
                    inScaled = false
                }

并使用此附加参数更新您的调用,如下所示:

val bitmap: Bitmap = BitmapFactory.decodeResource(
                        getResources(),
                        R.drawable.background1, 
                        options)

当您从bitmap请求widthheight时,它将返回true to file值,没有任何缩放。

相关问题