Java 在Android中裁剪并调整图像大小

Java 在Android中裁剪并调整图像大小,java,android,image,bitmap,Java,Android,Image,Bitmap,我正在从磁盘读取图像,并将其显示在列表视图中的一行中。图像文件大于行的ImageView中需要显示的内容。由于我需要在RAM中缓存位图,以便更快地访问,因此我希望它们的大小与图像视图s(85x85 dip)一样大 现在我正在阅读文件中的 位图=BitmapFactory.decodeFile(文件) ImageView负责对其进行缩放和裁剪 android:scaleType=“中心裁剪” 好吧,这会将整个位图保存在内存中(因为我将其缓存为XD),这很糟糕 如何在加载文件时从ImageView中

我正在从磁盘读取图像,并将其显示在
列表视图中的一行中。图像文件大于行的
ImageView
中需要显示的内容。由于我需要在RAM中缓存
位图
,以便更快地访问,因此我希望它们的大小与
图像视图
s(85x85 dip)一样大

现在我正在阅读文件中的

位图=BitmapFactory.decodeFile(文件)

ImageView负责对其进行缩放和裁剪

android:scaleType=“中心裁剪”

好吧,这会将整个位图保存在内存中(因为我将其缓存为XD),这很糟糕


如何在加载文件时从ImageView中删除此职责并进行裁剪+缩放?所有位图将以85x85倾角显示,并且需要为“中心裁剪”

您可以在加载、裁剪和缩放之前找到图片的尺寸:


BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;

    Bitmap bmo = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
然后将其加载到样本大小:


...
options.inSampleSize = 1/2;
bmo = BitmapFactory.decodeFile(file.getAbsolutePath(), options);

...
 = Bitmap.createScaledBitmap(bmo, dW, dH, false);
别忘了回收临时位图,否则你会得到OOME


bmo.recycle();

我试图避免像这样积极地分配和释放内存。此外,您的
inSampleSize
在此示例中没有执行任何操作。它需要设置为>1才能执行任何操作,最好是2的幂。对于我的裁剪,我仍然希望自己来做,而不是让
ImageView
来做,否则我会浪费内存。如果你有自己的ListAdapter,可以在中设置视图的位图getView@Phyrum茶好吧,我还没有找到任何关于手动收割的信息,所以我想我不得不让
ImageView
来处理这个问题。如果我要这样做,那么我可以在第一个位图上使用getHeight()和getWidth()来计算缩放位图的正确方式。@Phyrum Tea还有一个问题,为什么要设置
inJustDecodeBounds
?根据我读到的,它分配内存,而不是实际的位图。这为什么有用?打电话或其他什么会更快吗?它只是读取图片以确定其尺寸,这样我们就可以决定使用什么样的样本大小来获取图片。如果您在ImageView中没有最终的图片,可以使用更简单的默认图片,大小合适。它不需要扩展。如果从XML中膨胀listrow,您可以自己处理最终图像。