加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Android图片缩放概括及比较

发布时间:2021-11-25 19:31:45 所属栏目:教程 来源:互联网
导读:在Android中对大图片进行缩放真的很不尽如人意,不知道是不是我的方法不对。下面我列出3种对图片缩放的方法,并给出相应速度。请高人指教。 第一种是BitmapFactory和BitmapFactory.Options。 首先,BitmapFactory.Options有几个Fields很有用: inJustDecodeB

在Android中对大图片进行缩放真的很不尽如人意,不知道是不是我的方法不对。下面我列出3种对图片缩放的方法,并给出相应速度。请高人指教。
 
第一种是BitmapFactory和BitmapFactory.Options。
首先,BitmapFactory.Options有几个Fields很有用:
inJustDecodeBounds:If set to true, the decoder will return null (no bitmap), but the out...
也就是说,当inJustDecodeBounds设成true时,bitmap并不加载到内存,这样效率很高哦。而这时,你可以获得bitmap的高、宽等信息。
outHeight:The resulting height of the bitmap, set independent of the state of inJustDecodeBounds.
outWidth:The resulting width of the bitmap, set independent of the state of inJustDecodeBounds.
看到了吧,上面3个变量是相关联的哦。
inSampleSize : If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory.
这就是用来做缩放比的。这里有个技巧:
inSampleSize=(outHeight/Height+outWidth/Width)/2
实践证明,这样缩放出来的图片还是很好的。
最后用BitmapFactory.decodeFile(path, options)生成。
由于只是对bitmap加载到内存一次,所以效率比较高。解析速度快。
 
第二种是使用Bitmap加Matrix来缩放。
首先要获得原bitmap,再从原bitmap的基础上生成新图片。这样效率很低。
 
第三种是用2.2新加的类ThumbnailUtils来做。
让我们新看看这个类,从API中来看,此类就三个静态方法:createVideoThumbnail、extractThumbnail(Bitmap source, int width, int height, int options)、extractThumbnail(Bitmap source, int width, int height)。
我这里使用了第三个方法。再看看它的源码,下面会附上。是上面我们用到的BitmapFactory.Options和Matrix等经过人家一阵加工而成。
效率好像比第二种方法高一点点。
 
下面是我的例子:
 
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >  
      
<ImageView  
    android:id="@+id/imageShow"  
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
/>     
<ImageView  
    android:id="@+id/image2"  
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
/>    
<TextView    
    android:id="@+id/text"  
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    android:text="@string/hello"  
    />  
</LinearLayout>  
 
 
package com.linc.ResolvePicture;  
  
import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
  
import android.app.Activity;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Matrix;  
import android.graphics.drawable.BitmapDrawable;  
import android.graphics.drawable.Drawable;  
import android.media.ThumbnailUtils;  
import android.os.Bundle;  
import android.util.Log;  
import android.widget.ImageView;  
import android.widget.TextView;  
  
public class ResolvePicture extends Activity {  
    private static String tag="ResolvePicture";  
    Drawable bmImg;    
    ImageView imView;   
    ImageView imView2;   
    TextView text;  
    String theTime;  
    long start, stop;   
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        text=(TextView)findViewById(R.id.text);  
          
        imView=(ImageView) findViewById(R.id.imageShow);  
        imView2=(ImageView) findViewById(R.id.image2);  
          
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),     
                R.drawable.pic);  
          
        start=System.currentTimeMillis();  
          
//        imView.setImageDrawable(resizeImage(bitmap, 300, 100));    
          
        imView2.setImageDrawable(resizeImage2("/sdcard/2.jpeg", 200, 100));   
          
        stop=System.currentTimeMillis();  
          
        String theTime= String.format("n1 iterative: (%d msec)",    
                stop - start);    
          
        start=System.currentTimeMillis();  
        imView.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap,200,100));//2.2才加进来的新类,简单易用   
//        imView.setImageDrawable(resizeImage(bitmap, 30, 30));    
        stop=System.currentTimeMillis();  
          
         theTime+= String.format("n2 iterative: (%d msec)",    
                stop - start);   
          
        text.setText(theTime);  
    }  
      
    //使用Bitmap加Matrix来缩放   
    public static Drawable resizeImage(Bitmap bitmap, int w, int h)   
    {    
        Bitmap BitmapOrg = bitmap;    
        int width = BitmapOrg.getWidth();    
        int height = BitmapOrg.getHeight();    
        int newWidth = w;    
        int newHeight = h;    
  
        float scaleWidth = ((float) newWidth) / width;    
        float scaleHeight = ((float) newHeight) / height;    
  
        Matrix matrix = new Matrix();    
        matrix.postScale(scaleWidth, scaleHeight);    
        // if you want to rotate the Bitmap      
        // matrix.postRotate(45);      
        Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width,    
                        height, matrix, true);    
        return new BitmapDrawable(resizedBitmap);    
    }  
      
    //使用BitmapFactory.Options的inSampleSize参数来缩放   
    public static Drawable resizeImage2(String path,  
            int width,int height)   
    {  
        BitmapFactory.Options options = new BitmapFactory.Options();  
        options.inJustDecodeBounds = true;//不加载bitmap到内存中   
        BitmapFactory.decodeFile(path,options);   
        int outWidth = options.outWidth;  
        int outHeight = options.outHeight;  
        options.inDither = false;  
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;  
        options.inSampleSize = 1;  
          
        if (outWidth != 0 && outHeight != 0 && width != 0 && height != 0)   
        {  
            int sampleSize=(outWidth/width+outHeight/height)/2;  
            Log.d(tag, "sampleSize = " + sampleSize);  
            options.inSampleSize = sampleSize;  
        }  
      
        options.inJustDecodeBounds = false;  
        return new BitmapDrawable(BitmapFactory.decodeFile(path, options));       
    }  
  
    //图片保存   
    private void saveThePicture(Bitmap bitmap)  
    {  
        File file=new File("/sdcard/2.jpeg");  
        try  
        {  
            FileOutputStream fos=new FileOutputStream(file);  
            if(bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos))  
            {  
                fos.flush();  
                fos.close();  
            }  
        }  
        catch(FileNotFoundException e1)  
        {  
            e1.printStackTrace();  
        }  
        catch(IOException e2)  
        {  
            e2.printStackTrace();  
        }  
    }  

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读