首先,我們試着往sdcard里放一張400k的圖片,但是分辨率是2560*1600
布局簡單
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.dell.myapplication.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="loading ima" android:id="@+id/button" android:layout_alignParentTop="true" android:layout_centerHorizontal="true"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:layout_below="@+id/button" android:layout_centerHorizontal="true" android:layout_marginTop="213dp"/> </RelativeLayout>
MainActivity
import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { Button mbutton; ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mbutton= (Button) findViewById(R.id.button); mImageView= (ImageView) findViewById(R.id.imageView); mbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Bitmap bitmap= BitmapFactory.decodeFile("/storage/sdcard/test.JPG");//將圖片轉換為bitmap mImageView.setImageBitmap(bitmap); } }); } }
很簡單,設置點擊按鈕開始加載圖片
結果:
報的錯誤:
08-16 21:17:08.410 2947-2947/com.example.dell.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:530)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:303)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:329)
at com.example.dell.myapplication.MainActivity$1.onClick(MainActivity.java:23)
at android.view.View.performClick(View.java:4240)
at android.view.View$PerformClick.run(View.java:17721)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
這時候,你可能會想,天吶,我的圖片明明只有400Kb啊,怎么可能會OutOfMemoryError!!是我的虛擬機太臘雞了嗎?
其實不是這樣
import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { Button mbutton; ImageView mImageView; int screenWidth; int screenHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WindowManager wm= (WindowManager) getSystemService(WINDOW_SERVICE); screenWidth= wm.getDefaultDisplay().getWidth(); screenHeight=wm.getDefaultDisplay().getHeight(); System.out.print("手機寬"+screenWidth+"手機高"+screenHeight); mbutton= (Button) findViewById(R.id.button); mImageView= (ImageView) findViewById(R.id.imageView); mbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //創建bitmap工廠的配置參數 BitmapFactory.Options options=new BitmapFactory.Options(); //返回null,不去真正解析位圖,只是得到寬高等信息 options.inJustDecodeBounds=true; BitmapFactory.decodeFile("/storage/sdcard/test.JPG",options); int imgWidth=options.outWidth; int imgHeight=options.outHeight; System.out.print("圖片寬"+imgWidth+"圖片高"+imgHeight); // 計算縮放比 int scale=1; int scalex=imgWidth/screenWidth; int scaley=imgHeight/screenHeight; scale=scalex>scaley?scalex:scaley; //按照縮放比顯示圖片 options.inSampleSize=scale; //開始真正解析位圖 options.inJustDecodeBounds=false; Bitmap bitmap=BitmapFactory.decodeFile("/storage/sdcard/test.JPG",options); mImageView.setImageBitmap(bitmap); } }); } }

打印結果:
08-16 22:03:22.542 9790-9790/com.example.dell.myapplication I/System.out: 手機寬320手機高480
08-16 22:03:38.432 9790-9790/com.example.dell.myapplication I/System.out: 圖片寬2560圖片高1600