Android 實現(xiàn)加載大圖片的方法
項目簡介:
該項目為加載大圖片
詳細介紹:
對于超大的圖片,如果不縮放的話,容易導致內(nèi)存溢出。而經(jīng)過處理后,無論多大的圖片,都能夠在手機屏幕上加載出來,不會導致內(nèi)存溢出。當然,臉黑的除外
該應用涉及到的知識有:
- 1.Bitmap的使用
- 2.Android手機中加載圖片的原理
有的時候,我們加載一張不足1M的圖片,盡管手機的堆內(nèi)存有16M,仍然會導致內(nèi)存溢出,why?
這就更計算機加載圖片的原理有關(guān)了:
1).手機會解析圖片的所有像素信息,把每個像素信息都存入到內(nèi)存中
2).Android中保存圖片是用ARGB保存的,A表示阿爾法透明度,所以一個像素點占用了4個字節(jié)
例如:一張1080*720像素的24位位圖圖片,可能實際上經(jīng)過壓縮后大小只有幾十K,而在android手機加載這張圖片所需要的內(nèi)存大小為:
1080*720*(3+1)=3110400 byte = 3037 KB = 2.9MB
實際上,圖片中還包含一點其他的信息,例如圖片保存的格式,使用的相機名稱,以及拍攝時間等,所以總體來說要比3110400字節(jié)大一旦,大概多上幾十個字節(jié)
步驟:
1.創(chuàng)建一個Android項目,編寫布局文件:
<LinearLayout 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:orientation="vertical" tools:context="hhh.exercise.smultimedia_a_image.MainActivity" > <EditText android:id="@+id/ed" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="a.jpg" android:textColor="#00ff00" android:textSize="30sp" /> <requestFocus /> <Button android:onClick="see" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="點擊看片" android:textColor="#00ffff" android:textSize="30sp" /> <ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:src="@drawable/ic_launcher" /> </LinearLayout>
界面如下所示:

2.在MainActivity中編寫代碼:
public class MainActivity extends Activity {
private EditText ed;
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed = (EditText) findViewById(R.id.ed);
iv = (ImageView) findViewById(R.id.iv);
}
public void see(View view) {
// 確定要加載的圖片(這里為了調(diào)試方面,把所有的圖片都放在SD卡中,然后在界面上輸入圖片的名字,根據(jù)給名字拼接字符串)
String fileName = ed.getText().toString();
String path = Environment.getExternalStorageDirectory().getPath()+ "/" + fileName;
// 該類為位圖工廠(BitmapFactory)的內(nèi)部類,用來封裝參數(shù)對象
Options opts = new Options();
// 不為像素申請內(nèi)存,只獲取圖片的寬、高信息
// inJustDecodeBound該字段設置為true,那么位圖工廠構(gòu)建BitMap對象時返回的是空值,但是會把圖片的一些信息返回在Options對象中(如圖片的寬、高等)
opts.inJustDecodeBounds = true;
// 第二個參數(shù)是解析圖片時傳入的參數(shù),由于可能傳入的參數(shù)過多,所以直接把所有參數(shù)封裝成一個對象
BitmapFactory.decodeFile(path, opts);
// 獲取圖片的額寬高
int imgWidth = opts.outWidth;
int imgHeight = opts.outHeight;
// 獲取當前手機屏幕的寬高
Display dp = getWindowManager().getDefaultDisplay();
int screenWidth = dp.getWidth();
int screenHeight = dp.getHeight();
// 設置默認縮放比為1
int scale = 1;
// 計算圖片寬高與屏幕寬高比例,即計算寬縮放比,高縮放比
int scaleWidth = imgWidth / screenWidth;
int scaleHeight = imgHeight / screenHeight;
// 選擇縮放比例,如果圖片比屏幕小,就不進行縮放.如果圖片比屏幕大,但是寬高縮放比例不同,選擇縮放比大
if (scaleWidth >= scaleHeight && scaleWidth > 1) {
scale = scaleWidth;
} else if (scaleWidth < scaleHeight && scaleHeight > 1) {
scale = scaleHeight;
}
// 在Options的對象中設置縮放比例
opts.inSampleSize = scale;
// 一定要把inJustDecodeBound該字段設置為false,實際上默認值是false,
// 但是在前面的代碼中已經(jīng)改為了true,所以要更改過來。當然,也可以重新new 一個Option是對象
opts.inJustDecodeBounds = false;
Bitmap bm = BitmapFactory.decodeFile(path, opts);
iv.setImageBitmap(bm);
}
}
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
Android自定義view實現(xiàn)圓形waveview
這篇文章主要為大家詳細介紹了Android自定義view實現(xiàn)圓形waveview,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
詳解OpenGL Shader彩虹條紋效果的實現(xiàn)
這篇文章主要為大家介紹了如何通過OpenGL Shader實現(xiàn)彩虹條紋效果,最后的效果和圖片處理軟件colorow中的彩虹效果濾鏡相似,需要的可以參考一下2022-02-02
android:TextView簡單設置文本樣式和超鏈接的方法
這篇文章主要介紹了android:TextView簡單設置文本樣式和超鏈接的方法,涉及TextView常見文字屬性的相關(guān)操作技巧,需要的朋友可以參考下2016-08-08
Android 軟鍵盤彈出隱藏擠壓界面等各種問題小結(jié)
這篇文章主要介紹了Android 軟鍵盤彈出隱藏擠壓界面等各種問題的相關(guān)知識,本文給大家介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧2016-11-11
Android矢量圖之VectorDrawable類自由填充色彩
這篇文章主要介紹了Android矢量圖之VectorDrawable類自由填充色彩的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05

