从资源中高质量、高效地缩小位图

3
我想将一个500x500像素的资源缩小到适合屏幕宽度确定的特定大小。
目前,我使用来自Android开发者网站(高效加载大位图)的代码,但质量不如我在ImageView中使用500x500像素的资源(作为xml源)并仅缩放ImageView而不是位图。
但这很慢,我也想缩放Bitmap以实现内存高效和快速。
编辑:我想要缩放的可绘制对象位于我的应用程序的drawable文件夹中。
编辑2:我的当前方法。

enter image description here

左侧的图片是 高效加载大位图 的原始方法,没有作任何修改。中间的图片使用 @Salman Zaidi 提供的方法,并进行了以下小修改:o.inPreferredConfig = Config.ARGB_8888;o2.inPreferredConfig = Config.ARGB_8888;。右侧的图片是一个 ImageView,在 XML 中定义了图片源,并且我想要通过缩放后的位图达到所需的质量。
3个回答

6
private Bitmap decodeImage(File f) {
    Bitmap b = null;
    try {
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        FileInputStream fis = new FileInputStream(f);
        BitmapFactory.decodeStream(fis, null, o);
        fis.close();

        float sc = 0.0f;
        int scale = 1;
        //if image height is greater than width
        if (o.outHeight > o.outWidth) {
            sc = o.outHeight / 400;
            scale = Math.round(sc);
        } 
        //if image width is greater than height
        else {
            sc = o.outWidth / 400;
            scale = Math.round(sc);
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        fis = new FileInputStream(f);
        b = BitmapFactory.decodeStream(fis, null, o2);
        fis.close();
    } catch (IOException e) {
    }
    return b;
}

这里的 '400' 表示缩放后的图片宽度(如果图片是竖屏模式)或高度(如果图片是横屏模式)。您可以根据自己的需要设置值。缩放后的位图不会占用太多内存空间。


看起来和我的解决方案很相似。另外,我没有一个文件,我有一个drawable(在R.drawable.xxx中)。 - Leandros
我曾使用这段代码来调整位图大小...如果您有可绘制的对象,那么我建议您将图像保存为SD卡上的文件,然后再进行调整大小...您无法获取可绘制文件夹和项目的路径。 - Salman Zaidi

3

兄弟们,inSampleSize 参数是用于从资源或内存加载位图时进行内存优化的。因此,针对你的问题,你应该使用以下内容:

Bitmap bmp = BitmapFactory.decode...;
bmp = bmp.createScaledBitmap(bmp, 400, 400, false);

inSampleSize 可以让你使用离散的步长来缩放位图。缩放比例为2、4等等。因此,当您使用带有选项的解码时,其中 inSampleSize=2 时,您可以从内存中加载一个250x250的位图,然后将其拉伸到400x400。


0

我已经按照上面的代码进行了训练。在我看来,它并不完美,还有一些模糊的地方。 - Leandros
@Leandros 我认为你会发现这是一个非常好的资源可以阅读。如果你正确使用API,你可以按需缩放位图。并根据你的需要进行修改(以保持给定区域的最大可能质量)。 - IAmGroot
@Doomsknight 我看过了。也许我不知道如何实现更高的质量。你能帮我吗? - Leandros
确切地说,这只是一个例子,但是如果正确使用,您可以将位图缩放到所需大小。我已经用它来调整位图大小以生成缩略图,并且它可以节省大量内存。 - noni
尝试使用更大的RGB类型,ARGB_8888。http://developer.android.com/reference/android/graphics/Bitmap.Config.html#ARGB_8888 - noni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接