【问题标题】:Crop and resize an image in Android在 Android 中裁剪和调整图像大小
【发布时间】:2011-06-02 13:04:13
【问题描述】:

我正在从磁盘读取图像并将其显示在ListView 的一行中。图像文件大于行的ImageView 内需要显示的文件。由于我需要在 RAM 中缓存 bitmaps 以便更快地访问,我希望它们仅与 ImageViews 一样大(85x85 dip)

现在我正在使用

读取文件

位图 = BitmapFactory.decodeFile(file);

ImageView 负责缩放和裁剪

android:scaleType="centerCrop"

AFAIK 这会将整个位图保存在内存中(因为我缓存了它 XD),这很糟糕

如何从 ImageView 中删除此责任并在加载文件时进行裁剪 + 缩放?所有位图将以 85x85 dip 显示,并且需要为 'centerCrop'

【问题讨论】:

    标签: java android image bitmap


    【解决方案1】:

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

    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 的幂。developer.android.com/reference/android/graphics/… 对于我的裁剪,我仍然想自己做而不是让ImageView 做,否则我在浪费内存。
    • 如果有自己的ListAdapter,可以在getView中设置视图的Bitmap
    • @Phyrum Tea 好吧,我还没有找到任何关于手动裁剪的信息,所以我想我不得不让ImageView 处理这个问题。如果我要这样做,那么我可以在第一个位图上使用 getHeight() 和 getWidth() 来计算缩放位图的正确方法。
    • @Phyrum Tea 还有一个问题,你为什么要设置inJustDecodeBounds?从我读过的内容来看,它分配内存而不是实际的位图。为什么这很有用?是不是打电话比较快?
    • 它只是读取图片以找出它的尺寸,因此我们可以决定使用什么样本大小来获取我们的图片。如果您在 ImageView 中没有最终图片,则可能是更简单的默认图片,尺寸合适。它不必扩展。如果您从 XML 扩充列表行,您可以自己处理最终图像。
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多