博客源址:Android图片缩放总结及比较
博客时间:2011-08-01 17:42
在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;
-
- @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);
-
- /**pic大时(2M+)直接OOM,后面还裁剪个屁啊*/
- Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
- R.drawable.pic);
-
- start=System.currentTimeMillis();
-
-
-
- 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));
-
- stop=System.currentTimeMillis();
-
- theTime+= String.format("\n2 iterative: (%d msec)",
- stop - start);
-
- text.setText(theTime);
- }
-
-
- 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);
-
-
- Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width,
- height, matrix, true);
- return new BitmapDrawable(resizedBitmap);
- }
-
-
- public static Drawable resizeImage2(String path,
- int width,int height)