Android壓縮圖片並且儲存到本地記憶體卡中
親愛的同學們,相信我們在軟體開發中經常會遇到拍照,選擇相簿上傳的功能。前幾天遇到一個這樣的一個問題。後臺要求我上傳的圖片不能超過500KB,大家知道我們現在的智慧手機畫素越來越高,拍照的照片一般都是幾兆甚至一二十兆。那麼我們改怎麼做呢,答案是一定的,那就是先進行壓縮,然後在儲存壓縮後的圖片上傳。最近在網路上也搜尋到了很多關於壓縮的內容,相信大家會有和我同感,為什麼都寫的不清楚,或許我們可以實現我們的功能,但是這是如何實現的,為什麼呢。下面我就貼出我的程式碼,每一步驟都會有詳細的註釋。希望會幫到大家。
第一,就是壓縮圖片的方法。在我們選擇照片或者拍照之後,將圖片路徑傳入進去就可以進行壓縮,然後返回我們一個Bitmap的物件。註釋的比較清楚,哪裡不明白的可以給我評論留言。
第二、當我們拿到這個Bitmap物件之後,我們就可以進行儲存的操作,因為我們這個畢竟是個物件,我們通常的上傳過程是需要上傳的檔案的。/** * @param path * @return * @throws IOException * 壓縮圖片 */ public static Bitmap revitionImageSize(String path) throws IOException { //根據檔案路徑,建立一個位元組緩衝輸入流 BufferedInputStream in = new BufferedInputStream(new FileInputStream( new File(path))); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; //根據流返回一個位圖也就是bitmap,當options.inJustDecodeBounds = true的時候不需要完全解碼, // 它僅僅會把它的寬,高取回來給你,這樣就不會佔用太多的記憶體,也就不會那麼頻繁的發生OOM了 BitmapFactory.decodeStream(in, null, options); //關閉流 in.close(); int i = 0; Bitmap bitmap = null; while (true) { // options.outWidth >> i 。右移運算子,num >> 1,相當於num除以2 if ((options.outWidth >> i <= 1000) && (options.outHeight >> i <= 1000)) { //得到一個輸入流 in = new BufferedInputStream(new FileInputStream(new File(path))); //為了解決圖片解碼時候出現SanpleSize錯誤,設定恰當的inSampleSize可以使BitmapFactory分配更少的空間以消除該錯誤 //你將 inSampleSize 賦值為2,那就是每隔2行採1行,每隔2列採一列,那你解析出的圖片就是原圖大小的1/4. // Math.pow(2.0D, i)次方運算,2的i次方是多少 options.inSampleSize = (int) Math.pow(2.0D, i); // 這裡之前設定為了true,所以要改為false,否則就建立不出圖片 options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(in, null, options); break; } i += 1; } return bitmap; }
/** * @param bitmap * 儲存圖片到SD卡的方法 */ public void saveBitmapFile(Bitmap bitmap){ //Environment.getExternalStorageDirectory() 獲取Android外部儲存的空間,當有外部SD卡就在外部SD卡上建立。 //沒有外部SD卡就在內部SD卡的非data/data/目錄建立目錄。(data/data/目錄才是真正的記憶體目錄。) //IMAGE_NAME檔案的名字,隨便起。比如(xxx.jpg) File tempFile = new File(Environment.getExternalStorageDirectory(), IMAGE_NAME ); try { //建立一個輸出流,將資料寫入到建立的檔案物件中。 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tempFile)); ////30 是壓縮率,表示壓縮70%; 如果不壓縮是100, bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); /* 為什麼要呼叫flush()方法?當FileOutputStream作為BufferedOutputStream建構函式的引數傳入,然後對BufferedOutputStream進行寫入操作,才能利用緩衝及flush()。 檢視BufferedOutputStream的原始碼,發現所謂的buffer其實就是一個byte[]。 BufferedOutputStream的每一次write其實是將內容寫入byte[],當buffer容量到達上限時,會觸發真正的磁碟寫入。 而另一種觸發磁碟寫入的辦法就是呼叫flush()了。*/ bos.flush(); //關閉流物件 bos.close(); } catch (IOException e) { e.printStackTrace(); } }
最後告訴大家,可以先看看java中的檔案流和位元組流操作,以及Android的Bitmap物件,對理解上述的程式碼會很有幫助。希望能幫助到大家。共同進步,歡迎轉載和留言。一起探討。
關注微信公眾號:
相關推薦
Android壓縮圖片並且儲存到本地記憶體卡中
親愛的同學們,相信我們在軟體開發中經常會遇到拍照,選擇相簿上傳的功能。前幾天遇到一個這樣的一個問題。後臺要求我上傳的圖片不能超過500KB,大家知道我們現在的智慧手機畫素越來越高,拍照
Android實現下載圖片並儲存到SD卡中
在檔案裡設定一個點選方法已進行點選下載: download.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String
Android呼叫相機拍照,壓縮圖片後儲存SD卡中
最近在搞一個專案,需求是呼叫系統相機拍完照片後儲存本地,再上傳至後臺伺服器,但為了節省流量需要壓縮上傳,將圖片壓縮至100K以內。這個是在特定機器上執行,類似於手持POS機,但是它的相機幾乎沒有優化,對焦慢,而且拍照也不清晰,使用自己的手機呼叫系統相機拍照後圖片
Android ImageUtils 圖片工具類,包括:小米從相簿調影象空指標,三星旋轉照片,壓縮圖片,儲存Bitmap到本地,獲取本地視訊的縮圖,毛化玻璃效果,程式碼以後會更新
package com.snyj.wsd.kangaibang.utils; import android.content.ContentResolver; import android.content.Context; import android.data
android 壓縮圖片壓縮到100K以下,並且寬高不超過1028
在android開發中,經常遇到圖片壓縮問題,由此記錄下以下壓縮方法。 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import and
Xamarin.Android 壓縮圖片並上傳到WebServices
越來越大 () exists jpeg color 文件寫入 data pen map 隨著手機的拍照像素越來越高,導致圖片贊的容量越來越大,如果上傳多張圖片不進行壓縮、質量處理很容易出現OOM內存泄漏問題。 最近做了一個項目,向webservices上傳多張照片,
android -------- 壓縮圖片檔案工具類
專案中常常遇到檔案壓縮問題,上傳檔案大小限制 今天簡單的分享一點乾貨,檔案壓縮,圖片壓縮,壓縮Bitmap 主要通過尺寸壓縮和質量壓縮,以達到清晰度最優 效果圖 原始碼地址: 
android 以追加形式寫檔案並把檔案儲存到SD卡中
android手機記憶體本來就不大,要是老把資料放在手機裡,很明顯會讓手機的使用者體驗到什麼是“卡”,所以,我們把資料要放到SD卡中,以減少手機記憶體的使用,本文僅寫入檔案,不對讀檔案進行說明。好,go! 第一步:新建android專案,命名為Test next ->
Python下載圖片並儲存本地的兩種方式
一:使用Python中的urllib類中的urlretrieve()函式,直接從網上下載資源到本地,具體程式碼:import os,stat import urllib.request img_url="https://timgsa.baidu.com/timg?imag
Android壓縮圖片到100K以下並保持不失真的高效方法
在開發Android企業應用時,會經常上傳圖片到伺服器,而我們公司目前維護的一個專案便是如此。該專案是通過私有apn與伺服器進行互動的,聯通的還好,但移動的速度實在太慢,客戶在使用軟體的過程中,由於上傳的資訊中可能包含多張圖片,會經常出現上傳圖片失敗的問題,為了解決這個
Android Bitmap圖片處理,防止記憶體溢位
在android 中載入一張圖片,如果圖片過大就有可能會出現記憶體溢位,特別是在載入資料過多的時候,像ListView 和GridView等重複列表中,因此在處理Android圖片防止記憶體溢位就顯得特別的重要,也是很多面試中經常問到的問題,面試官通常都會讓你談
IOS 播放本地音樂(播放記憶體卡中的MP3) 及 檔案的寫入
在IOS開發中, 每一個應用程式都擁有一個Documents的資料夾來存放自己的檔案。 在這裡為了測試, 我們首先得把mp3檔案匯入到專案中。 然後讀出資源裡的mp3檔案,寫入到documents中, 然後再從documents中讀取該mp3檔案來播放。 (在實際當中也許我
將資料儲存到記憶體卡
實驗程式碼: package com.example.test1102; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStrea
android 壓縮圖片
將任意一張圖片壓縮成100*100的縮圖,並在ImageView上展示。 Bitmap bitmap = PicTool.decodeBitmapFromFile(tempFile.toString(),100,100); imageview.setImageBitmap
轉載 利用WWW類獲取圖片並且在unityUGUI的Image中顯示
https://www.cnblogs.com/chiwang/p/7665938.html using UnityEngine; using System.Collections; using UnityEngine.UI; public class GetSprite : Mon
Android網路URL圖片地址轉Bitmap並且儲存到本地
一、網路URL圖片地址轉Bitmap public Bitmap getBitmap(String imgUrl) { InputStream inputStream=null;
Android開發 點選在本地選擇換圖片(頭像)並且儲存,例項總結。
類似於QQ、微信頭像。 廢話不多說 ,直接上程式碼 import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.I
Android下載網路圖片並儲存在本地相簿中
package com.thfund.bigtree.StarCounselor.activity; import android.content.Context; import android.content.Intent; import android.grap
Android 開發圖片儲存在本地
/** * 圖片儲存到本地 方法2 * * @param bitmap */ public static void compressImagetwo(Bitmap bitmap) { try {
android webview 載入本地html並且解決多圖卡頓問題
使用webview載入本地html,因為本地html使用多張圖片,滑動起來卡頓,解決方法如下: 把資料夾放入assets資料夾下 Activity載入: WebView wView = (