Android BitmapFactory.decodeFile返回的图像比原始图像大

Android BitmapFactory.decodeFile返回的图像比原始图像大,android,image,bitmap,Android,Image,Bitmap,我是Android编程新手。我试图使用BitmapFactory.decodeFile(imagePath)将设备sd卡上的图像显示在ImageView上。我可以从sd卡上很好地读取图像,然后按。虽然有一件事我不能理解,为什么返回的位图比原始大小大很多?原始图像大小为84.32KB,我得到的位图大小为4.096MB。我试图加载具有图像高度和宽度的位图,即1280x800。如果我用下面的方法缩小图像的宽度和高度,我会得到缩小的尺寸。但是为什么我不能在位图中加载原始大小、实际宽度和高度的图像呢 方法

我是Android编程新手。我试图使用
BitmapFactory.decodeFile(imagePath)
将设备sd卡上的图像显示在
ImageView
上。我可以从sd卡上很好地读取图像,然后按。虽然有一件事我不能理解,为什么返回的位图比原始大小大很多?原始图像大小为84.32KB,我得到的位图大小为4.096MB。我试图加载具有图像高度和宽度的位图,即1280x800。如果我用下面的方法缩小图像的宽度和高度,我会得到缩小的尺寸。但是为什么我不能在位图中加载原始大小、实际宽度和高度的图像呢

方法decodeSampledBitmap():


磁盘上映像的大小与内存中映像的大小关系不大。PNG、JPEG和GIF图像在磁盘上压缩。在内存中,它们是未压缩的。

磁盘上映像的大小与内存中映像的大小关系不大。PNG、JPEG和GIF图像在磁盘上压缩。在内存中,它们是未压缩的。

“原始图像大小为84.32 kb”-您如何确定这一点?例如,这是磁盘上映像的大小吗?“我得到的位图大小为4.096 mb”--你是如何确定的?是的,磁盘上的大小为84.32 kb,我得到的位图大小为:bitmap.getByteCount()方法。“原始图像大小为84.32 kb”--你是如何确定的?例如,这是磁盘上映像的大小吗?“我得到的位图大小为4.096MB”--你是如何确定的?是的,磁盘上的大小为84.32KB,我得到的位图大小是使用:bitmap.getByteCount()方法得到的。因此,这意味着要得到合理大小的位图,我必须减小其宽度和高度?那么如何将其放置在占屏幕50%的imageview中(例如)?如果我设置了Imageview的宽度和高度,那么它将拉伸位图Imageview使用Imageview的“scaleType”。@user305223:Um,“屏幕的50%”只会偶尔与图像的原始尺寸匹配。此外,请记住,有几千种Android设备型号,屏幕分辨率各不相同。因此,即使使用
1
inSampleSize
加载图像,也会出现同样的问题。正如Sonngayth所指出的,当图像尺寸和
ImageView
尺寸不同时,在
ImageView
上使用
android:scaleType
来控制如何将图像加载到其中。这意味着要获得合理大小的位图,我必须减小其宽度和高度吗?那么如何将其放置在占屏幕50%的imageview中(例如)?如果我设置了Imageview的宽度和高度,那么它将拉伸位图Imageview使用Imageview的“scaleType”。@user305223:Um,“屏幕的50%”只会偶尔与图像的原始尺寸匹配。此外,请记住,有几千种Android设备型号,屏幕分辨率各不相同。因此,即使使用
1
inSampleSize
加载图像,也会出现同样的问题。正如Sonngayth所指出的,当图像尺寸和
ImageView
尺寸不相同时,在
ImageView
上使用
android:scaleType
来控制如何将图像加载到其中。
public static Bitmap decodeSampledBitmap(String path,
                                                     int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    //BitmapFactory.decodeResource(res, resId, options);
    BitmapFactory.decodeFile(path, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    //return BitmapFactory.decodeResource(res, resId, options);

    return BitmapFactory.decodeFile(path, options);
}