Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 以良好的质量和内存效率从资源中缩小位图_Android_Resources_Bitmap_Scale - Fatal编程技术网

Android 以良好的质量和内存效率从资源中缩小位图

Android 以良好的质量和内存效率从资源中缩小位图,android,resources,bitmap,scale,Android,Resources,Bitmap,Scale,我想缩小500x500px资源的比例,使其始终适合由屏幕宽度决定的特定大小 目前我使用的代码来自Android开发者网站(),但质量不如我在ImageView(作为xml源代码)中使用500x500px资源,只是缩放ImageView,而不是位图 但是它很慢,我想缩放位图,以提高内存效率和速度 编辑:我想要缩放的可绘制文件位于我的应用程序的drawable文件夹中 编辑2:我目前的方法 左图为未经任何修改的方法。中心映像是使用@Salman Zaidi提供的方法完成的,只需稍加修改:o.inP

我想缩小500x500px资源的比例,使其始终适合由屏幕宽度决定的特定大小

目前我使用的代码来自Android开发者网站(),但质量不如我在
ImageView
(作为xml源代码)中使用500x500px资源,只是缩放
ImageView
,而不是位图

但是它很慢,我想缩放
位图
,以提高内存效率和速度

编辑:我想要缩放的可绘制文件位于我的应用程序的
drawable
文件夹中

编辑2:我目前的方法

左图为未经任何修改的方法。中心映像是使用@Salman Zaidi提供的方法完成的,只需稍加修改:
o.inPreferredConfig=Config.argb8888
o2.inPreferredConfig=Config.ARGB_8888

右边的图像是一个imageview,其中图像源是用xml定义的,我希望通过缩放位图达到的质量

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”是新宽度(如果图像处于纵向模式)或新高度(如果图像处于横向模式)。您可以设置自己选择的值。。缩放位图不会占用太多内存空间。

检查此培训:


它展示了如何有效地调整位图的大小,inSampleSize参数用于内存优化,同时从资源或内存加载位图。因此,对于您的问题,您应该使用以下内容:

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

inSampleSizelets允许您使用描述步骤缩放位图。比例比为2、4,依此类推。因此,当您使用选项解码时,其中inSampleSize=2从内存加载一个250x250位图,然后将其拉伸到400x400

看起来与我的解决方案类似。另外,我没有文件,我有一个drawable(在R.drawable.xxx中)。。如果您有drawable,那么我建议您将图像保存为sd卡上的文件,然后调整大小。。您无法获取可绘制文件夹和项目的路径。我已经在培训中使用了上述代码。在我看来,它并不完美,它仍然有点模糊。@Leandros我想你会发现这是一个非常好的资源来通读。如果正确使用API,可以根据需要缩放位图。并根据您的需要进行修改(以保持给定区域的最大质量)@doomsnight我读过了。也许我只是不明白如何达到更高的质量。你能帮我吗?没错,这是一个例子,但只要使用得当,你可以将位图缩放到你想要的大小。我用它来调整位图的大小,使之成为缩略图,并且它节省了大量的内存,比如更大的RGB类型ARGB_8888